STM32/STM8技术论坛
直播中

硬汉Eric2013

9年用户 1035经验值
擅长:嵌入式技术
私信 关注
[经验]

【安富莱——DSP教程】第31章 复数FFT的逆变换实现

第31章  复数FFT的逆变换实现
    本章主要讲解复数FFT的逆变换。
    本章节使用的复数FFT函数来自ARM官方库的TransformFunctions部分
    31.1 复数FFT的逆变换实现
    31.2 总结

回帖(2)

硬汉Eric2013

2015-7-4 14:16:59
31.1  复数FFT的逆变换实现
    本小节主要讲解复数FFT的逆变换实现,通过函数arm_cfft_f32实现浮点数的逆变换。

31.1.1  arm_cfft_f32逆变换
函数定义如下:
void arm_cfft_f32(
   constarm_cfft_instance_f32 * S,
   float32_t * p1,
   uint8_tifftFlag,
   uint8_tbitReverseFlag)
参数定义:
[in]   *S   points to an instance of the floating-point CFFT structure.  
[in, out] *p1  points to the complex data buffer of size2*fftLen. Processing
   occurs in-place.  
[in]ifftFlag         flag that selects forward (ifftFlag=0) orinverse (ifftFlag=1) transform.  
[in]bitReverseFlag  flag that enables(bitReverseFlag=1) or disables (bitReverseFlag=0) bit
reversal of output.
注意事项:
结构const arm_cfft_instance_f32的定义如下(在文件arm_math.h文件):
  typedefstruct
  {
   uint16_t fftLen;                  
    constfloat32_t *pTwiddle;         
    constuint16_t *pBitRevTable;      
   uint16_t bitRevLength;            
  }arm_cfft_instance_f32;
    下面通过函数arm_cfft_f32计算一个正弦波的FFT,然后再使用函数arm_cfft_f32做FFT逆变换,并使用 Matlab计算变换前后的结果对比。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: arm_cfft_f32_app
  4. *    功能说明: 调用函数arm_cfft_f32_app计算CFFT正变换和你变换。
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void arm_cfft_f32_app(void)
  10. {
  11.      uint16_t i;
  12.    
  13.      fftSize = 1024;
  14.     ifftFlag = 0;
  15.     doBitReverse = 1;
  16.    
  17.      /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
  18.      for(i=0; i<1024; i++)
  19.      {
  20.          testInput_f32_10khz[i*2+1] = 0;
  21.         
  22.          /* 50Hz正弦波,采样率1KHz */
  23.          testInput_f32_10khz[i*2] = arm_sin_f32(2*3.1415926f*50*i/1000);
  24.         
  25.          printf("%frn", testInput_f32_10khz[i*2]);
  26.      }
  27.    
  28.      /* CFFT变换:FFT正变换 */
  29.      arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

  30.      ifftFlag = 1;
  31.    
  32.      /* CFFT变换:FFT逆变换 */
  33.      arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

  34.      printf("****************************分割线***************************************rn");
  35.      /* 串口打印求解的模值 */
  36.      for(i=0; i<1024; i++)
  37.      {
  38.          printf("%frn", testInput_f32_10khz[i*2]);
  39.      }

  40. }
运行如上函数可以通过串口打印出原始正弦波和经过CFFT,CIFFT的正弦波,下面我们就通过
Matlab对比变换前和变换后的波形。
    对比前需要先将串口打印出的两组数据加载到Matlab中,并给原始正弦波起名signal,变换后的数组
起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:
  1. Fs = 1000;                     % 采样率
  2. N  = 1024;                     % 采样点数
  3. n  = 0:N-1;                     % 采样序列
  4. f = n * Fs / N;                 %真实的频率

  5. subplot(2,1,1);
  6. plot(f,  signal);      %绘制原始信号
  7. title('原始信号');
  8. xlabel('时间');
  9. ylabel('幅值');

  10. subplot(2,1,2);
  11. plot(f,  sampledata);    %绘制CFFT和CIFFT后的信号
  12. title('CFFT和CIFFT后的信号');
  13. xlabel('时间');
  14. ylabel('幅值');
Matlab运行的结果如下:
31.1.png
                              
波形前端部分:
31.2.png
波形后端部分:
31.3.png
从上面的对比结果中可以看出,函数arm_cfft_f32计算前后的正弦波基本是一致的。

举报

硬汉Eric2013

2015-7-4 14:17:32
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分