今天在一个博士师兄的帮助下,终于把DSP调用FFT的程序调通了!舒服啊!
原先在5402中写入以下程序:
cbrev(x,x,NX/2); rfft(x,1024,1);
//计算fft功率谱
xh[0]=abs(x[0]); j=1;
for(i=2;i
{
xh[j]=sqrt(x[i]*x[i]+x[i+1]*x[i+1]); j++; }
不管怎么修改,输出的功率谱都不正确!
曾经怀疑过cbrev这个bit反转程序,还自己用C语言编写过C-CODE的bit反位程序,调试了一个星期,始终没有能解决问题。
今天师兄来终于帮我们解决了,原来在定点DSP中,数组元素不能直接相乘的!
如果要计算功率谱,只需要进行如下修改就可以了
xh[j]=sqrt(pow(x[i],s)+pow(x[i+1],2));
或者说使用一个变量做缓存,注意这里的temp1,temp2要定义成long型,以防止溢出!
xh[0]=abs(x[0]); j=1;
for(i=2;i
{
temp1=x[i];
temp2=x[i+1];
xh[j]=sqrt(temp1*temp1+temp2*temp2); j++; }
总结:在调试DSP程序时,要学会使用并养成习惯使用各种调试手段,要习惯设置断点,在遇到困境时,要退一步,使用简单的数据进行测试,以找出问题的所在,同时,定点DSP的溢出问题是很多程序调试问题的根源,要特别关注。
其实在这次的调试中,师兄也不是一开始就知道这个原因(因为师兄都是做6000系列的),而且到现在为止也不完全明白其中的缘由,但师兄通过正确的调试方法,确认了cbrev和rfft都是正确的,那么问题就只可能出现在功率普的计算上,由此通过尝试,而找到了正确的解决方法!