为何自行实现的1D傅里叶变换输出与numpy.fft.fft结果不一致
你的实现存在两个核心错误:
错误1:逻辑不符合离散傅里叶变换(DFT)的定义
标准N点DFT的计算公式为:
X[k] = $\sum_{n=0}^{N-1} x[n] \cdot e^{-2\pi j \cdot \frac{k \cdot n}{N}}$
其中k是输出的频率索引,n是输入的采样点索引,N是输入序列总长度。
你当前的代码仅对每个输入点x[i]做了逐点的相位旋转,既没有对所有输入采样点做求和运算,也没有引入频率维度k,同时缺了$\frac{k \cdot n}{N}$的归一化系数,本质只是对输入序列做了逐点的相位偏移,完全不具备傅里叶变换的频率转换能力。
错误2:当前实现不是快速傅里叶变换(FFT)
FFT是基于分治思想的DFT优化算法(最常用的是Cooley-Tukey算法),时间复杂度为O(N logN),你就算写对了暴力DFT的逻辑,时间复杂度是O(N²),和np.fft.fft的实现效率差距极大。
正确的暴力DFT参考实现:
import numpy as np def dft1d(data): N = len(data) result = np.zeros(N, dtype=np.complex128) # 遍历每个输出频率点k for k in range(N): # 对所有输入采样点n加权求和 for n in range(N): result[k] += data[n] * np.exp(-2j * np.pi * k * n / N) return result
如果需要实现真正的FFT,可以参考Cooley-Tukey算法的蝶形运算逻辑,要求输入序列长度为2的整数次幂,通过递归拆分奇偶采样点降低运算量。如果需要和np.fft.fft的输出展示效果对齐,绘图时可以调用np.fft.fftshift将零频率分量移动到频谱中心。
内容的提问来源于stack exchange,提问作者weilueluo
相关产品推荐
相关产品推荐

