FFT 学习笔记

FFT 学习笔记

1.多项式与卷积

1.1 多项式

对于多项式 \(F(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\),我们称 \(a_0,a_1,\dots,a_n\) 为它的系数,这种表示法叫做系数表示法。

定义 \(F(x)\)\(n\) 次项系数为 \(f_n\)

我们有:

\[F(x)=\sum_{i=0}^nf_ix^i \]

1.2 卷积

考虑两个多项式进行乘法,即\(P(x)=F(x)G(x)\),有 \(p_k=\sum_{i=0}^kf_ig_{k-i}\),也可写作 \(p_k=\sum_{i+j=k}f_ig_j\)

事实上,形如 \(P[k]=\sum_{i\oplus j=k}f_ig_j\) 的操作叫做卷积,\(\oplus\) 为任意运算。

多项式乘法为 \(\oplus\)\(+\) 的操作,即加法卷积,暴力进行的时间复杂度为 \(O(n^2)\)

2.DFT 思想

有定理:平面上的 \(n+1\) 个点唯一确定一个 \(n\) 次多项式(常见应用是待定系数法和拉格朗日插值公式)。于是我们可以用点值的方法表示一个多项式,这被称作点值表示法。

对于两个多项式相乘,我们可以直接将它们对应点的点值相乘。对于两个次数为 \(n\) 的多项式,我们只需要取 \(2n+1\) 个点相乘即可,时间复杂度为 \(O(n)\),优于暴力卷积的 \(O(n^2)\)

DFT(离散傅里叶变换)所做的就是将一个多项式的系数表达法转换为点值表示法。

但是我们取的点是什么呢?

3.复数和单位圆

3.1 复数

定义 \(i^2=-1\),这里 \(i\) 被称作虚数单位。

复数可以记为 \(a+bi\)\(a\) 称作实部,\(b\) 称作虚部。

虚数没有大小和正负之分。注意:部分实数的运算公式不能拓展到复数。

定义虚部互为相反数的复数为共轭复数。

虚数的基本运算如下:

  1. 加减法:实部、虚部分别相加。如:\((a+bi)\pm(c+di)=a\pm c+(b\pm d)i\)

  2. 乘法:当做一次多项式相乘即可。如:\((a+bi)\times (c+di)=ac-bd+(ad+bc)i\)

  3. 除法:同乘分母的共轭复数。如:\(\dfrac{a+bi}{c+di}=\dfrac{(a+bi)(c-di)}{(c+di)(c-di)}=\dfrac{ac+bd+(bc-ad)i}{c^2+d^2}\)

我们同时注意到复数的几何含义:我们可以用数对 \((a,b)\) 来表示复数 \((a+bi)\),事实上,复数 \(a+bi\) 所对应的是平面直角坐标系上横坐标为 \(a\),纵坐标为 \(b\) 的点。

定义一个虚数 \(a+bi\) 的模长为 \(\sqrt{a^2+b^2}\),即其到原点的距离,幅角为与 \(x\) 轴形成的夹角。

有定理:复数相乘,模长相乘,幅角相加。

首先证明模长相乘:

证明:

设两个复数分别为 \(a+bi\)\(c+di\),则它们的模长分别为 \(\sqrt{a^2+b^2}\)\(\sqrt{c^2+d^2}\),相乘后的模长为 \(\sqrt{a^2c^2+a^2d^2+b^2c^2+b^2d^2}\)

\((a+bi)(c+di)=ac-bd+(ad+bc)i\) ,其对应点的坐标为 \((ac-bd,ad+bc)\)。其模长为 \(\sqrt{(ac-bd)^2+(ad+bc)^2}\),展开即为 \(\sqrt{a^2c^2+a^2d^2+b^2c^2+b^2d^2}\),证毕。

然后证明幅角相加。

如图,\(B=3+2i,C=1+4i,D=BC=-5+14i\)

\(AD:AB=AC,AC:AE=AC\) 我们通过两点之间距离公式可以证明 \(DC:EB=AC\),即可得到 \(\triangle AEB\backsim\triangle ACD\),进而证明幅角相加。

3.2 单位圆

定义单位圆是平面直角坐标系上一个圆心为原点,半径为 \(1\) 的圆。

求方程 \(x^n=1\) 的所有复数解,不难发现,其所有解都在单位圆上。这些解对应着分别是幅角为 \(0,\dfrac{1}{n},\dfrac{2}{n},\dots,\dfrac{n-1}{n}\) 圆周的点,此时正好对应着 \(0,1,2,\dots,n-1\) 倍圆周。我们将这些点称作单位根,表示为 \(\omega_n^1,\dots,\omega_n^{n-1}\)。由代数基本定理:\(n\) 次方程恰有 \(n\) 个复数根,可知这就是原方程的所有根。

单位根有如下性质:

  1. \(\omega^{2k}_{2n}=\omega^k_n\)

    感性证明:把单位圆等分成 \(2n\) 份取 \(2k\) 份等价于等分成 \(n\) 份取 \(k\) 份。

  2. \(\omega_n^{k+\frac{n}{2}}=-\omega^k_n\)

    感性证明:转动半周即关于原点对称。

4.FFT

\(F(x)=f_0+f_1x+f_2x^2+\dots+f_{n-1}x^{n-1}\),为方便计算,这里使 \(n=2^k\)

我们可以按照奇偶将 \(F(x)\) 分为 \(A(x)\)\(B(x)\),其中,\(A(x)=f_0+f_2x+\dots+f_{n-2}x^{\frac{n}{2}-1}\)\(B(x)=f_1+f_3x+\cdots+f_{n-1}x^{\frac{n}{2}-1}\)

这样,我们有:

\[F(x)=A(x^2)+xB(x^2) \]

\(k<\dfrac{n}{2}\),将 \(\omega^k_n\) 分别代入 \(F(x),A(x),B(x)\),则:

\[\begin{aligned} F(\omega^k_n)&=A((\omega^k_n)^2)+\omega^k_nB((\omega^k_n)^2)\\ &=A(\omega^k_{\frac{n}{2}})+\omega^k_nB(\omega^k_{\frac{n}{2}}) \end{aligned} \]

代入 \(\omega^{k+\frac{n}{2}}_n\),则:

\[\begin{aligned} F(\omega^{k+\frac{n}{2}}_n)&=A((\omega^{k+\frac{n}{2}}_n)^2)+\omega^{k+\frac{n}{2}}_nB((\omega^{k+\frac{n}{2}}_n)^2) \\&=A(\omega^{2k}_n)+\omega^{k+\frac{n}{2}}_nB(\omega^{2k}_n) \\&=A(\omega^k_{\frac{n}{2}})-\omega^k_nB(\omega^k_{\frac{n}{2}}) \end{aligned} \]

我们注意到:两个式子的结果仅存在一个正负号的差异,这就也意味着,我们若知道两个多项式 \(A(x),B(x)\)\(\omega^0_{\frac{n}{2}}\)\(\omega^{\frac{n}{2}-1}_{\frac{n}{2}}\) 处的点值表示,我们就可以以 \(O(n)\) 的时间复杂度求出多项式 \(F(x)\)\(\omega^0_n\)\(\omega^{n-1}_n\) 处的点值表示。这个过程可以不断分治到 \(n=1\) 的情况,再逐层合并即可,这就是 FFT 的思想。

5.IDFT

我们为什么要将单位根代入式子?

\(G_{n}\) 表示多项式 \(F(x)\) 在经过 DFT 后的点值,有:

\[G_k=\sum^{n-1}_{i=0}(\omega^k_n)^if_i \]

我们能够证明:

\[nf_k=\sum^{n-1}_{i=0}(\omega^{-k}_n)^ig_i \]

证明:

\[\begin{aligned} &\sum^{n-1}_{i=0}(\omega^{-k}_n)^ig_i \\&=\sum^{n-1}_{i=0}\sum^{n-1}_{j=0}(\omega^i_n)^j(\omega^{-k}_n)^if_j \\&=\sum^{n-1}_{i=0}\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)f_j \end{aligned} \]

\(j=k\) 时的贡献是:

\[\sum_{i=0}^{n-1}f_k=nf_k \]

否则,当 \(j\neq k\) 时:

考虑式子 \(\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)\) 的贡献,由等比数列求和公式,我们有:

\[\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)=\omega^0_n\dfrac{1-\omega^n_n}{1-\omega^1_n}=0 \]

故原式成立。证毕。

由此,我们只需要将多项式进行 DFT 后的点值代入单位根的相反数再进行一次 DFT,即可得到原多项式。

注:

\[\omega_n^1=(\cos\dfrac{2\pi}{n},\sin\dfrac{2\pi}{n}) \omega_n^{-1}=(\cos\dfrac{2\pi}{n},-\sin\dfrac{2\pi}{n}) \]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题目集4-6的总结性Blog

一.前言: 在这几周,我们又进行了3次pta的题目训练。 首先是答题程序的最后一次迭代,答题程序-4,接着就是新的迭代,家居电路模拟程序。经过一段时间的学习,我对面向对象设计的理解进一步加深,这三次题集写起来也没有之前那么困难了,虽然还有不足,我仍在一次次答题中学…

Kubernetes – 架构

Kubernetes 集群主要由称为节点的工作机器和控制平面组成。集群中至少有一个工作节点。Kubectl CLI 与控制平面通信,控制平面管理工作节点。 Kubernetes – 集群架构 如下图所示,Kubernetes 采用客户端-服务器架构,有主节点和工作节点,主节点安装在单个 Linux 系统上,而节…

九、FreeRTOS学习笔记-列表和列表项

列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务。 列表项就是存放在列表中的项目列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向环形链表 列表的特点:列表项间的地址非连续的,是人为的连接到…

我真的从测试转成了开发......

写在前面 因为走的圈太大了,早上上班差点迟到,幸好有我每日5公里的加持,侥幸踩点进办公室,哈哈,真的好险! 我开发的功能不能用了 上午开始着手某功能的开发,还在写后台逻辑。 结果到了下午,由于前端同学的代码冲突,打包发布后,导致我写的功能直接不能用了,瞬间emo了…

手把手教你用VM搭建Linux系统

手把手教你用VM搭建Linux系统一、安装vm 查看是否安装成功,打开网络适配器(win+R+ncpa.cpl) 确保有 VMnet1 和 VMnet8二、创建虚拟机step01step02step03 密码123456(我怕我忘了),全名是对你的虚拟机的别称没什么太大作用,用户名代表你说什么用户会涉及到权限step04,位置…

kettle从入门到精通 第六十五课 ETL之kettle 执行动态SQL语句,轻松实现全量增量数据同步

本次课程的逻辑是同步t1表数据到t2表,t1和t2表的表机构相同,都有id,name,createtime三个字段。 CREATE TABLE `t1` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`createtime` datetime DEFAUL…

HMI-Board之LVGL应用

LVGL应用示例移植 使用默认模板工程新建一个RT-Thread项目,BSP版本为1.1.1打开RT-Thread Settings,点击右侧箭头按钮进入详细页,在硬件栏开启以下几个配置选项(LCD、触摸屏、demo)此时,打开board文件夹,发现下面会有一个lvgl的目录,package目录下会有LVGL和lv-music两个…

升鲜宝牛奶溯源管理系统_2024年全网首发,针对牛奶行业特定的溯源解决方案_一码一物_升鲜宝_余东升_升鲜宝供应链管理系统团队再出新作。

升鲜宝牛奶溯源管理系统_2024年全网首发,针对牛奶行业特定的溯源解决方案_一码一物_升鲜宝_余东升_升鲜宝供应链管理系统团队再出新作。整套软件解决方案分三个端:1.PC后台溯源管理系统2.uniapp溯源小程序员工操作端3.vue3,h5溯源网页展示效果图主要功能:权限管理(组织机构、…

如何设计兜底方案(高可用)

场景: 很多时候,在同步数据时,都会有一个重新推送的按钮,不管是重新推送还是重新拉去。这些动作都是失败后,再次操作,直到成功。这种设计的原因是,程序的运行,不知道什么原因会失败。网络、数据库、服务器,B服务BUG都会导致这段代码执行失败,从而无法保证该功能准确执…

爪哇,我初窥门径

2017年3月,我大二下学期了。 虽说一直在学习,持续在解决学习中遇到的问题,但迷茫依旧。 对着黑框编程,还是不知道Java在现实工作中是用来干什么的。 说实话,真的挺枯燥无趣的。逐渐,我开始意识到,持续搞这些基础,是没有意义的。 我在网上看他们讨论的Java问题,很多我都…

使用Kimi+Markmap总结网页内容生成思维导图

AI可以帮助我们更高效地阅读文章进行提炼总结,像上图这张思维导图,就是使用Kimi进行内容提炼,再使用markmap生成思维导图,下面讲解下详细实现步骤: 一、工具准备 Kimi,将文章或一篇网页投给他,让他进行核心观点的提炼并生成我们想要的特定格式 markmap 一个可以将markdo…