实值数组的 rfft 振幅

Amplitude of rfft for real-valued array

我正在计算长度为 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 的箱子)或采用前几个箱子直到保留 95% 的能量是否合理?

我在this post中提供的近似关系无论你是否舍弃一半系数都成立。

因此,如果 post 中指出的条件适用于您的情况,那么您可以通过

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

对于某些索引 k 对应于正弦分量的频率(根据我的其他 post 中指出的限制必须等于或接近 100/3000 ~ 0.033 的倍数赫兹在你的情况下)。对于主要的正弦分量,该指数通常对应于频谱中的局部峰值。但是请注意,如果您的信号是各种频率成分的混合,则各个成分可能会影响频谱,导致峰值不清晰。