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

np.fft.fft无法正常工作:Python 3.x FFT绘图与MATLAB不符求助

Python FFT 绘图与MATLAB结果对齐指南

我帮你梳理下Python里做FFT并画出和MATLAB类似频谱图的关键步骤——你遇到的问题大概率是没处理好幅度归一化和频率轴的计算,毕竟MATLAB把这些细节封装得更友好,而Python需要我们手动补全这些环节。

先修正你的核心代码(带详细注释)

import scipy.io
import numpy as np
import matplotlib.pyplot as plt

# 1. 加载.mat文件并提取信号
mat = scipy.io.loadmat('sinal2.mat')
# 提示:先运行print(mat.keys())查看文件里的所有变量,替换成你实际的信号变量名
sinal2 = mat['sinal2'].flatten()  # 把MATLAB风格的二维数组转成Python一维数组,避免FFT计算出错

# 2. 关键参数(必须和你MATLAB里用的一致!)
N = len(sinal2)       # 信号总长度
fs = 1000             # 采样频率,替换成你实际的采样频率(比如MATLAB里定义的Fs)

# 3. 计算FFT并处理幅度谱
fft_result = np.fft.fft(sinal2)
# 归一化幅度:对应MATLAB的abs(fft(x))/length(x),保证直流分量幅度和实际信号均值匹配
amplitude = np.abs(fft_result) / N

# 4. 计算频率轴
freq = np.fft.fftfreq(N, 1/fs)  # 自动生成每个FFT点对应的频率值,比手动计算更准确

# 5. 绘制单边频谱(0到fs/2,和MATLAB默认的频谱展示逻辑一致)
positive_mask = freq >= 0
positive_freq = freq[positive_mask]
positive_amp = amplitude[positive_mask]

plt.figure(figsize=(10, 6))
plt.plot(positive_freq, positive_amp)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('单边频谱图(与MATLAB对齐)')
plt.grid(True)
plt.show()

如果你需要双边频谱(-fs/2到fs/2)

只需要对频率轴和幅度谱做移位处理,对应MATLAB的fftshift操作:

# 双边谱版本
shifted_freq = np.fft.fftshift(freq)
shifted_amp = np.fft.fftshift(amplitude)

plt.figure(figsize=(10, 6))
plt.plot(shifted_freq, shifted_amp)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('双边频谱图(与MATLAB对齐)')
plt.grid(True)
plt.show()

几个关键踩坑点提醒

  • 采样频率fs:这是最容易出错的地方!必须和你MATLAB分析时用的采样频率完全一致,否则频率轴会完全偏移,看起来和原始数据无异(本质是刻度错了)。
  • 信号维度:Python加载.mat文件后,信号常是二维数组(比如(1, 1000)),用flatten()转成一维才能得到正确的FFT结果。
  • 幅度归一化:MATLAB的fft结果要对应实际信号幅度,也需要除以信号长度,Python里必须手动做这一步,否则幅度会被放大N倍,完全偏离预期。
  • 变量名确认:如果运行报错,先执行print(mat.keys())查看.mat文件里的所有变量,确保你提取的是正确的信号变量(比如可能是sinal2而非其他命名)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:09:15