⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MSP430编写的快速傅立叶变换
💻 C
字号:
#include "msp430x22x4.h"
#include "math.h"

#include "msp430x22x4.h"
#include "math.h"
#define N 8

signed char flag1=1,flag2=1;
unsigned char i,j,k;
char  R,I;
unsigned char p,p1;

long int AA,BB,CC,DD;//EE,FF,GG,HH,II,JJ,KK,LL,MM;
unsigned char   M,L;
unsigned char   a,b,c,x=1,y=1,z=1;
unsigned char    N1;
//************************余弦表**********************************
const  float  COS_tab[91]=
                  {1.0000,0.9998,0.9993,0.9986,0.9975,0.9962,0.9945,0.9925,0.9903,
                   0.9877,0.9848,0.9816,0.9781,0.9744,0.9703,0.9659,0.9614,0.9563,
                   0.9511,0.9455,0.9397,0.9336,0.9272,0.9205,0.9135,0.9063,0.8988,
                   0.8910,0.8829,0.8746,0.8660,0.8572,0.8480,0.8387,0.8290,0.8192,
                   0.8090,0.7986,0.7880,0.7771,0.7760,0.7547,0.7431,0.7314,0.7193,
                   0.7071,0.6947,0.6820,0.6691,0.6561,0.6428,0.6293,0.6157,0.6018,
                   0.5878,0.5736,0.5592,0.5446,0.5299,0.5150,0.5000,0.4848,0.4695,
                   0.4540,0.4384,0.4226,0.4067,0.3907,0.3746,0.3584,0.3420,0.3256,
                   0.3090,0.2924,0.2757,0.2588,0.2419,0.2250,0.2079,0.1908,0.1736,
                   0.1564,0.1392,0.1219,0.1045,0.0872,0.0698,0.0523,0.0349,0.0174,
                   0.0000};

float Re[N]={1,2,3,4,5,6,7,8};
float Im[N];

float bb_re,bb_im;
float bb1_re,bb1_im;



char W(char M,char k)     //角度转换
{
  char m=1;
  int n; 
  while(M>0){m=m*2;M--;}//m==pow(2,M)
  n=360 * k /m;
  return n; 
}


void main(void)
 {
  
    L=0;
    N1=N; 
    while(N1>0)
    {N1=N1/2;L++;}// L=log(N)/log(2);
    L=L-1;
   
   
   
   //输入变址
   for(i=0,j=0;i<N;i++)
    {
      if(i>=j){k=N/2;}
      else
      {
        k=N/2;
        bb_re=Re[j];
        Re[j]=Re[i];
        Re[i]=bb_re;
        
      }
      while(k<=j){j=j-k;k=k/2;
                  if(k==j)break;}
       
       j=j+k;  
    }  
  //变址结束
   
 
    
  //由下开始FFT计算
     
   
    for(M=1;M<=L;M++)
    { 
         x=M-1;
         a=1;
         while(x>0){a=a*2;x--;}//a==2的M-1次方
      for(k=0;k<a;k++)//a==2的M-1次方,即每一级有2的M-1次方个不同的旋转因子,步进值是1
        {
             y=M;
             b=1;
             while(y>0){b=b*2;y--;}//b==2的M次方
             p=0;
          for(p=k;p<N-1;p=p+b)//b==2的M次方
              {
               z=M-1;
               c=1;
              
               while(z>0){c=c*2;z--;}//c==2的M-1次方
               
               p1=p+c;//c==2的M-1次方
               
               R=W(M,k);
               I=W(M,k);//Re(M,k)==Im(M,k)
           
               if(R>=0&&R<=90){flag1=1;}
               else if(R>90&&R<=180){ R=180-R;flag1=-1;}
               else if(R>180&&R<=270){ R=R-180;flag1=-1;}
               else if(R>270&&R<=360){ R=360-R;flag1=1;}
               
               
               if(I>=0&&I<=90){I=90-I;flag2=1;}    
               else if(I>90&&I<=180){I=I-90;flag2=1;}
               else if(I>180&&I<=270){I=270-I;flag2=-1;}
               else if(I>270&&I<=360){I=I-270;flag2=-1;}
             
              bb_re=Re[p];
              bb_im=Im[p];
              bb1_re=Re[p1];
              bb1_im=Im[p1];
              
              AA=(int)(bb_re*100);
              BB=(int)(bb_im*100);
              CC=(int)(bb1_re*100);
              DD=(int)(bb1_im*100);              
 Re[p]=(float)(AA+ CC *(flag1)*COS_tab[R] + DD *(flag2)*COS_tab[I] )/100;
 Im[p]=(float)(BB+ DD *(flag1)*COS_tab[R] - CC *(flag2)*COS_tab[I] )/100; 
 Re[p1]=(float)(AA-CC *(flag1)*COS_tab[R] - DD *(flag2)*COS_tab[I] )/100;
 Im[p1]=(float)(BB- DD *(flag1)*COS_tab[R]+ CC *(flag2)*COS_tab[I] )/100;
           }     
         }
      }    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -