正弦 LUT VHDL 无法模拟低于 800 Hz 的频率
我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只是猜测,我怀疑您的 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