你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【原创】【安富莱——DSP教程】第33章 实数FFT的逆变换实现

[复制链接]
baiyongbin2009 发布时间:2015-4-18 10:53
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第33章 实数FFT的逆变换实现

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


33.1 实数FFT的逆变换实现
    本小节主要讲解实数FFT的逆变换实现,通过函数arm_cfft_f32实现浮点数的逆变换。

33.1.1 arm_rfft_fast_f32逆变换
函数定义如下:
    void arm_rfft_fast_f32(
      arm_rfft_fast_instance_f32 * S,
      float32_t * p, float32_t * pOut,
      uint8_t ifftFlag)
参数定义:
     [in]  *S          points to an arm_rfft_fast_instance_f32 structure.
     [in]  *p          points to the input buffer.
     [in]  *pOut      points to the output buffer.
     [in]  ifftFlag     RFFT if flag is 0, RIFFT if flag is 1
注意事项:
结构arm_rfft_fast_instance_f32的定义如下(在文件arm_math.h文件):
      typedef struct
      {
          arm_cfft_instance_f32 Sint;      /**< Internal CFFT structure. */
          uint16_t fftLenRFFT;            /**< length of the real sequence */
      float32_t * pTwiddleRFFT;           /**< Twiddle factors real stage  */
      } arm_rfft_fast_instance_f32 ;

    下面通过函数arm_rfft_f32计算一个正弦波的FFT,然后再使用函数arm_rfft_f32做FFT逆变换,并使用 Matlab计算变换前后的结果对比。
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: arm_rfft_fast_f32_app
  4. *        功能说明: 调用函数arm_rfft_fast_f32计算逆变换
  5. *        形    参:无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void arm_rfft_fast_f32_app(void)
  10. {
  11. uint16_t i;
  12. arm_rfft_fast_instance_f32 S;
  13. /* 实数序列FFT长度 */
  14. fftSize = 1024;
  15. /* 正变换 */
  16.     ifftFlag = 0;
  17. /* 初始化结构体S中的参数 */
  18.          arm_rfft_fast_init_f32(&S, fftSize);
  19. /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */
  20. for(i=0; i<1024; i++)
  21. {
  22. /* 50Hz正弦波,采样率1KHz */
  23. testInput_f32_10khz[i] = 1.2f*arm_sin_f32(2*3.1415926f*50*i/1000)+1;
  24. printf("%f\r\n", testInput_f32_10khz[i]);
  25. }
  26. /* 1024点实序列快速FFT */
  27. arm_rfft_fast_f32(&S, testInput_f32_10khz, testOutput_f32_10khz, ifftFlag);
  28. /* 逆变换 */
  29.     ifftFlag = 1;
  30. /* 1024点实序列快速FFT */
  31. arm_rfft_fast_f32(&S, testOutput_f32_10khz, testInput_f32_10khz, ifftFlag);
  32. printf("****************************分割线**********************************\r\n");
  33. /* 串口打印求解的模值 */
  34. for(i=0; i<fftSize; i++)
  35. {
  36. printf("%f\r\n", testInput_f32_10khz[i]);
  37. }

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


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


subplot(2,1,2);
plot(f,  sampledata);    %绘制RFFT和RIFFT后的信号
title('RFFT和RIFFT后的信号');
xlabel('时间');
ylabel('幅值');


Matlab运行的结果如下:
33.1.png
波形前端部分:
33.2.png
波形后端部分:
33.3.png
从上面的对比结果中可以看出,函数arm_rfft_fast_f32计算前后的正弦波基本是一致的。

33.2 总结
    本章节内容较少,主要验证了函数arm_rfft_fast_f32正变换和逆变换,有兴趣的可以验证Q31和Q15两种数据类型的正变换和逆变换。

收藏 评论0 发布时间:2015-4-18 10:53

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版