You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F407G使用rfft函数出现FFT结果错误的技术问询

排查STM32F407G上rfft结果与在线计算器不符的问题

我之前也碰到过类似的STM32 DSP库FFT结果和在线工具对不上的坑,咱们一步步来拆解问题:

1. 先检查缩放因子差异

STM32 DSP库的rfft系列函数(比如常用的arm_rfft_fast_f32)为了避免运算过程中溢出,默认会在每一步蝶形运算后除以2。而大多数在线FFT计算器是没有这个自动缩放逻辑的,所以你需要把STM32输出的结果乘以2^N(N是FFT点数的对数,这里32点对应N=5,也就是乘以32)再和在线结果对比。

比如在线结果的直流分量是528 + 0j,而STM32输出的第一个实部值应该是528/32=16.5,乘以32后就完全匹配了。先验证这个基础点,大概率能解决大部分差异问题。

2. 确认输出数据的排列顺序

STM32的rfft输出格式有固定规则:

  • 第一个元素是直流分量的实部,对应虚部为0
  • 接下来的元素是正频率分量的实部和虚部交替排列(比如第2个是f1的实部,第3个是f1的虚部,第4个是f2的实部,第5个是f2的虚部……)
  • 如果是偶数点FFT(比如32点),最后一个元素是Nyquist频率的实部,虚部为0

你要对照在线计算器的输出顺序,确保你是在对比同一个频率点的实虚部,不要把顺序搞混了。比如在线结果的第2个是-16 + 162.450726j,对应STM32输出里的第2个(实部)和第3个(虚部)元素,乘以32后应该和这个值一致。

3. 检查FFT初始化和数据类型

  • 确认你初始化rfft时,点数参数设置的是32,比如:
    arm_rfft_fast_instance_f32 S;
    arm_rfft_fast_init_f32(&S, 32);
    
    如果点数设成16或者其他值,结果肯定完全不对。
  • 检查输入数据的类型:如果你的输入是整数数组,要先转换成float类型再传入rfft函数,避免整数运算导致的精度丢失。

4. 精度差异的小细节

在线计算器可能用的是双精度浮点运算,而STM32的rfft默认用单精度float,所以可能会有微小的小数位差异,但不会出现数量级上的错误。如果缩放和顺序都对了,只是小数位有点偏差,那属于正常现象。

内容的提问来源于stack exchange,提问作者user3147192

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:09