FFT 快速傅里叶变换 初探
一直认为很高深的东西其实也并不很难。
以下内容部分来自qy大神的ppt,同时结合了自己的理解。但理解还不是很深,需要继续研究。
开头
首先什么是傅里叶变换:傅立叶变换能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。【摘自百度】
注意三角函数的特点!这一点要用到。OI中常用的是离散傅里叶变换,并用FFT加速卷积计算。
多项式的表示
点值表示法
给出N+1个不同的x代入A(x)的点值,这样的N+1个元素构成的集合{(x0,y0),(x1,y1),…,(xn,yn)},其中yi=A(xi),称为点值表示法。
为什么由此给定的多项式是惟一的?证明留以后解决。
系数表示法
N次多项式A(x)通常的表示方法为给出A(x)的系数{ak}称为系数表示法。
两种表示法的优缺点
定义:多项式乘法(卷积)A(x)*B(x)=C(x) Cn=∑Ak*Bn-k
则系数表示法的n次多项式A(x),B(x)可以O(n)快速求得A(x)+B(x),但是卷积通常需要O(n^2)计算
点值表示法的n次多项式卷积可以O(n)计算,只需将值域y对应相乘即可{(xi,yi)}×{(xi,zi)}={(xi,yi*zi)} (由于n项确定次数界为n的多项式,故计算卷积是至少保留2n项,注意这里)
系数与点值表示法的转化
系数表示法→点值表示法:
朴素计算O(n^3)
秦九韶算法/霍纳法则O(n^2)
点值表示法→系数表示法
高斯消元O(n^3)
拉格朗日插值法O(n^2):A(x)=∑(0<=k<=n)yk*Π(j≠k)(x-xj)/(xk-xj)
为快速转化系数点值表示法,于是引入快速傅里叶变换。
FFT
首先
我们的问题是:计算一个系数表示法的多项式在某n个值下的值。
一些定义
在复数平面上,定义主n次单位根:w^n=1,w为n次单位根(此处w是一个复数,相当于复数平面上的一个向量),由向量运算的性质,可知w一定在单位圆上,且将单位圆n等分。
定义wk=w^k,则可以发现wa*wb=w((a+b)%n),具有循环特征。
分治算法
由于有“优美”的循环性质,而且点值表示法对带入的点没有要求,于是可以分治,将这些n次单位根带入:
转化问题
令n=2^k,则问题变成求多项式A(w^(0..n-1))的值
若不等,可以添加一些系数为0的高次项,这都是细节。
分而治之
将A(x)奇偶项拆开,
令A0(x)=a0x^0+a2x^1+……+(an-2)x^(n/2-1)
A1(x)=a1x^0+a3x^1+……+(an-1)x^(n/2-1)
则有A(x)=A0(x^2)+xA1(x^2)
原始带入的是w^0,w^1,w^2,…
现在变成带入w^0,w^2,w^4,…
进行一下变换w’=w(n/2),即w’^(n/2)=1
现在变成带入w’^0,w’^1,w’^2,…
这样问题就缩小了一半
继续分治即可
合并时是O(n),总时间复杂度是O(nlogn)
逆FFT
这要涉及范德蒙矩阵的相关知识,暂不说明。
图解(引用)
【据说像蝴蝶,然而?】
实现
由于分治方法常数较大,故在实际使用中通常使用迭代方法计算FFT。
具体方法
模拟从底层递归的过程,在原地操作变换数组。
结束语
FFT,本质也是分治算法的应用,充分利用数学知识,同时结合OI实际,才能灵活运用。
再次感谢qy大神。
参考资料
冰封寒月 讲解与PPT
百度百科
FFT 快速傅里叶变换 初探相关推荐
- 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)
[经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...
- FFT快速傅里叶变换 超详细的入门学习总结
FFT快速傅里叶变换 说明 本文创作的目的是为自己巩固该算法,加深印象并深入理解,同时也为FFT入门学者提供一份可鉴的学习总结. 原文链接:https://blog.csdn.net/qq_39565 ...
- FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换
FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换,可实现FFT8192个点或改成其他FFT1024.4096等等,可以直接运行,运行结果与matlab运行的一致,写好了注释, ...
- c语言fft乘法步骤,C语言实现FFT(快速傅里叶变换).doc
C语言实现FFT(快速傅里叶变换) 择蚁牙幸帆揣邓淌港烬粹甩滋整维含兔忿茂慨渔下餐随扼哇房坏鹅穆礼围引介害芝共茨恿把喜恤寇杖除冕嗓停揍猫调锚遭傀个碱晓频斌硕宾撕坪莱哩腊养掘蹄轴国繁蔬虞靡砖焙倍勾呸怀怒 ...
- 快速傅里叶变换c语言函数,C语言实现FFT(快速傅里叶变换)
while(1); } #include #include /********************************************************************* ...
- 如何 FFT(快速傅里叶变换) 求幅度、频率(超详细 含推导过程)
目录 如何 FFT(快速傅里叶变换) 求幅度.频率(超详细 含推导过程) 一. 打颗栗子 二. 求幅度 1. 快速傅里叶变换 2. 求出复数的绝对值 3. 归一化 小结 三. 求频率 1. 频率公式 ...
- FFT快速傅里叶变换的应用——画单边频谱图matlab
FFT快速傅里叶变换的应用--画单边频谱图matlab 快速傅里叶变换在数字信号处理里用的十分广泛,在matlab仿真中,处理信号的时频域变换十分有效,这里结合两个做过的仿真,来说一说fft的应用:画 ...
- FFT快速傅里叶变换详解
介绍 简而言之,这个东西用来做多项式乘法. 比如说,有两个多项式: 3x2+2x+1,2x2+x+43x^2+2x+1~,~2x^2+x+4 3x2+2x+1 , 2x2+x+4 那么他们乘起来就是 ...
- MATLAB——FFT(快速傅里叶变换)
基础知识 FFT即快速傅里叶变换,利用周期性和可约性,减少了DFT的运算量.常见的有按时间抽取的基2算法(DIT-FFT)按频率抽取的基2算法(DIF-FFT). 1.利用自带函数fft进行快速傅里叶 ...
最新文章
- 神经网络是存储了海量的信息还是将海量的关系映射存储在了一起(发挥了存储记忆功能),还是变成了看似是一个公式,实际是成千上万个规律的公式融合在一个式子中( 类似于正弦波的傅里叶分解成无限中频率的波的加和
- 什么时候用redis_C++传参什么时候用引用, 什么时候用指针?
- 如何判断笔记本蓝牙硬件坏了_还在担心被套路?老司机教你如何判断车用尿素溶液的好与坏...
- Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
- day25 在继承的背景下属性查找的顺序、组合、多态与接口、鸭子类型
- iTOP4412 uboot移植教程
- 有没有能PC远程控制安卓手机的App?AirDroid实现PC远程控制安卓
- 不懂 CAN ?一文告诉你CAN协议!
- AspNetPager 与分页存储过程详解
- 设计必备的配色工具01
- 【bzoj1143: [CTSC2008]祭祀river】有向无环图的最长反链
- 声谱图(spectrogram)、FBank(Mel_spectrogram)和 MFCC(Mel倒谱)到底用哪个作为NN输入?
- cheeta(cheetah mobile官方)
- 23.敏捷优秀实践 - 产品开发流程
- python实现在excel文件中写入和追加内容
- 统计基础(九)多元回归模型
- 使用LSTM完成简单的中英翻译
- nagios配置示例
- dubbo-admin 容器化构建
- CICD系列之k8s