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

前端之家收集整理的这篇文章主要介绍了用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


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

  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. @H_475_404@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. @H_475_404@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("\n\n");
  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("\n\n");
  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. @H_475_404@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. @H_475_404@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. @H_475_404@intM_of_N_FFT=0;//蝶形运算的级数,N=2^M
  12. intNpart2_of_N_FFT=0;//创建正弦函数表时取PI的1/2
  13. @H_475_404@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. @H_475_404@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%d\n",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. @H_475_404@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%d\n",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. @H_475_404@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. @H_475_404@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. @H_475_404@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. }

    猜你在找的设计模式相关文章