我使用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赫兹)的任何东西上都被卡在一个恒定音符上,并且每次我试图降低音符时音量都会减小。
如果您需要部分代码,请与我们联系。
答案 0 :(得分:3)
只是猜测,我怀疑你的step_counter没有经历足够的周期,所以你的索引(进入正弦波)对于较低的频率不会经历完整的360度。
如果您有任何帮助,可能需要发布代码。
顺便说一句,为什么你不使用更像传统DDS的东西? ADI公司对基础知识进行了很好的描述:DDS Tutorial