我在做主动噪声控制的一个程序,用的是LMS的算法,可是一开始就有一个很奇怪的问题出现了:
void sinewave()
{
Int16 i=0;
float a=0.01;
for (i=0; i<size;i++)
{
xs[i]=23405*sin(2*3.14*a*i);
}
}
for (n=M; n<=size; n++)
{
//把数据存在Buffer里
for(k=n; k>=n-M+1; k–)
{
Buffer1[n-k]=g[k];
Buffer2[n-k]=(float)xs[k];
}
声音模块AIC23里我把扫描频率设置成8kHz,这样产生的正弦信号就是80Hz了,但是经过for循环之后,输出的正弦信号xs在示波器上显示的是60Hz左右的频率,这里并没有针对正弦信号xs的计算,为什么频率会变了呢?有人知道吗?
我也试过了,不经过这个for循环,直接输出这个正弦信号是我本来设定的80Hz没问题。之后我还有一些别的运算,用到了这里的Buffer1和Buffer2,频率会继续变化,最后便到了20Hz左右,这是为什么呢??
Denny%20Yang99373:
不知道与优化选项有没有关系,可以先把优化选项关掉,通过CCS JTAG单步调试分析一下。
Lee Johnny:
回复 Denny%20Yang99373:
刚试过了,关了优化,跟之前一样频率会变。
Lee Johnny:
回复 Denny%20Yang99373:
我朋友告诉我这好像是因为每次最外面的大循环都要经过M次内部的Buffer赋值循环,这占用了太多的扫描时间,而且每次占用的时间都相同,就导致了频率变小,感觉这理由很有道理。
那现在的问题就是如何避免这个问题呢,我把数据存在Buffer里面之后要用来做LMS的计算,之后我用示波器测过了,频率会继续变小,你有什么建议吗?