NumPy 的 fft 函数默认对数组的最后一维(axis=-1)做变换;fftfreq 需传入采样间隔 d 才得真实频率;fft 输出等长复数数组,含完整频谱;fftshift 仅重排索引以居中零频。

fft 函数默认对哪一维做变换?
NumPy 的 fft 系列函数(比如 fft.fft)默认只对数组的**最后一维**(即 axis=-1)做一维傅里叶变换。这不是“自动识别信号维度”,而是硬编码规则——哪怕你传入的是二维图像数据,它也不会默认沿时间轴或空间轴处理,除非你显式指定 axis。
常见错误现象:np.fft.fft(img_2d) 返回形状和输入一致的复数数组,但变换其实是逐行进行的(因为行是最后一维),不是你想做的“整张图二维频谱”。
- 若处理时间序列(shape 为
(N,)),不用管axis,默认就对它变 - 若处理多通道信号(shape 为
(N, C)),想对每条通道独立变,得写np.fft.fft(x, axis=0)(让变换沿第 0 维发生,即每列一个 FFT) - 二维图像想做真正的二维 FFT,必须用
np.fft.fft2,而不是套fft两次
fft 和 fftfreq 配合时,采样率怎么传才不翻车?
np.fft.fftfreq 生成的频率数组,默认单位是“周期/采样点”,也就是归一化频率。要得到真实物理频率(Hz),必须传入实际采样间隔 d(单位:秒),即 fs = 1/d。漏传或传错 d,画出来的横轴就全偏了。
使用场景:你有一段 1 秒长、采样率 1000 Hz 的音频,共 1000 个点。此时 d = 0.001,调用应为 np.fft.fftfreq(1000, d=0.001),结果才是 0, 1, 2, ..., 499, -500, ..., -1(Hz)。
- 如果误写成
fftfreq(1000, d=1),得到的是 0, 0.001, 0.002, ... —— 单位变成 kHz,数值小了 1000 倍 - 如果数据是等时间间隔但起始时间不为 0(比如从 t=2.5s 开始),
d仍只取决于间隔,和起始无关 - 对非均匀采样数据,
fft不适用;得先插值或换用 Lombscargle 等方法
为什么 fft 结果是复数,且长度和输入一样?
np.fft.fft 输出复数数组,实部是余弦分量幅值,虚部是正弦分量幅值。长度和输入相同,是因为它计算的是离散傅里叶变换(DFT)的标准定义,不是“只返回正频率”——后半段负频率是共轭对称的,但 NumPy 保留全部,方便逆变换精确还原。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
性能影响:保留全部点意味着内存和计算量都是 O(N),没做任何截断或压缩。如果你只关心幅度谱,记得用 np.abs(fft_result);如果只想要单边谱(如画图),要手动取前半(含直流)+ 合并负频共轭(或直接用 np.fft.rfft)。
-
rfft对实数输入更省:输出长度是N//2 + 1,只含非负频率,且是实数数组(最后一个是 Nyquist 频率,可能为实) - 用
ifft还原时,必须用和fft完全同构的复数数组,不能只喂一半过去 - 注意浮点误差:即使原始数组是实数,
ifft(fft(x))的虚部通常不严格为 0,要用.real或np.real_if_close
fftshift 怎么用才不把频谱中心搞错?
np.fft.fftshift 的作用是把零频分量移到频谱中心——但它**不改变数值,只重排顺序**。很多人以为它“做了某种变换”,其实只是索引平移。错用位置(比如在 fft 前调用,或对错误维度调用)会导致频谱完全错位。
典型场景:画二维图像的频谱图,希望低频在中间、高频在四周。必须按顺序来:f2d = fft2(img); f2d_shifted = fftshift(f2d),再用 abs 或 log 显示。
- 对一维结果,
fftshift把[0,1,...,N-1]变成[N//2, ..., N-1, 0, ..., N//2-1](偶数 N) - 对多维数组,默认对所有轴 shift;如只想 shift 第一维,写
fftshift(arr, axes=0) - 如果之后还要做
ifft2,别忘了先ifftshift回去——fftshift和ifftshift对偶数长度互为逆操作,但对奇数长度也安全
真正容易被忽略的是:FFT 结果的相位信息极其敏感,哪怕输入数组末尾多一个零、少一个零,整个相位谱都可能跳变。做对比实验时,务必检查数组长度、填充方式、是否去均值——这些细节比选哪个函数影响更大。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










