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

为何自行实现的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:01