跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
编程语言算法

FFT 与 DFT 原理及算法解析

离散傅里叶变换(DFT)将时域信号转换为频域表示,直接计算复杂度为 O(N^2)。快速傅里叶变换(FFT)利用旋转因子对称性与周期性降低至 O(N log N)。主要算法包括基 -2 按时间/频率抽取、基 -4 及分裂基 FFT。通过蝶形运算实现分治策略,输入输出顺序涉及位反转。DFT 结果具有共轭对称性,有效信息冗余。IDFT 用于恢复时域信号。

steve发布于 2026/3/16更新于 2026/5/77 浏览

快速傅里叶变换 (FFT)

本节介绍几种高效计算离散傅里叶变换(DFT)的方法。鉴于 DFT 在各种数字信号处理应用(如线性滤波、相关分析和频谱分析)中的重要性,其高效计算问题已受到众多数学家、工程师和应用科学家的广泛关注。

从此处开始,符号 $X(k)$ 代表 $x(n)$ 的傅里叶系数。

DFT 定义与计算复杂度

DFT 的计算问题是:根据给定长度为 $N$ 的数据序列 ${x(n)}$,按照以下公式计算 $N$ 个复数值序列 ${X(k)}$:

$$ X(k) = \sum_{n=0}^{N-1} x(n) W_N^{kn}, \quad 0 \leq k \leq N-1 $$

其中 $W_N = e^{-j2\pi/N}$。

通常,数据序列 $x(n)$ 也被假定为复数值。逆离散傅里叶变换(IDFT)为:

$$ x(n) = \frac{1}{N} \sum_{k=0}^{N-1} X(k) W_N^{-nk}, \quad 0 \leq n \leq N-1 $$

由于 DFT 和 IDFT 涉及基本相同的计算类型,对 DFT 高效计算算法的讨论同样适用于 IDFT。

对于每个 $k$ 值,直接计算 $X(k)$ 涉及 $N$ 次复数乘法($4N$ 次实数乘法)和 $N-1$ 次复数加法。因此,计算 DFT 的全部 $N$ 个值需要 $N^2$ 次复数乘法和 $N^2-N$ 次复数加法。

直接计算 DFT 效率低下,主要是因为它没有利用相位因子 $W_N$ 的对称性和周期性:

  • 对称性: $W_N^{k+N/2} = -W_N^k$
  • 周期性: $W_N^{k+N} = W_N^k$

基 -2 FFT 算法

按时间抽取算法 (Decimation-in-Time)

考虑用分治法计算 $N=2^v$ 点 DFT。将 $N$ 点数据序列分成两个 $N/2$ 点数据序列 $f_1(n)$ 和 $f_2(n)$,分别对应 $x(n)$ 的偶数编号和奇数编号样本:

$$ f_1(n) = x(2n), \quad f_2(n) = x(2n+1), \quad n = 0, 1, \dots, \frac{N}{2}-1 $$

所得到的 FFT 算法称为按时间抽取算法(decimation-in-time algorithm)。

N 点 DFT 可表示为:

$$ X(k) = F_1(k) + W_N^k F_2(k), \quad k = 0, 1, \dots, N-1 $$

其中 $F_1(k)$ 和 $F_2(k)$ 分别是序列 $f_1(m)$ 和 $f_2(m)$ 的 $N/2$ 点 DFT。

利用周期性 $F_1(k+N/2) = F_1(k)$ 和 $W_N^{k+N/2} = -W_N^k$,方程可表示为:

$$ \begin{aligned} X(k) &= F_1(k) + W_N^k F_2(k), \quad k = 0, 1, \dots, \frac{N}{2}-1 \ X(k+\frac{N}{2}) &= F_1(k) - W_N^k F_2(k), \quad k = 0, 1, \dots, \frac{N}{2}-1 \end{aligned} $$

这第一步将乘法次数从 $N^2$ 减少到 $N^2/2 + N/2$。重复此过程直到序列缩减为单点序列,总复数乘法次数减少到 $(N/2)\log_2 N$,复数加法次数为 $N\log_2 N$。

图 TC.3.1 图 TC.3.1 按时间抽取算法的第一步。

输入数据序列经过多次抽取后会发生混洗(shuffling),具有位反转顺序。

按频率抽取算法 (Decimation-in-Frequency)

另一种重要的基 -2 FFT 算法称为按频率抽取算法。首先将 DFT 公式分成两个求和式,一个涉及前 $N/2$ 个数据点,第二个涉及后 $N/2$ 个数据点。

将 $X(k)$ 分成偶数和奇数编号样本:

$$ \begin{aligned} X(2k) &= \sum_{n=0}^{N/2-1} [x(n) + x(n+\frac{N}{2})] W_{N/2}^{nk} \ X(2k+1) &= \sum_{n=0}^{N/2-1} [x(n) - x(n+\frac{N}{2})] W_N^n W_{N/2}^{nk} \end{aligned} $$

整个过程涉及 $v = \log_2 N$ 个抽取阶段,每个阶段涉及 $N/2$ 个蝶形运算。计算复杂度与按时间抽取算法相同。

图 TC.3.8 图 TC.3.8 N=8 点按频率抽取 FFT 算法。

观察可知,输入数据 $x(n)$ 按自然顺序出现,但输出 DFT 按位反转顺序出现。

基 -4 FFT 算法

当 $N$ 是 4 的幂时,采用基 -4 FFT 算法在计算上更为高效。

将 $N$ 点输入序列分成四个子序列 $x(4n), x(4n+1), x(4n+2), x(4n+3)$。

组合 $N/4$ 点 DFT 的表达式定义了一个基 -4 按时间抽取蝶形运算,可以用矩阵形式表示。每个蝶形运算涉及三次复数乘法(因为 $W_N^0=1$)和 12 次复数加法。通过分两步执行加法,可将加法次数从 12 减少到 8。

图 TC.3.9 图 TC.3.9 基 -4 FFT 算法中的基本蝶形运算。

分裂基 FFT 算法

分裂基 FFT(SRFFT)算法利用基 -2 和基 -4 分解结合的思想。DFT 的偶数编号点使用基 -2,奇数编号样本使用基 -4 分解,以减少计算次数。

图 TC.3.12 图 TC.3.12 长度 32 分裂基 FFT 算法。

DFT 原理与实例

DFT 的定义

连续时间傅里叶变换定义为: $$ X(f) = \int_{-\infty}^{+\infty} x(t) e^{-j2\pi f t} dt $$

离散傅里叶变换(DFT)由连续傅里叶变换离散化得到: $$ X(m) = \sum_{n=0}^{N-1} x(n) e^{-j\frac{2\pi m n}{N}} $$

式中 $N$ 为时域离散信号的点数,$n$ 为时域序号,$m$ 为频域信号序号。

DFT 输入为 $N$ 个时域离散样本,输出为 $N$ 个复数值频域样本。

利用欧拉公式 $e^{-j\omega} = \cos\omega - j\sin\omega$,DFT 可展开为实部虚部形式: $$ X(m) = \sum_{n=0}^{N-1} x(n) [\cos(\frac{2\pi m n}{N}) - j\sin(\frac{2\pi m n}{N})] $$

DFT 结果与性质

共轭对称性

对于实数输入信号,DFT 结果具有共轭对称性: $$ X(m) = X^*(N-m) $$

受共轭对称性约束,DFT 输出中后 $N/2-1$ 个样本存在信息冗余,有效输出可视为 $N/2+1$ 个独立复数。

物理含义

在 $N$ 点 DFT 中,序号 $m$ 对应信号在 $N$ 个点内包含 $m$ 个周期。第 $m$ 根谱线对应的频率为: $$ f_m = m \cdot \frac{f_s}{N} $$

原始信号分量幅值与 DFT 幅值之间相差系数 $N/2$,因为傅里叶变换输出为频谱密度。

IDFT 的定义

离散傅里叶反变换(IDFT)定义为: $$ x(n) = \frac{1}{N} \sum_{m=0}^{N-1} X(m) e^{j\frac{2\pi m n}{N}} $$

与 DFT 相比有两处区别:多系数 $1/N$,指数项为 $+j$。IDFT 以 $N$ 个复频域样本为输入,恢复出 $N$ 个时域离散样本。

目录

  1. 快速傅里叶变换 (FFT)
  2. DFT 定义与计算复杂度
  3. 基 -2 FFT 算法
  4. 按时间抽取算法 (Decimation-in-Time)
  5. 按频率抽取算法 (Decimation-in-Frequency)
  6. 基 -4 FFT 算法
  7. 分裂基 FFT 算法
  8. DFT 原理与实例
  9. DFT 的定义
  10. DFT 结果与性质
  11. 共轭对称性
  12. 物理含义
  13. IDFT 的定义
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 大模型:从零搭建 Agent 框架
  • FPGA 实现 HDMI 输出:从接口原理到 4K 显示全流程实战
  • 如何有效解决 Trae 上下文丢失问题
  • FPGA 实现 HDMI 输出:从接口原理到 4K 显示实战
  • Mac 专属大模型框架 Chat with MLX:两行代码部署本地对话
  • 2025版最详细WebStorm下载安装教程(详细图解)
  • LeetCode 141 题:环形链表判断的两种解法
  • 本地离线部署 AI 大模型:OpenClaw + Ollama + Qwen 实战
  • Windows 安装 OpenClaw 配置 Qwen 与 Ollama 本地模型及飞书机器人
  • Python 字典与结构化数据核心用法
  • Neo4j 数据导入实战:LOAD CSV、MATCH 与 MERGE 语法解析
  • MySQL 数据类型详解
  • C++ 基础入门:数据类型、IO 流与常用容器
  • AI 编程助手助力 Java 老项目重构:47 分钟消除技术债
  • 飞算 JavaAI:Java 全流程智能开发工具深度解析
  • Python 异步编程与协程实战指南
  • AIOps实践:基于 Dify+LangBot 实现飞书智能体对话机器人
  • VSCode GitHub Copilot 插件无法加载模型的解决方案
  • Obsidian Copilot API 密钥配置指南:OpenRouter、Gemini、OpenAI
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online