You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中正确执行傅里叶变换?为何仅出现少量峰值?

Python FFT结果峰值偏少的原因分析

我有随时间变化的信号数据,想用Python执行FFT(快速傅里叶变换),尝试了如下代码:

fs = 5000   # time interval of my data
fft = np.fft.fft(SIGNAL) / len(SIGNAL)  
fft_magnitude = abs(fft)
f = np.linspace(-(fs/2),fs/2,len(SIGNAL))
plt.stem(f, np.fft.fftshift(fft_magnitude)) 

但得到的结果仅出现少量峰值,希望帮忙分析原因。

原信号图:
原信号图

FFT结果图:
FFT结果图


可能的原因及解决方向

  • 信号本身频率成分单一:从原信号图看,这是周期性的类正弦波形,本身就只包含少数(甚至单个)基频及其谐波成分,FFT出现少量峰值是正常结果。如果业务场景中预期有更多频率成分,需要先确认原始信号是否确实包含其他频率。
  • 频谱分辨率不足:FFT的频率分辨率为fs/N(N是信号采样点数),若信号长度N过小,分辨率会偏低,相邻频率成分会被混叠,看起来只有少量峰值。可以检查len(SIGNAL)的数值,尝试增加采样时长或采样点数来提升分辨率。
  • 直流分量干扰:若信号存在较强直流分量,FFT的0频位置会出现一个大幅值峰值,可能掩盖其他小幅度的频率成分。可以先对信号做去直流处理:SIGNAL = SIGNAL - np.mean(SIGNAL)后再执行FFT。
  • 采样频率定义错误:代码中fs = 5000标注为“time interval”,但fs应该代表采样频率(单位:Hz,即每秒采样点数),如果误将采样间隔(比如0.0002秒)设为fs,会导致频率轴刻度完全错误,峰值表现异常。请确认:采样频率 = 1 / 采样间隔。
  • 未使用窗口函数导致频谱泄漏:如果信号不是严格整周期采样,会引发频谱泄漏,导致主峰值旁瓣抬高、峰值模糊,甚至掩盖弱频率成分。可以尝试给信号加窗后再做FFT,例如:
    windowed_signal = SIGNAL * np.hanning(len(SIGNAL))
    fft = np.fft.fft(windowed_signal) / len(windowed_signal)
    
  • 负频部分分散注意力:对于实信号,FFT的正频与负频分量是对称的,通常只需观察正频部分(取fft_magnitude[:len(SIGNAL)//2]),并将非0频的幅度乘以2(归一化后),这样能更清晰地聚焦实际存在的频率成分。

内容的提问来源于stack exchange,提问作者jin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:50:28