SciPy快速傅里叶变换(FFT)识别信号失败,峰值出现在f=0位置求助
FFT仅0频出现峰值问题修复方案
核心问题是信号直流分量远大于波动分量,导致0频峰值压制了特征频率的显示,具体修复方法如下:
- 方法1:做FFT前去除信号直流分量
信号的0频幅值等于信号的均值,从原始信号中减去均值即可消除直流分量的干扰,修正后的FFT计算代码如下:# 对Y[0,:]去直流后再做FFT sig_p = Y[0,:] - np.mean(Y[0,:]) PF = fft.fft(sig_p)/Npoints ZF = fft.fft(Y[1,:] - np.mean(Y[1,:]))/Npoints freq = fft.fftfreq(Npoints,deltaT) PF = fft.fftshift(PF) ZF = fft.fftshift(ZF) freq = fft.fftshift(freq) - 方法2:调整频谱图显示参数
如果你需要保留0频分量查看,可以调整Y轴为对数尺度,或者限制Y轴的显示范围,即可看到被压制的特征频率峰值:# 用对数Y轴绘图 plt.plot(freq, np.abs(PF)) plt.yscale('log') plt.show() - 可选优化:仅绘制正半轴频谱
实信号的FFT结果满足共轭对称性,正负频率的幅值完全一致,仅绘制正频率部分即可查看完整的特征频率信息:pos_idx = freq >= 0 plt.plot(freq[pos_idx], np.abs(PF)[pos_idx]) plt.show()
按照上述方法修改后,即可正常看到信号的特征频率峰值。
内容的提问来源于stack exchange,提问作者Pancio
相关产品推荐
相关产品推荐

