我使用 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赫兹)的任何情况下,它似乎都会卡在一个恒定的音符上,并且每次我尝试降低音符时音量都会减小。
如果您需要我的部分代码,请告诉我。
最佳答案
只是猜测,我怀疑您的 step_counter 没有经历足够的周期,因此您的索引(进入正弦 lut)对于较低频率不会经历完整的 360 度。
为了获得更多帮助,您可能需要发布代码。
顺便说一句,您为什么不使用更像传统 DDS 的东西呢? Analog Devices 有一篇关于基础知识的精彩文章:DDS Tutorial
关于midi - 正弦 LUT VHDL 无法模拟低于 800 Hz 的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345053/