首页 > 解决方案 > 实值数组的 rfft 幅度

问题描述

我正在计算长度为 3000(以 100 Hz 采样)的信号的 RFFT,其中只有实值条目:

from scipy.fft import rfft
coeffs = rfft(values)
coeffs = np.abs(coeffs)

rfft只得到一半的系数,即对称的系数被丢弃(由于实值输入)。

通过缩放值coeffs = (2 / len(values)) * coeffs来获得幅度是否正确?

编辑:下面我附加了加速度计和陀螺仪的幅度与频率(箱)图(阴影区域是标准偏差)。对于加速度计,第一个 FFT bin 中的能量远高于其他 bin 中的能量(第一个 bin 中 > 2,其他 bin 中大约 < 0.4)。对于陀螺仪来说,它是不同的,能量分布更广。

这是否意味着对于加速度计,FFT 看起来不错,但对于陀螺仪,情况更糟?此外,在 100 Hz 处切断 FFT(即仅取 < 100 Hz 的 bin)或取前几个 bin 直到保持 95% 的能量是否合理?

在此处输入图像描述

在此处输入图像描述

标签: pythonscipyfft

解决方案


我在这篇文章中提供的近似关系适用于你是否丢弃一半的系数。

因此,如果该帖子中指出的条件适用于您的情况,那么您可以通过以下方式估算主要正弦分量的幅度

approx_sinusoidal_amplitude = (2 / len(values)) * np.abs(coeffs[k])

对于一些对应于正弦分量频率的指数k(根据我在另一篇文章中指出的限制,在你的情况下,它必须等于或接近 100/3000 ~ 0.033Hz 的倍数)。对于主要的正弦分量,该指数通常对应于频谱中的局部峰值。但是请注意,如果您的信号是各种频率分量的混合,则各个分量可能会影响频谱,使峰值无法清晰显示。


推荐阅读