首页 > 其他分享 >What is FFT? FFT学习笔记

What is FFT? FFT学习笔记

时间:2024-01-24 18:00:01浏览次数:30  
标签:What mathbf DFT FFT 笔记 frac omega 2k

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

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

DFT

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

img

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

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

数学表达

DFT将一个长度为\(n\)的复数或实数序列 \( [x_0, x_1, ..., x_{n-1}]\) 转换成另一个长度为 \(n\) 的复数序列 \([X_0, X_1, ..., 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^k_n = \omega^{2k}_{2n} \quad \text{2. }\omega^k_n = -\omega^{k+\frac{n}{2}}_{n}\quad \text{3. }\omega^0_n = \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^k_n = \omega^{2k}_{2n}\) 可得:

\[\begin{aligned} f(\omega_n^k) &= f_1(\omega_n^{2k})+\omega_n^{k}\cdot f_2(\omega_n^{2k}) \\ \omega^k_n = \omega^{2k}_{2n} &\Rightarrow \\ &= f_1(\omega_{\frac{n}{2}}^k) + \omega_n^{k}\cdot f_2(\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^k_n = -\omega^{k+\frac{n}{2}}_{n}, \omega^0_n = \omega^{n}_{n}=1 &\Rightarrow \\ &= f_1(\omega_n^{2k}) - \omega_n^k f_2(\omega_n^{2k}) \\ &= f_1(\omega_\frac{n}{2}^{k}) - \omega_n^k f_2(\omega_\frac{n}{2}^{k}) \end{aligned} \]

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

标签:What,mathbf,DFT,FFT,笔记,frac,omega,2k
From: https://www.cnblogs.com/tungsten106/p/17985363/what_is_fft

相关文章

  • Python学习笔记
    一、第一个Python程序1.1软件安装Anaconda:管理不同开发环境(如python3解释器),及它们的各种库(如numpy库)PyCharm:集成开发环境(IDE)1.2HelloWorld打开PyCharm→新建项目→选择项目保存位置、先前配置的环境(方法见Anaconda使用笔记)......
  • 数据库学习笔记(五)—— MySQL 之 瓶颈及优化篇
    MySQL之瓶颈及优化篇数据库瓶颈阶段一:企业刚发展的阶段,最简单,一个应用服务器配一个关系型数据库,每次读写数据库。阶段二:无论是使用MySQL还是Oracle还是别的关系型数据库,数据库通常不会先成为性能瓶颈,通常随着企业规模的扩大,一台应用服务器扛不住上游过来的流量且一台......
  • sql自学笔记(一)
    存储数据特点将数据放到表中,表再放到库中一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性表由列组成,成为字段,所有表都是一个或多个列组成,类似于“属性”表中数据是按行存储的,每行类似于对象常见命令查看当前所有数据库showdatabases;打......
  • 「笔记」dsu on tree
    目录写在前面引入树上启发式合并代码复杂度分析例题CF570DTreeRequestsCF600ELomsatgelralCF1709EXORTree写在最后写在前面高产似那啥。还以为这东西是啥科技呃呃,原来是能证明复杂度的乱搞。所以重链剖分就是动态dsu(精神错乱引入dsuontree,即树上启发式合并。启发......
  • 人工智能 第三版 第二章笔记
    人工智能第三版第二章笔记空间状态图状态空间图(state-spacegraph)是对问题的一种表示方法。其中有两种特殊类型的节点。其中一种是表示问题起始状态(startstate)的起始节点(startnode)。另一种特殊类型的节点对应于问题的终点或终止状态。问题的状态空间树包含了问题可能出现......
  • JAVA学习笔记--输出HelloWorld
    HelloWorld!写出人生第一个代码~随便新建一个文件夹用于存放代码新建一个Java文件新建一个名为Hello的txt文件或其他文本文件,将后缀名改为.java注意:如果系统没有显示文件后缀名,则需要手动打开在Hello.java文件中编写以下代码:publicclassHello{ publicstaticvoi......
  • JAVA学习笔记--JDK安装及环境变量配置
    Java开发环境搭建卸载JDK找到JDK的安装路径,删除JDK的整个文件夹删除JAVA_HOME(右击我的电脑-->属性-->高级系统设置-->环境变量,即可找到JAVA_HOME)删除path下关于java的目录在终端输入java-version,若显示'java'不是内部或外部命令,也不是可运行程序或批处理文件,则成......
  • JAVA学习笔记--常见的Dos命令
    基本的Dos命令打开cmd的方法以管理员的身份打开:开始--->命令提示符(Win11)Win键+R-->输入cmd打开控制台(推荐使用)在任意文件夹下,按住shift键+鼠标右键点击,在此处打开命令行窗口资源管理器的地址栏前面加上cmd路径(注意:cmd后有空格)常见的Dos命令##盘符切换输入想要切换到......
  • xtuner微调大模型笔记
    微调原理想象一下,你有一个超大的玩具,现在你想改造这个超大的玩具。但是,对整个玩具进行全面的改动会非常昂贵。※因此,你找到了一种叫 LoRA 的方法:只对玩具中的某些零件进行改动,而不是对整个玩具进行全面改动。※而 QLoRA 是LoRA的一种改进:如果你手里只有一把生锈的螺丝刀,也......
  • 2024/1/23 算法笔记
    1.负进制数[P1017NOIP2000提高组]进制转换-洛谷|计算机科学教育新生态(luogu.com.cn)所谓负进制数,就是进制数为负数的一种实数表示法。例如,-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:110001=1(-2)5+1*(-2)4+0(-2)3+0*(-2)2+0(-2)^1+1(-2)......