当前位置: 首页 >  技术分享 >  What is FFT? FFT学习笔记

What is FFT? FFT学习笔记

导读:在时间序列、数字信号的数据处理中经常会看到使用FFT作为一段数据中提取频率的手段,但是往往文中没有花大笔墨去解释,仿佛所有人都了解这个概念。.FFT(Fast Fourier Transform) 为快速傅里叶变换,是一种高效计算DFT(Discrete Fourier.Tran

在时间序列、数字信号的数据处理中经常会看到使用FFT作为一段数据中提取频率的手段,但是往往文中没有花大笔墨去解释,仿佛所有人都了解这个概念。

FFT(Fast Fourier Transform) 为快速傅里叶变换,是一种高效计算DFT(Discrete Fourier Transform),离散傅里叶变换的方法。在了解FFT之前需要先了解DFT的作用。

DFT

离散傅里叶变换(Discrete Fourier Transform,简称DFT)是一种数学算法,用于将一个序列或信号从时域转换到频域,广泛应用于信号处理、图像处理、音频分析、通信系统等领域。时域是指信号随时间的变化,而频域则描述了信号中不同频率成分的分布。人话说,就是由一段x=时间; y=幅度 的信号数据转换成为x=频率 ; y=幅度 的数据,可以参考以下这个图:

原信号(上图)中存在两种不同的频率(f=25f=100),通过DFT提取可以看到下图中,它们在频域上显示了两个峰出来。在频域中,信号被表示为一系列频率成分,每个成分由一个幅度(amplitude)和相位(phase)组成。

DFT是傅里叶分析在离散信号处理领域的核心工具,主要目的是将离散信号(时域信号)转换成其对应的频。与连续信号不同,离散信号在时间上是分隔的,例如数字音频或图像数据。

数学表达

DFT将一个长度为\(n\)的复数或实数序列 \( [x_0, x1, …, x{n-1}]\) 转换成另一个长度为 \(n\) 的复数序列 \([X_0, X1, …, X{n-1}]\) 转换的公式为

\[X(k) = \sum_{j=0}^{n-1} \mathbf{x}_n \cdot e^{-i \frac{2\pi}{n}kj} \tag{1} \label{eq1} \]

其中,\(i\) 是虚数单位,\(k\)是当前频率的索引。

由于因为它涉及对每个输出频率 \(X_k\) 进行 \(n\) 次复数乘法和加法操作,直接计算的复杂度为 \(O(n^2)\),因此往往都会使用FFT来进行高效计算。FFT并不改变DFT的结果,只是提供了一种更快的计算方式。

FFT

FFT主要采用了一些技巧来简化流程。

复数单位根

首先将以上公式\(\eqref{eq1}\)中的指数部分写为以下格式:

\[e^{-i\frac{2\pi}{n} kj}=\omega_n^{kj}, \text{where }\omega_n =e^{-i\frac{2\pi}{n}} \]

证明:

Definition: 如果一个复数\(\omega ^n=1\), 我们将\(\{\omega_n^k\}, k=1,…n\) 定义为n次单位根。n次单位根有三个性质,后面会用到:

\[\text{1. }\omega^kn = \omega^{2k}{2n} \quad \text{2. }\omega^kn = -\omega^{k+\frac{n}{2}}{n}\quad \text{3. }\omega^0n = \omega^{n}{n}=1 \tag{2}\label{eq2} \]

由于欧拉公式 \(e^{\pi i}=-1\),我们可以得出 \(\omega_n :=e^{-i\frac{2\pi}{n}}\) 是一个n次单位根。再做一些简单的幂运算就可以得出上面的公式

多项式变换

首先确定几个notation,我们要处理的信号数据是 \(\mathbf{x} \in \mathbb{R}^T\)(暂时假设是一维),是一个长度为\(T\)的数组。\(\mathbf{x}_n\) 代表了在n时间点上信号数据的值。

我们使用\(f(x)\)来指代需要进行的FFT计算,注意这里 \(x\) 和 \(\mathbf{x}\) 不同。将公式\(\eqref{eq1}\)的多项式可以展开为一个多项式t

\[f(x) = \mathbf{x}_0 + \mathbf{x}_1x + \mathbf{x}_2x^2+\mathbf{x}3x^3+…+\mathbf{x}{n-1}x^{n-1} \]

让我们不失一般性地,假设\(n=2^s\),因为我们可以将一个多项式延展到更高次的多项式,将系数设为0。让我们根据\(\mathbf{x}_n\)下标的奇偶性将\(f(x)\)分为两个部分:

\[\begin{aligned} f(x) & = (\mathbf{x}_0 + \mathbf{x}_2x^2+\mathbf{x}4x^4+…+\mathbf{x}{n-2}x^{n}) + (\mathbf{x}_1x+\mathbf{x}_3x^3+\mathbf{x}5x^5+…+\mathbf{x}{n-1}x^{n-1}) \\ & = (\mathbf{x}_0 + \mathbf{x}_2x^2+\mathbf{x}4x^4+…+\mathbf{x}{n-2}x^{n})+x \cdot (\mathbf{x}_1 + \mathbf{x}_3x^2+\mathbf{x}5x^4+…+\mathbf{x}{n-1}x^{n-1}) \\ & = f_1(x^2)+xf_2(x^2)\\ \text{where:}&\\ f_1(x) & = \mathbf{x}_0 + \mathbf{x}_2x^2+\mathbf{x}4x^4+…+\mathbf{x}{n-2}x^{n}\\ f_2(x) & = \mathbf{x}_1x+\mathbf{x}_3x+\mathbf{x}5x^4+…+\mathbf{x}{n-1}x^{n-1} \end{aligned} \]

将公式 \(\eqref{eq1}\) 中的 \(\omega_n^k =e^{-i\frac{2\pi}{n}k}\) 作为 \(x\) 带入,根据单位根性质 \(\eqref{eq2}\) 中的 \(\omega^kn = \omega^{2k}{2n}\) 可得:

\[\begin{aligned} f(\omega_n^k) &= f_1(\omega_n^{2k})+\omega_n^{k}\cdot f_2(\omega_n^{2k}) \\ \omega^kn = \omega^{2k}{2n} &\Rightarrow \\ &= f1(\omega{\frac{n}{2}}^k) + \omega_n^{k}\cdot f2(\omega{\frac{n}{2}}^k) \\ \end{aligned} \]

将\(x=\omega_n^{k+\frac{n}{2}}\) 带入,再根据单位根性质可得

\[\begin{aligned} f(\omega_n^{k+\frac{n}{2}}) &= f_1(\omega_n^{2k+n})+\omega_n^{k+\frac{n}{2}} \cdot f_2(\omega_n^{2k+n})\
\omega^kn = -\omega^{k+\frac{n}{2}}{n}, \omega^0n = \omega^{n}{n}=1 &\Rightarrow \\ &= f_1(\omega_n^{2k}) - \omega_n^k f_2(\omega_n^{2k}) \\ &= f1(\omega\frac{n}{2}^{k}) - \omega_n^k f2(\omega\frac{n}{2}^{k}) \end{aligned} \]

因此,通过计算 \(f1(\omega\frac{n}{2}^{k}), \omega_n^k f2(\omega\frac{n}{2}^{k})\) 可以通过 \(\text{O(logn)}\) 复杂度计算得到 \(f(\omega_n^k), f(\omega_n^{k+\frac{n}{2}})\) ,再通过 \(\text{O(nlogn)}\) 计算得到多项式所有的项。

内容
  • Unity 中的存档系统(本地存档)
    Unity 中的存档系统(本地存
    2023-12-09
    思想.在游戏过程中,玩家的背包、登录、人物系统都与数据息息相关,无论是一开始就设定好的默认数据,还是可以动态存取的数据,
  • Cocos Creator 打包原生 Android 包该如何选择 NDK 版本?
    Cocos Creator 打包
    2023-12-09
    大家好,我是晓衡!.记得前段时间,在一些群里看到有小伙伴说 Cocos Creator 打包 Android 原生 AP
  • Mybatis的工作原理
    Mybatis的工作原理
    2023-12-05
    mybatis的工作原理.mybatis基本工作原理.封装sql ->调用JDBC操作数据库 -> 返回数据封装.JDB
  • 吃透单调栈(1)——单调栈入门
    吃透单调栈(1)——单调栈入门
    2023-12-04
    单调栈是一种理解起来很容易,但是运用起来并不那么简单的数据结构。一句话解释单调栈,就是一个栈,里面的元素的大小按照他们所
  • 数据分析师如何用SQL解决业务问题?
    数据分析师如何用SQL解决业务问
    2023-12-03
    本文来自问答。.提问:数据分析人员需要掌握sql到什么程度?.请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?
  • 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
    缓存面试解析:穿透、击穿、雪崩,
    2023-12-03
    为什么使用缓存.在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象。通过将经常使用的数据存储在缓
  • Unity学习笔记--数据持久化Json
    Unity学习笔记--数据持久化
    2023-12-02
    JSON相关.json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,.json语法较为简单,使用更广泛。
  • 创新电子元件设计与**
    创新电子元件设计与**
    2023-12-16
    创新电子元件设计与**.在当今科技飞速发展的时代,电子元件作为电子产品的基础组成部分,其设计与**的创新举足轻重。随着人
  • ***迁移与升级解决方案
    ***迁移与升级解决方案
    2024-01-05
    ***迁移与升级解决方案.随着业务的不断扩大和发展,很多企业逐渐意识到原有的***已经不能满足日益增长的需求,因此需要进
  • 电子元件质量检测与认证服务
    电子元件质量检测与认证服务
    2024-01-05
    电子元件质量检测与认证服务.为什么需要电子元件质量检测与认证服务?.随着电子产业的不断发展,电子元件在各个生产领域都起着
  • 私有云搭建与**服务
    私有云搭建与**服务
    2023-12-11
    私有云搭建与**服务.在当今信息化快速发展的社会环境下,随着企业对数据安全和隐私保护的需求不断增加,越来越多的企业开始将
  • 电子元件**链**解决方案
    电子元件**链**解决方案
    2023-12-11
    电子元件**链**解决方案.在当今全球化的市场中,**链**是企业成功的关键因素之一。特别是在电子元件行业,**链**尤
  • 云存储解决方案
    云存储解决方案
    2024-01-10
    云存储解决方案.随着互联网技术的不断发展,越来越多的企业开始意识到数据存储和管理的重要性。传统的本地存储方式已经不能满足
  • 移动应用程序开发
    移动应用程序开发
    2024-01-20
    移动应用程序开发.移动应用程序开发是指开发适用于**和平板电脑的应用程序。随着移动设备的普及和移动互联网的快速发展,移动
  • 互联网金融服务平台
    互联网金融服务平台
    2023-12-31
    互联网金融服务平台.互联网金融服务平台是指利用互联网技术提供金融服务的平台,它的出现极大地改变了传统金融行业的运营模式,
  • ***数据备份与恢复解决方案
    ***数据备份与恢复解决方案
    2024-01-20
    ***数据备份与恢复解决方案.在当今数字化时代,数据备份和恢复变得越来越重要。对于企业来说,***数据的备份和恢复解决方
  • 高性能电子元件**
    高性能电子元件**
    2024-01-10
    高性能电子元件**.随着科技的不断进步,电子行业的发展日新月异。高性能电子元件作为电子产品的关键组成部分,对于产品的性能