过去几周我一直致力于合成器项目,实施一套基于C的数控振荡器,将其输出馈送到FPGA上的DAC。
我尝试的一件事是使用查找表来更有效地确定给定音调的正弦值。例如,请考虑以下代码:
PhaseArray[NOTE1-1][idx] = ((PhaseArray[NOTE1-1][!idx] + SigmaArray[NOTE1-1]) % (MODULO_CONST) );
....
PhaseDivArray[NOTE1-1][idx] = PhaseArray[NOTE1-1][idx] >> 10;
....
audio = ((iNoteOn[NOTE1-1]) * (SINE_TABLE[PhaseDivArray[NOTE1-1][idx]])) +
....
现在这让我感到困惑。我有相当数量的相位累加器同时运行而没有问题。当我不打扰正弦查找并使用有效的方波信号时,我可以得到十几个音符来正确播放。
但是第二次我开始使用我已定义的SINE_TABLE [1024]查找(这是一个static
表,其中包含正弦曲线的无符号16位整数值),减速立即到达相同点微控制器努力以正确的速度产生3个音调以进行缓冲播放。
是什么导致查找表效率低下?是否与在内存中定义表的方式有关?