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

📄 fft1.cpp

📁 标准的fft算法
💻 CPP
字号:
#include     <math.h>
#include     <stdio.h>
#include     <stdlib.h>

#define     Num     8


double result[Num];
int    s_r[Num],s_i[Num];
int    s1_r[Num],s1_i[Num];
double pp=3.1415926;




//void local_carrier(int cos_freq[], int sin_freq[], int length, int local_carrier_ampli, const int carrier_center, const int freq_dif, const int sample_rate);



void FFT(int ir[],int ii[],int or1[],int oi1[])
{
      int i,j=1,l;
      double v_r,v_i,t_r,t_i;
      double temp;
      double w_r[3]={1,0,0.7071067};
      double w_i[3]={0,-1,-0.7071067};
      int le,lei,ip;
      double or[8];
      double oi[8];
      

      for(i=0;i<8;i++)
      {
          or[i]=ir[i];
          oi[i]=ii[i];
      }
      

      /*变址运算*/
      /*
      for(i=1;i<8;i++)
      {
            if(i<j)
            {
                t_r=or[j-1];
                t_i=oi[j-1];

                or[j-1]=or[i-1];
                oi[j-1]=oi[i-1];

                or[i-1]=t_r;
                oi[i-1]=t_i;
            }
            k=4;
            while(k<j)
            {
                j=j-k;
                k=k/2;
            }
            j=j+k;
      }
      
      for(i=0;i<8;i++)
          printf(" %f ",or[i]);
      printf("\n");
     
      */

      t_r=or[1];
      t_i=oi[1];
      or[1]=or[4];
      oi[1]=oi[4];
      or[4]=t_r;
      oi[4]=t_i;

      t_r=or[3];
      t_i=oi[3];
      or[3]=or[6];
      oi[3]=oi[6];
      or[6]=t_r;
      oi[6]=t_i;

      
     

      /*碟形运算*/

      for(l=1;l<4;l++)
      {     le=(1<<l);
            lei =le/2;

            

            v_r=1.0;
            v_i=0.0;
            
            
            for(j=0;j<lei;j++)
            {
                for(i=j;i<8;i=i+le)
                {
                    ip=i+lei;
                    
                    
                    t_r=or[ip]*v_r-oi[ip]*v_i;
                    t_i=or[ip]*v_i+oi[ip]*v_r;

                    
                    or[ip]=or[i]-t_r;
                    oi[ip]=oi[i]-t_i;
                    or[i]=or[i]+t_r;
                    oi[i]=oi[i]+t_i;
                    
                }
                
                temp=v_r;
                
                v_r=v_r*w_r[lei/2]-v_i*w_i[lei/2];
                v_i=temp*w_i[lei/2]+v_i*w_r[lei/2];

            }
        }
        for(i=0;i<8;i++)
        {
            or1[i]=or[i];
            oi1[i]=oi[i];
        }

        return;
}
main()
{
      
     int i=1;
     
/*方波*/
/*      
      for(i=0;i<Num+1;i++)
      {
          s_r[i]=0;
          s_i[i]=0;
      }
      for(i=Num/2-10;i<Num/2+10;i++)
      {
          s_r[i]=10;
          s_i[i]=0;
      }
      
*/
/*正弦波*/
 
/*

      for(i=0;i<Num;i++)
      {
          s_r[i]=68*sin(pp*i*0.5);
          s_i[i]=0;
      } 

*/

      
   /*郑脊蒙的波形*/
/*    
       
     int cos_[Num], sin_[Num];
     
     local_carrier(cos_, sin_, Num, 10, 12, 0, 96);

     for(i=0;i<Num;i++)
      {
          s_r[i]=cos_[i];
          s_i[i]=0;
      }
     
    
 */

    /*冲击*/
     /*
    
      for(i=0;i<Num;i++)
      {
          s_r[i]=0;
          s_i[i]=0;
      }
      s_r[0]=10;
     */
     
     /*直流*/
    /*
      for(i=0;i<Num;i++)
      {
          s_r[i]=1;
          s_i[i]=0;
      }
      
      */

     //变址测试用
     /*
     for(i=0;i<Num;i++)
     {
         s_r[i]=i;
         s_i[i]=0;
     }

    */  
     /*测试数据*/

     for(i=0;i<Num;i++)
      {
          s_r[i]=i+1;
          s_i[i]=0;
      }





      
      FFT(s_r,s_i,s1_r,s1_i);






      for(i=0;i<Num;i++)
      {
          result[i]=sqrt(pow(s1_r[i],2)+pow(s1_i[i],2));
          printf("%.0f", result[i]);
          printf("\t"); printf("%d\t", i);
          printf("%d\t%d",s1_r[i],s1_i[i]);

          printf("\n");
      }


     
}

/*

void local_carrier(int cos_freq[], int sin_freq[], int length, int local_carrier_ampli, const int carrier_center, const int freq_dif, const int sample_rate)
{
    double phi=3.1415926;
    int i=0;
    int real_freq=carrier_center+freq_dif;
    double sample_intervel=1.0/sample_rate;
    double temple=phi*real_freq*sample_intervel;
    for(i=0;i<length;i++)
    {
        cos_freq[i]=(local_carrier_ampli*cos(2*i*temple));
        sin_freq[i]=(local_carrier_ampli*sin(2*i*temple));
    }
}

  */

⌨️ 快捷键说明

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