2012-02-18 22 views
2

我为VHDL制作了一个正弦LUT,使用了256个元素。我使用MIDI输入,所以值范围8.17Hz(注#0)至12543.85z(注#127)。正弦LUT VHDL不会在800赫兹以下模拟

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

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

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

当我得到这个索引,I除以100它,并调用sineLUT[index]得到那个我需要生成在所需频率上的正弦波的值。

问题是,只有最后51个笔记似乎适用于我,我不知道为什么。它似乎在低于该频率(< 650 hz)的任何事情上都停留在不变的音符上,并且每次我尝试降低音符时都只是减小音量。

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

回答

3

只是猜测,我怀疑你的step_counter没有经历足够的周期,所以你的索引(进入正弦lut)没有经过360度的低频。

对于任何更有用的东西,您可能需要发布代码。

另外,为什么不使用更像传统DDS的东西? Analog Devices在基础知识方面有很好的说明:DDS Tutorial

+0

啊是的,我从来没有想过这件事。这对于为什么它在较低的频率处变得更安静是有意义的,它只是从取样的正弦波读取较小的值。我忘了我的代码每20毫秒发出一次重置以同步一些i2c和音频编解码器问题。 谢谢。 – Eric 2012-02-20 06:59:13