ikemada 发表于 2014-7-26 11:37:22

MSP430 FFT遇到的问题

先用 AD600HZ采样100HZ正弦波,得到128个值,没有问题;

查了很多FFT的算法,也看懂了,但是算出来的值还是不对!
求高手们帮忙,看看哪里出了问题:~

//我的FFT ,已经倒位序完成。AD量给到Fft_Real【128】中
void FFT(void)
{
int NN=7; //这里因为128是2的7次方,如果是计算256点,则是2的8次方,N就是8,如果是512点则N=9,如此类推


unsigned int NUM_FFT=128; //这里要算多少点的fft就赋值多少,值只能是2的N次方
    for( i=1; i<=NN; i++)             /* for(1) */
    {
      b=1;
      b <<=(i-1);               //蝶式运算,用于计算 隔多少行计算。例如第一级 1和2行计算,,,第二级
      for( j=0; j<=b-1; j++)       /* for (2) */
      {
            p=1;
            p <<= (NN-i);
            p = p*j;
            for( k2=j; k2<NUM_FFT; k2=k2+2*b)   /* for (3) 基二fft */
            {
                Temp_Real = Fft_Real; Temp_Imag = Fft_Image; temp = Fft_Real;
                Fft_Real = Fft_Real + ((Fft_Real*COS_TAB)>>7) + ((Fft_Image*SIN_TAB)>>7);
                Fft_Image = Fft_Image - ((Fft_Real*SIN_TAB)>>7) + ((Fft_Image*COS_TAB)>>7);
                Fft_Real = Temp_Real - ((Fft_Real*COS_TAB)>>7) - ((Fft_Image*SIN_TAB)>>7);
                Fft_Image = Temp_Imag + ((temp*SIN_TAB)>>7) - ((Fft_Image*COS_TAB)>>7);
//                //移位,防止溢出。结果已经是本值的1/64
            Fft_Real >>= 1;
                Fft_Image >>= 1;
               Fft_Real>>= 1;
                Fft_Image>>= 1;
            }
      }
    }
   }


还有一个问题,计算模值:
for(n=1;n<128;n++)
        {
                //Fft_Real=conventionsignal()
                if(Fft_Real<0) Fft_Real = -Fft_Real;
                if(Fft_Image<0) Fft_Image = -Fft_Image;
                result=sqrt((Fft_Real*Fft_Real)+(Fft_Image*Fft_Image));
        }
我在FFT之后计算各频率模制,这里要不要都取正?

ikemada 发表于 2014-7-26 11:39:58

附图给出FFT后实部和虚部的值,不知道哪里不对?

charlesg 发表于 2014-7-26 11:49:18

本帖最后由 charlesg 于 2014-7-26 11:52 编辑

建议楼主传一个频域的图,我们可以看看你的fft结果和理想值的差异

计算模值不要取正,因为如果是负值,你取正再和原来乘,又变成负的了。要的是一个正的,就是平方效果就好

ikemada 发表于 2014-7-26 12:52:29

本帖最后由 ikemada 于 2014-7-26 12:56 编辑

charlesg 发表于 2014-7-26 11:49
建议楼主传一个频域的图,我们可以看看你的fft结果和理想值的差异

计算模值不要取正,因为如果是负值,你 ...

谢谢!麻烦啦~
RESULT没有开方,就是 实部^2+虚部^2;
表示完全看不到频率响应啊。。。 AD的数据倒很清楚 0 0

charlesg 发表于 2014-7-26 15:03:08

ikemada 发表于 2014-7-26 12:52
谢谢!麻烦啦~
RESULT没有开方,就是 实部^2+虚部^2;
表示完全看不到频率响应啊。。。 AD的数据倒很清楚 ...

还没求log,result怎么会出现负值?。。。

ikemada 发表于 2014-7-26 16:42:24

charlesg 发表于 2014-7-26 15:03
还没求log,result怎么会出现负值?。。。

我是这么写的
for(n=1;n<128;n++)
{
result=((Fft_Real*Fft_Real)+(Fft_Image*Fft_Image));
}

yulee 发表于 2014-8-4 21:08:34

result...这么算,不应该是负的啊

谦虚的行者 发表于 2015-7-14 23:39:21

楼主解决问题了吗
页: [1]
查看完整版本: MSP430 FFT遇到的问题