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,比如:
如果点数设成16或者其他值,结果肯定完全不对。arm_rfft_fast_instance_f32 S; arm_rfft_fast_init_f32(&S, 32); - 检查输入数据的类型:如果你的输入是整数数组,要先转换成
float类型再传入rfft函数,避免整数运算导致的精度丢失。
4. 精度差异的小细节
在线计算器可能用的是双精度浮点运算,而STM32的rfft默认用单精度float,所以可能会有微小的小数位差异,但不会出现数量级上的错误。如果缩放和顺序都对了,只是小数位有点偏差,那属于正常现象。
内容的提问来源于stack exchange,提问作者user3147192
相关产品推荐
相关产品推荐

