加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)

发布时间:2020-12-13 22:41:52 所属栏目:百科 来源:网络整理
导读:http://blog.csdn.net/piaojun_pj/article/details/5911914 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细。 [cpp] view plain copy /******************************************************************************* **程序

http://blog.csdn.net/piaojun_pj/article/details/5911914


代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细。

[cpp] view plain copy
  1. /*******************************************************************************
  2. **程序名称:快速傅里叶变换(FFT)
  3. **程序描述:本程序实现快速傅里叶变换
  4. **程序作者:宋元瑞
  5. **最后修改:2011年4月5日
  6. *******************************************************************************/
  7. #include<stdio.h>
  8. #include<math.h>
  9. #definePI3.141592653589//圆周率,12位小数
  10. #defineN8//傅里叶变换的点数
  11. #defineM3//蝶形运算的级数,N=2^M
  12. typedefdoubleElemType;//原始数据序列的数据类型,可以在这里设置
  13. typedefstruct//定义复数结构体
  14. {
  15. ElemTypereal,imag;
  16. }complex;
  17. complexdata[N];//定义存储单元,原始数据与负数结果均使用之
  18. ElemTyperesult[N];//存储FFT后复数结果的模
  19. //变址
  20. voidChangeSeat(complex*DataInput)
  21. {
  22. intnextValue,nextM,i,k,j=0;
  23. complextemp;
  24. nextValue=N/2;//变址运算,即把自然顺序变成倒位序,采用雷德算法
  25. nextM=N-1;
  26. for(i=0;i<nextM;i++)
  27. if(i<j)//如果i<j,即进行变址
  28. temp=DataInput[j];
  29. DataInput[j]=DataInput[i];
  30. DataInput[i]=temp;
  31. }
  32. k=nextValue;//求j的下一个倒位序
  33. while(k<=j)//如果k<=j,表示j的最高位为1
  34. j=j-k;//把最高位变成0
  35. k=k/2;//k/2,比较次高位,依次类推,逐个比较,直到某个位为0
  36. j=j+k;//把0改为1
  37. }
  38. /*
  39. //变址
  40. voidChangeSeat(complex*DataInput)
  41. {
  42. complexTemp[N];
  43. inti,n,New_seat;
  44. for(i=0;i<N;i++)
  45. Temp[i].real=DataInput[i].real;
  46. Temp[i].imag=DataInput[i].imag;
  47. }
  48. for(i=0;i<N;i++)
  49. {
  50. New_seat=0;
  51. for(n=0;n<M;n++)
  52. New_seat=New_seat|(((i>>n)&0x01)<<(M-n-1));
  53. }
  54. DataInput[New_seat].real=Temp[i].real;
  55. DataInput[New_seat].imag=Temp[i].imag;
  56. */
  57. //复数乘法
  58. complexXX_complex(complexa,complexb)
  59. complextemp;
  60. temp.real=a.real*b.real-a.imag*b.imag;
  61. temp.imag=b.imag*a.real+a.imag*b.real;
  62. returntemp;
  63. //FFT
  64. voidFFT(void)
  65. intL=0,B=0,J=0,K=0;
  66. intstep=0;
  67. ElemTypeP=0,T=0;
  68. complexW,Temp_XX;
  69. //ElemTypeTempResult[N];
  70. ChangeSeat(data);
  71. for(L=1;L<=M;L++)
  72. B=1<<(L-1);//B=2^(L-1)
  73. for(J=0;J<=B-1;J++)
  74. P=(1<<(M-L))*J;//P=2^(M-L)*J
  75. step=1<<L;//2^L
  76. for(K=J;K<=N-1;K=K+step)
  77. W.real=cos(2*PI*P/N);
  78. W.imag=-sin(2*PI*P/N);
  79. Temp_XX=XX_complex(data[K+B],W);
  80. data[K+B].real=data[K].real-Temp_XX.real;
  81. data[K+B].imag=data[K].imag-Temp_XX.imag;
  82. data[K].real=data[K].real+Temp_XX.real;
  83. data[K].imag=data[K].imag+Temp_XX.imag;
  84. voidIFFT(void)
  85. intstep=0;
  86. ElemTypeP=0,T=0;
  87. complexW,Temp_XX;
  88. //ElemTypeTempResult[N];
  89. ChangeSeat(data);
  90. for(L=1;L<=M;L++)
  91. B=1<<(L-1);//B=2^(L-1)
  92. for(J=0;J<=B-1;J++)
  93. P=(1<<(M-L))*J;//P=2^(M-L)*J
  94. step=1<<L;//2^L
  95. for(K=J;K<=N-1;K=K+step)
  96. W.real=cos(2*PI*P/N);
  97. W.imag=sin(2*PI*P/N);//逆运算,这里跟FFT符号相反
  98. Temp_XX=XX_complex(data[K+B],W);
  99. data[K+B].real=data[K].real-Temp_XX.real;
  100. data[K+B].imag=data[K].imag-Temp_XX.imag;
  101. data[K].real=data[K].real+Temp_XX.real;
  102. data[K].imag=data[K].imag+Temp_XX.imag;
  103. intmain(intargc,char*argv[])
  104. inti=0;
  105. for(i=0;i<N;i++)//制造输入序列
  106. data[i].real=sin(2*PI*i/N);
  107. printf("%lf",data[i]);
  108. printf("nn");
  109. FFT();//进行FFT计算
  110. for(i=0;i<N;i++)
  111. {printf("%lf",sqrt(data[i].real*data[i].real+data[i].imag*data[i].imag));}
  112. IFFT();//进行FFT计算
  113. printf("nn");
  114. for(i=0;i<N;i++)
  115. {printf("%lf",data[i].real/N);}
  116. printf("n");
  117. /*for(i=0;i<N;i++)
  118. {printf("%lf",data[i].imag/N);}
  119. printf("n");*/
  120. /*for(i=0;i<N;i++)
  121. return0;
  122. }


copy
    **性能提升:修正了IFFT的bug,使用宏定义改变N大小
  1. **程序版本:V6.5
  2. **最后修改:2011年5月16日
  3. #definePI3.14159265358979323846264338327950288419716939937510//圆周率,50位小数
  4. #definePI26.28318530717958647692528676655900576839433879875021
  5. #defineN1024//傅里叶变换的点数
  6. #defineM10//蝶形运算的级数,N=2^M
  7. #defineNpart2512//创建正弦函数表时取PI的1/2
  8. #defineNpart4256//创建正弦函数表时取PI的1/4
  9. #defineFFT_RESULT(x)(sqrt(data[x].real*data[x].real+data[x].imag*data[x].imag))
  10. #defineIFFT_RESULT(x)(data[x].real/N)
  11. floatElemType;
  12. //定义复数结构体
  13. ElemTypereal,imag;
  14. }complex;
  15. complexdata[N];//定义存储单元,原始数据与负数结果均使用之
  16. ElemTypeSIN_TABLE[Npart4+1];
  17. //产生模拟原始数据输入
  18. voidInputData(inti;
  19. data[i].real=sin(2*PI*i/N);//正弦波
  20. data[i].imag=0;
  21. //创建正弦函数表
  22. voidCREATE_SIN_TABLE(for(i=0;i<=Npart4;i++)
  23. SIN_TABLE[i]=sin(PI*i/Npart2);//SIN_TABLE[i]=sin(PI2*i/N);
  24. ElemTypeSin_find(ElemTypex)
  25. inti=(int)(N*x);
  26. i=i>>1;
  27. if(i>Npart4)//注意:i已经转化为0~N之间的整数了!
  28. {//不会超过N/2
  29. i=Npart2-i;//i=i-2*(i-Npart4);
  30. returnSIN_TABLE[i];
  31. ElemTypeCos_find(ElemTypex)
  32. if(i<Npart4)//i=Npart4-i;
  33. returnSIN_TABLE[Npart4-i];
  34. else//i>Npart4&&i<N/2
  35. //i=i-Npart4;
  36. return-SIN_TABLE[i-Npart4];
  37. //变址
  38. voidChangeSeat(complex*DataInput)
  39. nextValue=N/2;//变址运算,即把自然顺序变成倒位序,采用雷德算法
  40. nextM=N-1;
  41. for(i=0;i<nextM;i++)
  42. temp=DataInput[j];
  43. DataInput[j]=DataInput[i];
  44. DataInput[i]=temp;
  45. k=nextValue;//求j的下一个倒位序
  46. j=j-k;//把最高位变成0
  47. k=k/2;//k/2,比较次高位,依次类推,逐个比较,直到某个位为0
  48. j=j+k;//把0改为1
  49. //复数乘法
  50. /*complexXX_complex(complexa,complexb)
  51. complextemp;
  52. temp.real=a.real*b.real-a.imag*b.imag;
  53. temp.imag=b.imag*a.real+a.imag*b.real;
  54. returntemp;
  55. }*/
  56. //FFT运算函数
  57. intstep=0,KB=0;
  58. //ElemTypeP=0;
  59. ElemTypeangle;
  60. ChangeSeat(data);//CREATE_SIN_TABLE();
  61. B=step>>1;for(J=0;J<B;J++)
  62. //P=(1<<(M-L))*J;//P=2^(M-L)*J
  63. angle=(double)J/B;//这里还可以优化
  64. W.imag=-Sin_find(angle);//用C++该函数课声明为inline
  65. W.real=Cos_find(angle);//用C++该函数课声明为inline
  66. //W.real=cos(angle*PI);
  67. //W.imag=-sin(angle*PI);
  68. for(K=J;K<N;K=K+step)
  69. KB=K+B;
  70. //Temp_XX=XX_complex(data[KB],W);
  71. //用下面两行直接计算复数乘法,省去函数调用开销
  72. Temp_XX.real=data[KB].real*W.real-data[KB].imag*W.imag;
  73. Temp_XX.imag=W.imag*data[KB].real+data[KB].imag*W.real;
  74. data[KB].real=data[K].real-Temp_XX.real;
  75. data[KB].imag=data[K].imag-Temp_XX.imag;
  76. //IFFT运算函数
  77. W.imag=Sin_find(angle); W.real=Cos_find(angle);//W.real=cos(angle*PI);
  78. //W.imag=-sin(angle*PI);
  79. for(K=J;K<N;K=K+step)
  80. KB=K+B;
  81. //用下面两行直接计算复数乘法,省去函数调用开销
  82. Temp_XX.real=data[KB].real*W.real-data[KB].imag*W.imag;
  83. Temp_XX.imag=W.imag*data[KB].real+data[KB].imag*W.real;
  84. data[KB].real=data[K].real-Temp_XX.real;
  85. data[KB].imag=data[K].imag-Temp_XX.imag;
  86. //主函数
  87. CREATE_SIN_TABLE();//创建正弦函数表,这句只需在程序开始时执行一次
  88. InputData();//输入原始数据,此处用公式模拟;实际应用时为AD采样数据
  89. {printf("%f",FFT_RESULT(i));}/**/
  90. //进行IFFT计算
  91. copy
      **程序描述:本程序实现快速傅里叶变换及其逆变换
    1. **性能提升:修正了FFT的bug,变量重新命名,并将N_FFT改为动态值
    2. **程序版本:V6.6
    3. #include<stdlib.h>
    4. #include<math.h>
    5. //#defineOUTPRINTprintf
    6. //#defineDEL/##/
    7. #defineRESULT(x)sqrt(data_of_N_FFT[x].real*data_of_N_FFT[x].real+data_of_N_FFT[x].imag*data_of_N_FFT[x].imag)
    8. #definePI3.14159265358979323846264338327950288419716939937510//圆周率,50位小数
    9. #definePI26.28318530717958647692528676655900576839433879875021
    10. intN_FFT=0;//傅里叶变换的点数
    11. intM_of_N_FFT=0;//蝶形运算的级数,N=2^M
    12. intNpart2_of_N_FFT=0;//创建正弦函数表时取PI的1/2
    13. intNpart4_of_N_FFT=0;//创建正弦函数表时取PI的1/4
    14. }complex_of_N_FFT,*ptr_complex_of_N_FFT;
    15. ptr_complex_of_N_FFTdata_of_N_FFT=NULL;//开辟存储单元,原始数据与负数结果均使用之
    16. ElemType*SIN_TABLE_of_N_FFT=NULL;
    17. for(i=0;i<N_FFT;i++) data_of_N_FFT[i].real=sin(2*PI*i/N_FFT); data_of_N_FFT[i].imag=0;
    18. printf("%f",data_of_N_FFT[i].real);
    19. for(i=0;i<=Npart4_of_N_FFT;i++)
    20. SIN_TABLE_of_N_FFT[i]=sin(PI*i/Npart2_of_N_FFT); ElemTypeSin_find(ElemTypex)
    21. int)(N_FFT*x);
    22. i=i>>1;
    23. if(i>Npart4_of_N_FFT)//注意:i已经转化为0~N之间的整数了!
    24. i=Npart2_of_N_FFT-i;returnSIN_TABLE_of_N_FFT[i];
    25. ElemTypeCos_find(ElemTypex)
    26. if(i<Npart4_of_N_FFT)returnSIN_TABLE_of_N_FFT[Npart4_of_N_FFT-i];
    27. return-SIN_TABLE_of_N_FFT[i-Npart4_of_N_FFT];
    28. voidChangeSeat(complex_of_N_FFT*DataInput)
    29. complex_of_N_FFTtemp;
    30. nextValue=N_FFT/2; nextM=N_FFT-1;
    31. complex_of_N_FFTW,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ChangeSeat(data_of_N_FFT);for(L=1;L<=M_of_N_FFT;L++)
    32. for(K=J;K<N_FFT;K=K+step)
    33. Temp_XX.real=data_of_N_FFT[KB].real*W.real-data_of_N_FFT[KB].imag*W.imag;
    34. Temp_XX.imag=W.imag*data_of_N_FFT[KB].real+data_of_N_FFT[KB].imag*W.real;
    35. data_of_N_FFT[KB].real=data_of_N_FFT[K].real-Temp_XX.real;
    36. data_of_N_FFT[KB].imag=data_of_N_FFT[K].imag-Temp_XX.imag;
    37. data_of_N_FFT[K].real=data_of_N_FFT[K].real+Temp_XX.real;
    38. data_of_N_FFT[K].imag=data_of_N_FFT[K].imag+Temp_XX.imag;
    39. //IFFT运算函数
    40. //ElemTypeP=0;
    41. ElemTypeangle;
    42. complex_of_N_FFTW,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ChangeSeat(data_of_N_FFT);//CREATE_SIN_TABLE();
    43. for(L=1;L<=M_of_N_FFT;L++)
    44. B=step>>1;for(J=0;J<B;J++)
    45. //P=(1<<(M-L))*J;//P=2^(M-L)*J
    46. angle=(//这里还可以优化
    47. W.imag=Sin_find(angle);//初始化FFT程序
    48. //N_FFT是FFT的点数,必须是2的次方
    49. voidInit_FFT(intN_of_FFT)
    50. inti=0;
    51. inttemp_N_FFT=1;
    52. N_FFT=N_of_FFT;//傅里叶变换的点数,必须是2的次方
    53. M_of_N_FFT=0;//蝶形运算的级数,N=2^M
    54. for(i=0;temp_N_FFT<N_FFT;i++)
    55. temp_N_FFT=2*temp_N_FFT;
    56. M_of_N_FFT++;
    57. printf("n%dn",M_of_N_FFT);
    58. Npart2_of_N_FFT=N_FFT/2;//创建正弦函数表时取PI的1/2
    59. Npart4_of_N_FFT=N_FFT/4;//创建正弦函数表时取PI的1/4
    60. //ptr_complex_of_N_FFTdata_of_N_FFT=NULL;//开辟存储单元,原始数据与负数结果均使用之
    61. data_of_N_FFT=(ptr_complex_of_N_FFT)malloc(N_FFT*sizeof(complex_of_N_FFT));
    62. //ptr_complex_of_N_FFTSIN_TABLE_of_N_FFT=NULL;
    63. SIN_TABLE_of_N_FFT=(ElemType*)malloc((Npart4_of_N_FFT+1)*sizeof(ElemType));
    64. CREATE_SIN_TABLE();//结束FFT运算,释放相关内存
    65. voidClose_FFT(if(data_of_N_FFT!=NULL)
    66. free(data_of_N_FFT);//释放内存
    67. data_of_N_FFT=NULL;
    68. if(SIN_TABLE_of_N_FFT!=NULL)
    69. free(SIN_TABLE_of_N_FFT);//释放内存
    70. SIN_TABLE_of_N_FFT=NULL;
    71. Init_FFT(1024);//初始化各项参数,此函数只需执行一次
    72. //输入原始数据
    73. for(i=0;i<N_FFT;i++)
    74. printf("%f",RESULT(i));
    75. IFFT();//进行IFFT计算
    76. for(i=0;i<N_FFT;i++)
    77. Close_FFT();copy
        **模块名称:快速傅里叶变换(FFT)
      1. **模块描述:本程序实现快速傅里叶变换
      2. **性能提升:已达到网上同类程序最高速度
      3. **模块版本:V6.0
      4. **模块作者:宋元瑞
      5. **最后修改:2011年5月6日
      6. **程序说明:
      7. FFT运算输入参数source_Data(i)是一个N大小的数组(注意是小括号)
      8. FFT运算输出结果result_Data(i)是一个N大小的数组(注意是小括号)
      9. **调用举例:
      10. intmain(intargc,char*argv[])
      11. inti=0;
      12. ///以下为FFT运算的调用方式
      13. FFT_prepare();//为FFT做好准备,此函数只需程序开始时执行一次即可,切勿写在循环中
      14. while(1)
      15. for(i=0;i<N_FFT;i++)//输入原始数据
      16. {source_Data(i)=sin(2*PI*i/N_FFT);}//注意inputData后面是小括号
      17. FFT();//进行FFT计算
      18. //输出结果:XXX=result_Data(i);
      19. return0;
      20. #ifndefSYRFFT_H
      21. //#pragmaonce
      22. //#include<stdio.h>
      23. #defineFFT_prepare()CREATE_SIN_TABLE();//创建正弦函数表
      24. #definesource_Data(i)data_FFT[i].imag//接收输入数据的数组,大小为N
      25. #defineresult_Data(i)sqrt(data_FFT[i].real*data_FFT[i].real+data_FFT[i].imag*data_FFT[i].imag)//FFT结果
      26. #defineN_FFT1024//傅里叶变换的点数
      27. #defineM_of_N_FFT10//蝶形运算的级数,N=2^M
      28. #defineNpart2_of_N_FFT512//创建正弦函数表时取PI的1/2
      29. #defineNpart4_of_N_FFT256//创建正弦函数表时取PI的1/4
      30. }complex_of_N_FFT;
      31. complex_of_N_FFTdata_FFT[N_FFT];//存放要进行FFT运输的数据,运算结果也存放这里
      32. ElemTypeSIN_TABLE[Npart4_of_N_FFT+1];
      33. /*
      34. voidInputData(void)
      35. inti;
      36. for(i=0;i<N_FFT;i++)//制造输入序列
      37. source_Data(i)=sin(2*PI*i/N_FFT);//模拟输入正弦波
      38. //data_FFT[i].imag=sin(2*PI*i/N);//正弦波
      39. //printf("%f",data_FFT[i].imag);
      40. SIN_TABLE[i]=sin(PI*i/Npart2_of_N_FFT);int)(N_FFT*x);
      41. returnSIN_TABLE[Npart4_of_N_FFT-i];
      42. return-SIN_TABLE[i-Npart4_of_N_FFT];
      43. //变址前data_FFT[i].imag存储了输入数据,变址后data_FFT[i].real存储了输入数据
      44. inti,New_seat;
      45. New_seat=0;
      46. for(n=0;n<M_of_N_FFT;n++)
      47. New_seat=New_seat|(((i>>n)&0x01)<<(M_of_N_FFT-n-1));
      48. DataInput[New_seat].real=DataInput[i].imag;
      49. DataInput[i].imag=0;
      50. complex_of_N_FFTXX_complex(complex_of_N_FFTa,complex_of_N_FFTb)
      51. complex_of_N_FFTtemp;
      52. ChangeSeat(data_FFT);//Temp_XX=XX_complex(data_FFT[KB],108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Temp_XX.real=data_FFT[KB].real*W.real-data_FFT[KB].imag*W.imag;
      53. Temp_XX.imag=W.imag*data_FFT[KB].real+data_FFT[KB].imag*W.real;
      54. data_FFT[KB].real=data_FFT[K].real-Temp_XX.real;
      55. data_FFT[KB].imag=data_FFT[K].imag-Temp_XX.imag;
      56. data_FFT[K].real=data_FFT[K].real+Temp_XX.real;
      57. data_FFT[K].imag=data_FFT[K].imag+Temp_XX.imag;
      58. #defineSYRFFT_H
      59. #endif

      copy
        **程序版本:V6.0
      1. **程序作者:宋元瑞
      2. **最后修改:2011年5月6日
      3. *******************************************************************************/
      4. #include"syrFFT_H.h"//包含FFT运算头文件
      5. //以下3句为FFT运算的调用函数
      6. FFT_prepare();//为FFT做好准备,此函数只需程序开始时执行一次即可,切勿写在循环中
      7. //while(1)
      8. //模拟输入
      9. {source_Data(i)=sin(2*PI*i/N_FFT);}//注意inputData后面是小括号
      10. FFT();
      11. //输出结果
      12. copy

          #ifndefFFT_H
        1. #include<stdlib.h>
        2. //创建正弦函数表
        3. for(i=0;i<=Npart4_of_N_FFT;i++)
        4. SIN_TABLE_of_N_FFT[i]=sin(PI*i/Npart2_of_N_FFT);//SIN_TABLE[i]=sin(PI2*i/N);
        5. {//不会超过N/2
        6. i=Npart2_of_N_FFT-i;//i=i-2*(i-Npart4);
        7. returnSIN_TABLE_of_N_FFT[i];
        8. //i=Npart4-i;
        9. returnSIN_TABLE_of_N_FFT[Npart4_of_N_FFT-i];
        10. //i>Npart4&&i<N/2
        11. //i=i-Npart4;
        12. return-SIN_TABLE_of_N_FFT[i-Npart4_of_N_FFT];
        13. voidChangeSeat(complex_of_N_FFT*DataInput)
        14. complex_of_N_FFTtemp;
        15. nextValue=N_FFT/2; nextM=N_FFT-1;
        16. complextemp;
        17. temp.real=a.real*b.real-a.imag*b.imag;
        18. temp.imag=b.imag*a.real+a.imag*b.real;
        19. returntemp;
        20. }*/
        21. //FFT运算函数
        22. W.imag=-Sin_find(angle);for(K=J;K<N_FFT;K=K+step)
        23. Temp_XX.real=data_of_N_FFT[KB].real*W.real-data_of_N_FFT[KB].imag*W.imag;
        24. Temp_XX.imag=W.imag*data_of_N_FFT[KB].real+data_of_N_FFT[KB].imag*W.real;
        25. data_of_N_FFT[KB].real=data_of_N_FFT[K].real-Temp_XX.real;
        26. data_of_N_FFT[KB].imag=data_of_N_FFT[K].imag-Temp_XX.imag;
        27. data_of_N_FFT[K].real=data_of_N_FFT[K].real+Temp_XX.real;
        28. data_of_N_FFT[K].imag=data_of_N_FFT[K].imag+Temp_XX.imag;
        29. //printf("n%dn",M_of_N_FFT);
        30. //结束FFT运算,释放相关内存
        31. if(data_of_N_FFT!=NULL)
        32. free(data_of_N_FFT); data_of_N_FFT=NULL;
        33. if(SIN_TABLE_of_N_FFT!=NULL)
        34. free(SIN_TABLE_of_N_FFT); SIN_TABLE_of_N_FFT=NULL;
        35. #defineFFT_H
        36. #endif
        copy
          **性能提升:修正了FFT的bug
        1. #include"jxust_fft6_6.h"
        2. //产生模拟原始数据输入,在实际应用时替换为AD采样数据
        3. //输入采样数据
        4. //主函数,示例如何调用FFT运算
        5. char*argv[])
        6. Init_FFT(1024);//①初始化各项参数,此函数只需执行一次;参数为FFT的点数,必须为2的次方
        7. InputData();//②输入原始数据,此处在实际应用时替换为AD采样数据
        8. FFT();//③进行FFT计算
        9. //for(i=0;i<N_FFT;i++)//④输出FFT频谱结果sqrt(data_of_N_FFT[i].real*data_of_N_FFT[i].real+data_of_N_FFT[i].imag*data_of_N_FFT[i].imag)
        10. //{printf("%f",RESULT(i));}
        11. //for(i=0;i<N_FFT;i++)//(可选步骤)⑤输出IFFT结果,滤波时会用到;暂时不用
        12. Close_FFT();//结束FFT运算,释放相关内存;此函数在彻底结束FFT运算后调用,
        13. return0;
        14. }

        copy

          #ifndefSYRFFT_6_55_H
        1. #defineFFT_RESULT(x)(sqrt(data_of_N_FFT[x].real*data_of_N_FFT[x].real+data_of_N_FFT[x].imag*data_of_N_FFT[x].imag))
        2. #defineIFFT_RESULT(x)(data_of_N_FFT[x].real/N_FFT)
        3. #defineN_FFT1024//傅里叶变换的点数
        4. #defineM_of_N_FFT10//蝶形运算的级数,N=2^M
        5. #defineNpart2_of_N_FFT512//创建正弦函数表时取PI的1/2
        6. #defineNpart4_of_N_FFT256//创建正弦函数表时取PI的1/4
        7. }complex_of_N_FFT,*ptr_complex_of_N_FFT;
        8. complex_of_N_FFTdata_of_N_FFT[N_FFT]; ElemTypeSIN_TABLE_of_N_FFT[Npart4_of_N_FFT+1];
        9. int)(N_FFT*x); i=i>>1;//i=i/2;
        10. if(i>Npart4_of_N_FFT)
        11. //根据FFT相关公式,sin()参数不会超过PI,即i不会超过N/2
        12. if(i<Npart4_of_N_FFT)
        13. else//初始化FFT程序
        14. voidInit_FFT()
        15. #defineSYRFFT_6_55_H
        16. #endif

        copy

          **程序版本:V6.55
        1. **最后修改:2011年5月22日
        2. #include"syrFFT_6_55.h"
        3. inti;
        4. //制造输入序列
        5. data_of_N_FFT[i].real=sin(2*PI*i/N_FFT);//输入采样数据
        6. data_of_N_FFT[i].imag=0;
        7. //主函数,示例如何调用FFT运算
        8. Init_FFT();//①初始化各项参数,此函数只需执行一次;修改FFT的点数去头文件的宏定义处修改
        9. //③进行FFT计算
        10. //for(i=0;i<N_FFT;i++)//④输出FFT频谱结果sqrt(data_of_N_FFT[i].real*data_of_N_FFT[i].real+data_of_N_FFT[i].imag*data_of_N_FFT[i].imag)
        11. //for(i=0;i<N_FFT;i++)//(可选步骤)⑤输出IFFT结果,滤波时会用到;暂时不用
        12. //结束FFT运算,此版本此句无用,可不写
        13. }

        (编辑:李大同)

        【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读