微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > FFT快速傅里叶变换与IFFT逆变换

FFT快速傅里叶变换与IFFT逆变换

时间:10-02 整理:3721RD 点击:
利用TI DSPLIB很容易实现FFT 与IFFT

  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*              快速傅里叶变换 / 快速傅里叶逆变换(实数)                   */
  4. /*                                                                          */
  5. /*              2015年07月21日                                              */
  6. /*                                                                          */
  7. /****************************************************************************/
  8. #include                   // C 语言标准输入输出函数库
  9. #include                    // C 数学函数库

  10. #include "mathlib.h"                // DSP 数学函数库
  11. #include "dsplib.h"                 // DSP 函数库

  12. /****************************************************************************/
  13. /*                                                                          */
  14. /*              宏定义                                                      */
  15. /*                                                                          */
  16. /****************************************************************************/
  17. // 软件断点
  18. #define SW_BREAKPOINT     asm(" SWBP 0 ");

  19. // 快速傅里叶变换
  20. // π 及 浮点数极小值
  21. #define PI                3.141592654
  22. #define F_TOL             (1e-06)

  23. /****************************************************************************/
  24. /*                                                                          */
  25. /*              全局变量                                                    */
  26. /*                                                                          */
  27. /****************************************************************************/
  28. // 快速傅里叶变换测试
  29. // 测试快速傅里叶变换点数
  30. // 注意:TI DSP库 最大支持一次性计算 256K 个实数点的 FFT
  31. #define N 1024
  32. // 采样频率
  33. #define Fs 1000.0
  34. // 信号
  35. #pragma DATA_ALIGN(Input, 8);
  36. float Input[2 * N];
  37. // 信号 副本
  38. float InputOrig[2 * N];
  39. // FFT 输出
  40. #pragma DATA_ALIGN(FFT_Out, 8);
  41. float FFT_Out[2 * N];
  42. // IFFT 输出
  43. #pragma DATA_ALIGN(IFFT_Out, 8);
  44. float IFFT_Out[2 * N];

  45. // 旋转因子
  46. #pragma DATA_ALIGN(W, 8);
  47. float W[2 * N];

  48. // 二进制位翻转
  49. #pragma DATA_ALIGN (brev, 8);
  50. unsigned char brev[64] =
  51. {
  52.         0x00, 0x20, 0x10, 0x30, 0x08, 0x28, 0x18, 0x38,
  53.         0x04, 0x24, 0x14, 0x34, 0x0c, 0x2c, 0x1c, 0x3c,
  54.         0x02, 0x22, 0x12, 0x32, 0x0a, 0x2a, 0x1a, 0x3a,
  55.         0x06, 0x26, 0x16, 0x36, 0x0e, 0x2e, 0x1e, 0x3e,
  56.         0x01, 0x21, 0x11, 0x31, 0x09, 0x29, 0x19, 0x39,
  57.         0x05, 0x25, 0x15, 0x35, 0x0d, 0x2d, 0x1d, 0x3d,
  58.         0x03, 0x23, 0x13, 0x33, 0x0b, 0x2b, 0x1b, 0x3b,
  59.         0x07, 0x27, 0x17, 0x37, 0x0f, 0x2f, 0x1f, 0x3f
  60. };

  61. /****************************************************************************/
  62. /*                                                                          */
  63. /*              函数声明                                                    */
  64. /*                                                                          */
  65. /****************************************************************************/

  66. /****************************************************************************/
  67. /*                                                                          */
  68. /*              快速傅里叶变换测试                                          */
  69. /*                                                                          */
  70. /****************************************************************************/
  71. // 产生旋转因子
  72. void tw_gen(float *w, int n)
  73. {
  74.     int i, j, k;

  75.     for(i = 1, k = 0; i > 2; i++)
  76.     {
  77.         w[k    ] = sin(2 * PI * i / n);
  78.         w[k + 1] = cos(2 * PI * i / n);

  79.         k += 2;
  80.     }

  81.     for(j = 1; j > 3; j = j > 3; i += j)
  82.         {
  83.             w[k]     = (float)sin( 4 * PI * i / n);
  84.             w[k + 1] = (float)cos( 4 * PI * i / n);
  85.             w[k + 2] = (float)sin( 8 * PI * i / n);
  86.             w[k + 3] = (float)cos( 8 * PI * i / n);
  87.             w[k + 4] = (float)sin(12 * PI * i / n);
  88.             w[k + 5] = (float)cos(12 * PI * i / n);

  89.             k += 6;
  90.         }
  91.     }
  92. }

  93. void tw_geni(float *w, int n)
  94. {
  95.     int i, j, k;

  96.     for(i = 1, k = 0; i > 2; i++)
  97.     {
  98.         w[k    ] =  sin (2 * PI * i / n);
  99.         w[k + 1] = -cos (2 * PI * i / n);

  100.         k += 2;
  101.     }

  102.     for(j = 1; j > 3; j = j > 3; i += j)
  103.         {
  104.             w[k]     = (float) -sin ( 4 * PI * i / n);
  105.             w[k + 1] = (float)  cos ( 4 * PI * i / n);
  106.             w[k + 2] = (float) -sin ( 8 * PI * i / n);
  107.             w[k + 3] = (float)  cos ( 8 * PI * i / n);
  108.             w[k + 4] = (float) -sin (12 * PI * i / n);
  109.             w[k + 5] = (float)  cos (12 * PI * i / n);

  110.             k += 6;
  111.         }
  112.     }
  113. }

  114. /****************************************************************************/
  115. /*                                                                          */
  116. /*              主函数                                                      */
  117. /*                                                                          */
  118. /****************************************************************************/
  119. int main(void)
  120. {
  121.         // 产生待测试信号
  122.         unsigned int i;
  123.         for (i = 0; i F_TOL)
  124.                 {
  125.                         printf("失败 %4d 原始数据 %10.5f 逆变换 %10.5f\r\n", i, InputOrig[i], IFFT_Out[i]);
  126.                 }
  127.         }

  128.         // 断点
  129.         SW_BREAKPOINT;
  130. }

复制代码




  1. Matlab代码
  2. fs=1000;                                     % 采样频率
  3. N=1024;                                      % 数据点数
  4. n=0:N-1;t=n/fs;                              % 时间序列
  5. x=5*sin(2*pi*150*t)+15*sin(2*pi*350*t);      % 信号
  6. subplot(2,1,1),plot(t,x);                    % 绘制时域信号图
  7. y=fft(x,N);                                  % 对信号进行快速傅里叶变换
  8. mag=abs(y);mag=mag*2/N;                      % 振幅
  9. f=n*fs/N;                                    % 频率序列
  10. subplot(2,1,2),plot(f,mag);                  % 绘制振幅图
  11. xlabel('频率/Hz');
  12. ylabel('振幅');title('N=1024');grid on;
  13. grid on;                                     % 绘制振幅图

复制代码




这是10年前玩的例程了

可以尝试,变旋转因子,尝试玩玩~~·

我也是刚玩这DSP,有时间一定要尝试尝试

尝试之后,可以玩玩旋转因子

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top