numpy.fft.fft 默认对输入数组的最后一个轴(axis=-1)执行一维离散傅里叶变换(dft),返回等长复数数组,不归一化、不移频,频率顺序为“0, 1, ..., n//2, -n//2+1, ..., -1”。

fft 函数默认做的是什么变换?
numpy.fft.fft 默认对输入数组的最后一个轴(即 axis=-1)执行一维离散傅里叶变换(DFT),返回复数数组,长度与输入相同。它不自动归一化,也不自动居中零频分量——这点和 MATLAB 的 fft 行为一致,但和某些信号处理库(如 SciPy 的 fftshift 配合习惯)有视觉差异。
- 输入必须是数字型数组(
float或complex),传入list会隐式转换,但建议显式用np.array(x, dtype=float)避免意外截断 - 若输入含
nan或inf,输出对应位置也是nan,且不报错,容易漏检 - 对实数输入,输出满足共轭对称性:
fft(x).conj() == fft(x[::-1] % len(x)),可用来验证
怎么让频谱图的零频在中间?
numpy.fft.fft 输出的频率顺序是“直流 → 正频率 → 负频率”(即 0, 1, ..., n//2, -n//2+1, ..., -1),直接画图会看到跳变。要用 numpy.fft.fftshift 重排:
import numpy as np f = np.fft.fft(x) f_shifted = np.fft.fftshift(f) # 把零频移到中心 freqs = np.fft.fftshift(np.fft.fftfreq(len(x), d=dt)) # 同步调整频率坐标
-
fftshift必须和fftfreq的fftshift配套使用,否则横坐标和数据错位 - 它对多维数组默认作用于所有轴;若只希望沿某轴(如时间轴)偏移,要显式写
fftshift(f, axes=0) - 注意:
ifftshift是逆操作,但在偶数长度时和fftshift结果相同;奇数长度时二者不同,还原时务必用ifftshift
为什么 real_fft(rfft)比 fft 快且省内存?
numpy.fft.rfft 专用于实数输入,利用共轭对称性只计算并返回约一半的频点(含直流和 Nyquist 点),输出长度为 n//2 + 1,dtype 为 complex。
- 输入是实数时,用
rfft比fft快约 2×,内存占用减半;但输入若为复数,rfft会静默截断虚部,只取实部——这是常见误用点 - 对应的逆变换必须用
irfft,不能混用ifft;且irfft默认输出长度为2*(len(rfft_output)-1),若原始长度是奇数,需显式传n=len(x) - 示例:对长度为 1000 的实信号,
rfft返回 501 个复数;还原时写irfft(rf, n=1000)
采样率、时间步长和频率分辨率怎么对应?
关键关系就一条:df = 1 / (N <em> dt)</em>,其中 N 是点数,dt 是采样间隔(秒),df 是频率分辨率(Hz)。最高可分辨频率(奈奎斯特频率)是 1/(2dt)。
-
np.fft.fftfreq(N, d=dt)返回的就是按此规则生成的频率数组,单位与dt倒数一致(如dt单位是秒,则频率单位是 Hz) - 若信号实际持续时间短于
N * dt(比如只采集了前 500 点,但补零到 1024),df变小(频域更密),但不会提高真实频率分辨率,只是插值 - 补零(zero-padding)用
np.fft.fft(x, n=2048)即可,无需手动拼接数组;但要注意补零后fftfreq的n参数也要同步改
实际用的时候,最容易被忽略的是:频谱幅值要除以 N 才接近真实幅度(尤其做功率谱或与理论公式对比时),而很多人直接画 abs(fft(x)) 就去分析了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











