正弦 LUT VHDL 无法模拟低于 800 Hz 的频率

发布于 2025-01-07 02:53:04 字数 605 浏览 0 评论 0原文

我使用 256 个元素为 VHDL 制作了一个正弦 LUT。

我使用 MIDI 输入,因此值范围为 8.17Hz(注释#0)到 12543.85z(注释#127)。

我有另一个 LUT,用于计算必须发送多少值到 48 kHz 编解码器才能播放声音(8.17Hz 频率将需要 48000/8.17 = 5870 值)。

我有另一个包含索引因子的 LUT,它是 256/num_Values,用于调用 sin 表中的值(例如:100*256/5870 = 4 (整数舍入))。

我将此索引因子发送到另一个 VHDL 文件,该文件用于计算应发回哪个值。 (例如:index = index_factor*step_counter

当我得到这个索引时,我将它除以100,然后调用sineLUT[index]来获取我需要生成的值所需频率的正弦波。

问题是,似乎只有最后 51 个音符对我有用,我不知道为什么。在任何低于该频率(<650赫兹)的情况下,它似乎都会卡在一个恒定的音符上,并且每次我尝试降低音符时音量都会减小。

如果您需要我的部分代码,请告诉我。

I made a sine LUT for VHDL, using 256 elements.

Im using MIDI input, so values range 8.17Hz (note #0) to 12543.85z (note #127).

I have another LUT that calculates how many value must be sent to my 48 kHz codec in order to play the sound (the 8.17Hz frequency will need 48000/8.17 = 5870 values).

I have another LUT that contains an index factor, which is 256/num_Values, which is used to call values from the sin table (ex: 100*256/5870 = 4 (with integer rounding)).

I send this index factor to another VHDL file, which is used to calculate which value should be sent back. (ex: index = index_factor*step_counter)

When I get this index, I divide it by 100, and call sineLUT[index] to get the value that I need to generate a sine wave at the desired frequency.

The problem is, only the last 51 notes seem to work for me, and I do not know why. It seems to get stuck on a constant note at anything below that frequency (<650 hz) , and just decrease in volume every time I try to lower the note.

If you need parts of my code, let me know.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

-柠檬树下少年和吉他 2025-01-14 02:53:04

只是猜测,我怀疑您的 step_counter 没有经历足够的周期,因此您的索引(进入正弦 lut)对于较低频率不会经历完整的 360 度。

对于任何更有帮助的事情,您可能需要发布代码。

顺便说一句,您为什么不使用更像传统 DDS 的东西呢? Analog Devices 在基础知识方面有一篇很好的文章:DDS教程

Just guessing, I suspect your step_counter isn't going through enough cycles, so your index (into the sine lut) doesn't go through a full 360 degrees for the lower frequencies.

For anything more helpful, you'll probably have to post code.

As an aside, why aren't you using something more like a conventional DDS? Analog Devices has a nice write-up on the basics: DDS Tutorial

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文