Python使用np.fft.fft处理加速度数据后量级与单位问题求解
FFT结果量级变化原因及单位说明
量级变小的原因
- numpy的
np.fft.fft默认输出未做归一化,幅度与输入信号长度正相关,你代码中执行的Y = np.fft.fft(data1); P2 = abs(Y/L)是标准的幅度归一化操作,目的是让频域幅度与时域信号的物理幅度对应,这步操作本身是正确的。 - 时域原始数据的-20~20 m/s²是峰峰值,是所有频率分量相位叠加后的极值,而频域幅值谱展示的是单个频率分量的独立幅度,宽频振动场景下能量分散在多个频率点,单个频率的幅度自然远小于时域峰峰值,这是正常现象,不是计算错误。
- 如果你确认幅值量级和预期偏差过大,可以先检查是否在FFT前对原始数据做过缩放到[-1,1]区间的前置归一化操作,该操作会直接降低频域输出的量级。
FFT输出的单位设置
你当前代码计算得到的P1是单边线性幅值谱,单位和输入的加速度单位完全一致,为m/s²,不需要额外做单位转换。
你可以用仿真信号验证计算逻辑的正确性:构造一个幅值为10 m/s²、频率为1000Hz的正弦信号,长度和你的实测数据一致,用同样的代码做FFT处理,最终1000Hz频点对应的P1值应该接近10,即可证明归一化逻辑和单位对应关系正确。
参考处理代码
Fs = 51200 T = 1/Fs L = len(data1) t = np.arange(0,L-1)*T Y = np.fft.fft(data1) P2 = abs(Y/L) P1 = P2[0:int(L/2+1)] P1[1:-1] = 2*P1[1:-1] f = Fs*np.arange(0,L/2+1)/L
数据可视化参考
FFT处理前(原始加速度数据)

FFT处理后(单位为m/s²)

内容的提问来源于stack exchange,提问作者Andy_KIM
相关产品推荐
相关产品推荐

