【例程】MSP430 FFT算法

来源:互联网 发布:中国国家网络安全局 编辑:程序博客网 时间:2024/06/06 00:42
#include<msp430x16x.h>#include<math.h>#include "fft.h"extern COMPLEX *Data;extern int max[5];//正弦 复数表const COMPLEX WN[512]={{1 , 0},{1 , 0.0061},{0.9999 , 0.0123},{0.9998 , 0.0184},{0.9997 , 0.0245},{0.9995 , 0.0307},{0.9993 , 0.0368},{0.9991 , 0.0429},{0.9988 , 0.0491},{0.9985 , 0.0552},{0.9981 , 0.0613},{0.9977 , 0.0674},{0.9973 , 0.0736},{0.9968 , 0.0797},{0.9963 , 0.0858},{0.9958 , 0.0919},{0.9952 , 0.098},{0.9946 , 0.1041},{0.9939 , 0.1102},{0.9932 , 0.1163},{0.9925 , 0.1224},{0.9917 , 0.1285},{0.9909 , 0.1346},{0.9901 , 0.1407},{0.9892 , 0.1467},{0.9883 , 0.1528},{0.9873 , 0.1589},{0.9863 , 0.1649},{0.9853 , 0.171},{0.9842 , 0.177},{0.9831 , 0.183},{0.982 , 0.1891},{0.9808 , 0.1951},{0.9796 , 0.2011},{0.9783 , 0.2071},{0.977 , 0.2131},{0.9757 , 0.2191},{0.9743 , 0.2251},{0.9729 , 0.2311},{0.9715 , 0.237},{0.97 , 0.243},{0.9685 , 0.2489},{0.967 , 0.2549},{0.9654 , 0.2608},{0.9638 , 0.2667},{0.9621 , 0.2726},{0.9604 , 0.2785},{0.9587 , 0.2844},{0.9569 , 0.2903},{0.9551 , 0.2962},{0.9533 , 0.302},{0.9514 , 0.3078},{0.9495 , 0.3137},{0.9476 , 0.3195},{0.9456 , 0.3253},{0.9436 , 0.3311},{0.9415 , 0.3369},{0.9395 , 0.3427},{0.9373 , 0.3484},{0.9352 , 0.3542},{0.933 , 0.3599},{0.9308 , 0.3656},{0.9285 , 0.3713},{0.9262 , 0.377},{0.9239 , 0.3827},{0.9215 , 0.3883},{0.9191 , 0.394},{0.9167 , 0.3996},{0.9142 , 0.4052},{0.9117 , 0.4108},{0.9092 , 0.4164},{0.9066 , 0.422},{0.904 , 0.4276},{0.9013 , 0.4331},{0.8987 , 0.4386},{0.896 , 0.4441},{0.8932 , 0.4496},{0.8904 , 0.4551},{0.8876 , 0.4605},{0.8848 , 0.466},{0.8819 , 0.4714},{0.879 , 0.4768},{0.8761 , 0.4822},{0.8731 , 0.4876},{0.8701 , 0.4929},{0.867 , 0.4982},{0.864 , 0.5035},{0.8609 , 0.5088},{0.8577 , 0.5141},{0.8546 , 0.5194},{0.8514 , 0.5246},{0.8481 , 0.5298},{0.8449 , 0.535},{0.8416 , 0.5402},{0.8382 , 0.5453},{0.8349 , 0.5505},{0.8315 , 0.5556},{0.828 , 0.5607},{0.8246 , 0.5657},{0.8211 , 0.5708},{0.8176 , 0.5758},{0.814 , 0.5808},{0.8105 , 0.5858},{0.8068 , 0.5908},{0.8032 , 0.5957},{0.7995 , 0.6006},{0.7958 , 0.6055},{0.7921 , 0.6104},{0.7883 , 0.6152},{0.7846 , 0.6201},{0.7807 , 0.6249},{0.7769 , 0.6296},{0.773 , 0.6344},{0.7691 , 0.6391},{0.7652 , 0.6438},{0.7612 , 0.6485},{0.7572 , 0.6532},{0.7532 , 0.6578},{0.7491 , 0.6624},{0.7451 , 0.667},{0.741 , 0.6716},{0.7368 , 0.6761},{0.7327 , 0.6806},{0.7285 , 0.6851},{0.7242 , 0.6895},{0.72 , 0.694},{0.7157 , 0.6984},{0.7114 , 0.7028},{0.7071 , 0.7071},{0.7028 , 0.7114},{0.6984 , 0.7157},{0.694 , 0.72},{0.6895 , 0.7242},{0.6851 , 0.7285},{0.6806 , 0.7327},{0.6761 , 0.7368},{0.6716 , 0.741},{0.667 , 0.7451},{0.6624 , 0.7491},{0.6578 , 0.7532},{0.6532 , 0.7572},{0.6485 , 0.7612},{0.6438 , 0.7652},{0.6391 , 0.7691},{0.6344 , 0.773},{0.6296 , 0.7769},{0.6249 , 0.7807},{0.6201 , 0.7846},{0.6152 , 0.7883},{0.6104 , 0.7921},{0.6055 , 0.7958},{0.6006 , 0.7995},{0.5957 , 0.8032},{0.5908 , 0.8068},{0.5858 , 0.8105},{0.5808 , 0.814},{0.5758 , 0.8176},{0.5708 , 0.8211},{0.5657 , 0.8246},{0.5607 , 0.828},{0.5556 , 0.8315},{0.5505 , 0.8349},{0.5453 , 0.8382},{0.5402 , 0.8416},{0.535 , 0.8449},{0.5298 , 0.8481},{0.5246 , 0.8514},{0.5194 , 0.8546},{0.5141 , 0.8577},{0.5088 , 0.8609},{0.5035 , 0.864},{0.4982 , 0.867},{0.4929 , 0.8701},{0.4876 , 0.8731},{0.4822 , 0.8761},{0.4768 , 0.879},{0.4714 , 0.8819},{0.466 , 0.8848},{0.4605 , 0.8876},{0.4551 , 0.8904},{0.4496 , 0.8932},{0.4441 , 0.896},{0.4386 , 0.8987},{0.4331 , 0.9013},{0.4276 , 0.904},{0.422 , 0.9066},{0.4164 , 0.9092},{0.4108 , 0.9117},{0.4052 , 0.9142},{0.3996 , 0.9167},{0.394 , 0.9191},{0.3883 , 0.9215},{0.3827 , 0.9239},{0.377 , 0.9262},{0.3713 , 0.9285},{0.3656 , 0.9308},{0.3599 , 0.933},{0.3542 , 0.9352},{0.3484 , 0.9373},{0.3427 , 0.9395},{0.3369 , 0.9415},{0.3311 , 0.9436},{0.3253 , 0.9456},{0.3195 , 0.9476},{0.3137 , 0.9495},{0.3078 , 0.9514},{0.302 , 0.9533},{0.2962 , 0.9551},{0.2903 , 0.9569},{0.2844 , 0.9587},{0.2785 , 0.9604},{0.2726 , 0.9621},{0.2667 , 0.9638},{0.2608 , 0.9654},{0.2549 , 0.967},{0.2489 , 0.9685},{0.243 , 0.97},{0.237 , 0.9715},{0.2311 , 0.9729},{0.2251 , 0.9743},{0.2191 , 0.9757},{0.2131 , 0.977},{0.2071 , 0.9783},{0.2011 , 0.9796},{0.1951 , 0.9808},{0.1891 , 0.982},{0.183 , 0.9831},{0.177 , 0.9842},{0.171 , 0.9853},{0.1649 , 0.9863},{0.1589 , 0.9873},{0.1528 , 0.9883},{0.1467 , 0.9892},{0.1407 , 0.9901},{0.1346 , 0.9909},{0.1285 , 0.9917},{0.1224 , 0.9925},{0.1163 , 0.9932},{0.1102 , 0.9939},{0.1041 , 0.9946},{0.098 , 0.9952},{0.0919 , 0.9958},{0.0858 , 0.9963},{0.0797 , 0.9968},{0.0736 , 0.9973},{0.0674 , 0.9977},{0.0613 , 0.9981},{0.0552 , 0.9985},{0.0491 , 0.9988},{0.0429 , 0.9991},{0.0368 , 0.9993},{0.0307 , 0.9995},{0.0245 , 0.9997},{0.0184 , 0.9998},{0.0123 , 0.9999},{0.0061 , 1},{0 , 1},{-0.0061 , 1},{-0.0123 , 0.9999},{-0.0184 , 0.9998},{-0.0245 , 0.9997},{-0.0307 , 0.9995},{-0.0368 , 0.9993},{-0.0429 , 0.9991},{-0.0491 , 0.9988},{-0.0552 , 0.9985},{-0.0613 , 0.9981},{-0.0674 , 0.9977},{-0.0736 , 0.9973},{-0.0797 , 0.9968},{-0.0858 , 0.9963},{-0.0919 , 0.9958},{-0.098 , 0.9952},{-0.1041 , 0.9946},{-0.1102 , 0.9939},{-0.1163 , 0.9932},{-0.1224 , 0.9925},{-0.1285 , 0.9917},{-0.1346 , 0.9909},{-0.1407 , 0.9901},{-0.1467 , 0.9892},{-0.1528 , 0.9883},{-0.1589 , 0.9873},{-0.1649 , 0.9863},{-0.171 , 0.9853},{-0.177 , 0.9842},{-0.183 , 0.9831},{-0.1891 , 0.982},{-0.1951 , 0.9808},{-0.2011 , 0.9796},{-0.2071 , 0.9783},{-0.2131 , 0.977},{-0.2191 , 0.9757},{-0.2251 , 0.9743},{-0.2311 , 0.9729},{-0.237 , 0.9715},{-0.243 , 0.97},{-0.2489 , 0.9685},{-0.2549 , 0.967},{-0.2608 , 0.9654},{-0.2667 , 0.9638},{-0.2726 , 0.9621},{-0.2785 , 0.9604},{-0.2844 , 0.9587},{-0.2903 , 0.9569},{-0.2962 , 0.9551},{-0.302 , 0.9533},{-0.3078 , 0.9514},{-0.3137 , 0.9495},{-0.3195 , 0.9476},{-0.3253 , 0.9456},{-0.3311 , 0.9436},{-0.3369 , 0.9415},{-0.3427 , 0.9395},{-0.3484 , 0.9373},{-0.3542 , 0.9352},{-0.3599 , 0.933},{-0.3656 , 0.9308},{-0.3713 , 0.9285},{-0.377 , 0.9262},{-0.3827 , 0.9239},{-0.3883 , 0.9215},{-0.394 , 0.9191},{-0.3996 , 0.9167},{-0.4052 , 0.9142},{-0.4108 , 0.9117},{-0.4164 , 0.9092},{-0.422 , 0.9066},{-0.4276 , 0.904},{-0.4331 , 0.9013},{-0.4386 , 0.8987},{-0.4441 , 0.896},{-0.4496 , 0.8932},{-0.4551 , 0.8904},{-0.4605 , 0.8876},{-0.466 , 0.8848},{-0.4714 , 0.8819},{-0.4768 , 0.879},{-0.4822 , 0.8761},{-0.4876 , 0.8731},{-0.4929 , 0.8701},{-0.4982 , 0.867},{-0.5035 , 0.864},{-0.5088 , 0.8609},{-0.5141 , 0.8577},{-0.5194 , 0.8546},{-0.5246 , 0.8514},{-0.5298 , 0.8481},{-0.535 , 0.8449},{-0.5402 , 0.8416},{-0.5453 , 0.8382},{-0.5505 , 0.8349},{-0.5556 , 0.8315},{-0.5607 , 0.828},{-0.5657 , 0.8246},{-0.5708 , 0.8211},{-0.5758 , 0.8176},{-0.5808 , 0.814},{-0.5858 , 0.8105},{-0.5908 , 0.8068},{-0.5957 , 0.8032},{-0.6006 , 0.7995},{-0.6055 , 0.7958},{-0.6104 , 0.7921},{-0.6152 , 0.7883},{-0.6201 , 0.7846},{-0.6249 , 0.7807},{-0.6296 , 0.7769},{-0.6344 , 0.773},{-0.6391 , 0.7691},{-0.6438 , 0.7652},{-0.6485 , 0.7612},{-0.6532 , 0.7572},{-0.6578 , 0.7532},{-0.6624 , 0.7491},{-0.667 , 0.7451},{-0.6716 , 0.741},{-0.6761 , 0.7368},{-0.6806 , 0.7327},{-0.6851 , 0.7285},{-0.6895 , 0.7242},{-0.694 , 0.72},{-0.6984 , 0.7157},{-0.7028 , 0.7114},{-0.7071 , 0.7071},{-0.7114 , 0.7028},{-0.7157 , 0.6984},{-0.72 , 0.694},{-0.7242 , 0.6895},{-0.7285 , 0.6851},{-0.7327 , 0.6806},{-0.7368 , 0.6761},{-0.741 , 0.6716},{-0.7451 , 0.667},{-0.7491 , 0.6624},{-0.7532 , 0.6578},{-0.7572 , 0.6532},{-0.7612 , 0.6485},{-0.7652 , 0.6438},{-0.7691 , 0.6391},{-0.773 , 0.6344},{-0.7769 , 0.6296},{-0.7807 , 0.6249},{-0.7846 , 0.6201},{-0.7883 , 0.6152},{-0.7921 , 0.6104},{-0.7958 , 0.6055},{-0.7995 , 0.6006},{-0.8032 , 0.5957},{-0.8068 , 0.5908},{-0.8105 , 0.5858},{-0.814 , 0.5808},{-0.8176 , 0.5758},{-0.8211 , 0.5708},{-0.8246 , 0.5657},{-0.828 , 0.5607},{-0.8315 , 0.5556},{-0.8349 , 0.5505},{-0.8382 , 0.5453},{-0.8416 , 0.5402},{-0.8449 , 0.535},{-0.8481 , 0.5298},{-0.8514 , 0.5246},{-0.8546 , 0.5194},{-0.8577 , 0.5141},{-0.8609 , 0.5088},{-0.864 , 0.5035},{-0.867 , 0.4982},{-0.8701 , 0.4929},{-0.8731 , 0.4876},{-0.8761 , 0.4822},{-0.879 , 0.4768},{-0.8819 , 0.4714},{-0.8848 , 0.466},{-0.8876 , 0.4605},{-0.8904 , 0.4551},{-0.8932 , 0.4496},{-0.896 , 0.4441},{-0.8987 , 0.4386},{-0.9013 , 0.4331},{-0.904 , 0.4276},{-0.9066 , 0.422},{-0.9092 , 0.4164},{-0.9117 , 0.4108},{-0.9142 , 0.4052},{-0.9167 , 0.3996},{-0.9191 , 0.394},{-0.9215 , 0.3883},{-0.9239 , 0.3827},{-0.9262 , 0.377},{-0.9285 , 0.3713},{-0.9308 , 0.3656},{-0.933 , 0.3599},{-0.9352 , 0.3542},{-0.9373 , 0.3484},{-0.9395 , 0.3427},{-0.9415 , 0.3369},{-0.9436 , 0.3311},{-0.9456 , 0.3253},{-0.9476 , 0.3195},{-0.9495 , 0.3137},{-0.9514 , 0.3078},{-0.9533 , 0.302},{-0.9551 , 0.2962},{-0.9569 , 0.2903},{-0.9587 , 0.2844},{-0.9604 , 0.2785},{-0.9621 , 0.2726},{-0.9638 , 0.2667},{-0.9654 , 0.2608},{-0.967 , 0.2549},{-0.9685 , 0.2489},{-0.97 , 0.243},{-0.9715 , 0.237},{-0.9729 , 0.2311},{-0.9743 , 0.2251},{-0.9757 , 0.2191},{-0.977 , 0.2131},{-0.9783 , 0.2071},{-0.9796 , 0.2011},{-0.9808 , 0.1951},{-0.982 , 0.1891},{-0.9831 , 0.183},{-0.9842 , 0.177},{-0.9853 , 0.171},{-0.9863 , 0.1649},{-0.9873 , 0.1589},{-0.9883 , 0.1528},{-0.9892 , 0.1467},{-0.9901 , 0.1407},{-0.9909 , 0.1346},{-0.9917 , 0.1285},{-0.9925 , 0.1224},{-0.9932 , 0.1163},{-0.9939 , 0.1102},{-0.9946 , 0.1041},{-0.9952 , 0.098},{-0.9958 , 0.0919},{-0.9963 , 0.0858},{-0.9968 , 0.0797},{-0.9973 , 0.0736},{-0.9977 , 0.0674},{-0.9981 , 0.0613},{-0.9985 , 0.0552},{-0.9988 , 0.0491},{-0.9991 , 0.0429},{-0.9993 , 0.0368},{-0.9995 , 0.0307},{-0.9997 , 0.0245},{-0.9998 , 0.0184},{-0.9999 , 0.0123},{-1 , 0.0061}};//////////////////////////////////FFT算法源代码//////////////////////////////////*******************************************************************************函数名称:muliply功    能:实现复数相乘参    数:a,b 指向复数结构体型变量返回值  :result 复数*******************************************************************************/COMPLEX multiply(COMPLEX *a,COMPLEX *b){  COMPLEX result;  double temp1;  double temp2;  temp1=a->real*(b->real);  //实乘实  temp2=a->image*(b->image);//虚乘虚  result.real=temp1-temp2;  temp1=a->real*(b->image);  //实乘虚  temp2=a->image*(b->real);//虚乘实  result.image=temp1+temp2;  return result;}/*******************************************************************************函数名称:Butterfly功    能:实现蝶形相乘,a=a+WN[p]*b,b=a-WN[p]*b参    数:a,b,待运算的结构体的指针          p,旋转因子返回值  :无    (进行原位计算,不需要返回)*******************************************************************************/void Butterfly(COMPLEX* a,COMPLEX* b,int P){  COMPLEX W;  W.real=WN[P].real;        //从Flash中调入旋转因子WN[P]  W.image=WN[P].image;  COMPLEX temp;                //temp=b*WN[p]    temp=multiply(b,&W);        b->real=a->real-temp.real;       //b=b-temp  b->image=a->image-temp.image;  a->real=a->real+temp.real;       //a=a+temp  a->image=a->image+temp.image;}/*******************************************************************************函数名称:FFT功    能:快速FFT算法,1024点参    数:无      (通过全局量实现,计算后的值写入原处)返回值  :无*******************************************************************************/void FFT(void){  int M=10;      //最大层数10  int NN=1024;   //FFT点数  int L=1;     //指示当前层数  int B;       //参与蝶形运算两点之间间隔  int J;       //蝶形运算个数  int P;       //旋转因子的指数  int K;       //  int temp;  while(L<M+1)  {    if(L==1)                //计算B=2^(L-1);      B=1;    else      B=0x0001<<(L-1);    J=0;    while(J<B)    {      if((M-L)==0)          //计算P=J*2^(M-L);        temp=1;      else        temp=0x0001<<(M-L);      P=J*temp;      K=J;      while(K<NN)      {        Butterfly(&Data[K],&Data[K+B],P);        temp=0x0001<<L;        K=K+temp;      }      J=J+1;    }    L=L+1;  }}/*******************************************************************************函数名称:reverse功    能:求蝶形运算所需要的倒序参    数:n,顺序排列的下标号返回值  :输入序号的倒序*******************************************************************************/int reverse(int n){  int rev=0x0000;            //初始为全零  int temp1=0x0001;          //从最右端开始  int temp2=0x0200;          //从最左端赋值  char i=0;  while(i<10)  {    if(n&temp1)               //某位为1,则对应位也为1      rev|=temp2;    temp1=temp1<<1;    temp2=temp2>>1;    i++;  }  return rev;}/*******************************************************************************函数名称:abs功    能:求复数模值平方,并取对数 10log10(Data[i])参    数:无      (通过全局量实现,计算后的值写入原处)返回值  :无*******************************************************************************/void abs(void){  int i=0;  double temp;  for(i=0;i<1024;i++)  {    temp=Data[i].image*Data[i].image;    Data[i].image=Data[i].real*Data[i].real;    Data[i].real=Data[i].image+temp;    Data[i].image=20*log10(Data[i].real);    //取对数  }}/*******************************************************************************函数名称:sort功    能:求最大值下标,返回前五个最大值下标参    数:无    (通过全局量实现,计算后的值写入原处)返回值  :无*******************************************************************************/void sort(void){  //int max[5]={0,0,0,0,0};     //存最大值的下标,从左到右对应值依次增大  int i=1;  int k=0;  //当前比较值的下标在max中的下标,0是最小值下标  int j;    //当前比较值的下标  int n;  int m;  for(i=0;i<5;i++)          //初始max={0,1,2,3,4}    max[i]=i;  for(i=4;i>0;i--)          //对前五个数进行排序  {    for(n=0;n<i;n++)    {      j=max[n];      k=max[n+1];      if(Data[j].image>Data[k].image)         //取对数后,用虚部,即对数值进行比较      {        m=max[n+1];        max[n+1]=max[n];        max[n]=m;      }    }  }  k=0;  for(i=5;i<512;i++)              //扫描所有的数,得出最大值  {    j=max[k];    while(Data[i].image>Data[j].image)    {      k++;   //换一个比较下标      j=max[k];   //换一个比较直    }    if(k==0)      continue;    else     {      for(n=1;n<k;n++)        max[n-1]=max[n];      max[n-1]=i;      k=0;          }  }}

原创粉丝点击