快速傅里叶变换FFT及其延伸(只是一个引导)

Posted 出尘呢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速傅里叶变换FFT及其延伸(只是一个引导)相关的知识,希望对你有一定的参考价值。

快速傅里叶变换FFT及其延伸

某谷板子题

以下都是学习过程中,最终结果请看这:

http://book.baige.me/view/WlQ
呕心沥血爱傅里叶qwq

步骤

  1. 通过蓝书初步了解FFT
  2. 通过bloghttps://blog.csdn.net/enjoy_pascal/article/details/81478582/看懂FFT和NTT
    (%*10000——博主是初二写的oi健er!)
  3. 通过《算法导论》系统学习FFT和高效FFT
  4. 有所超越:(主要通过论文)学习FFT改进算法与非整数的FFT算法,可能有所新发现

步骤1. 通过蓝书初步了解FFT

《训练指南》p428《快速傅里叶变换FFT》

介绍

快速傅里叶变换是一个很有工程价值的算法,广泛应用于音频、图像等数字信号处理领域。傅里叶变换本身的理论很深。

概念

FFT(fast Fourier transform)是用来计算离散傅里叶变换(discrete Fourier transform,DFT)及其逆变换(IDFT)的快速算法。

直观理解

DFT把时域信号变换为频域信号。

例如声音信号,时域指音量大小,频域指音调高低。
在录音的时候,音频通常按时域形式保存,即各个时刻采样到的振幅;如果需要各个频率的数据,则需要DFT。

重要性质

时域卷积,频域卷积;频域卷积,时域卷积。

举例:快速多项式乘法

多项式乘法实际上是多项式系数向量的卷积。

问题:
给定两单变量多项式 A(x) 和 B(x) 次数均不超过 n ,如何快速计算两者乘积?

朴素的方法

系数两两相乘,再相加。
时间复杂度 O ( n2 )
慢!

快速的方法

优化方法

点值表示法表示多项式,相当于描点作图法。
只要两多项式点集相同,则把对应值乘起来就可以了。

数形结合的思想。
这步的时间复杂度是 O ( n ) ,快。

定理: 恰好有一个次数小于n 的多项式满足拟合n 个离散的点。
(画图可看出,不知为何,,,横着了qwq)

现在的问题是,通常输入输出的多项式都是系数表示的,
要进行傅里叶变换以换为点集表示。

快速傅里叶变换部分

系数表示对应于时域,点值表示对应于频域。

DFT:系数表示->点值表示。
IDFT:系数表示<-点值表示。

这样算出来的点值表示法,对应的求值点是2*n次单位根(暂时不加证明)

x = e k π i / n x=e^k\\pi i/n x=ekπi/n

证明如下:

单位根

n次单位根,
即满足 x n = 1 x^n=1 xn=1的复数。

欧拉复数公式:
e i x = c o s x + i ∗ s i n x e^ix=cosx+i*sinx eix=cosx+isinx

证明

泰勒展开式无穷级数,代入 i*x 即可。


对于
x n = 1 = 1 + i ∗ 0 x^n=1=1+i*0 xn=1=1+i0

由欧拉复数公式
c o s ( u ) = 1 cos(u)=1 cos(u)=1
s i n ( u ) = 0 sin(u)=0 sin(u)=0

u = 2 k π u=2k\\pi u=2kπ
代入有
x = e 2 k π i / n x=e^2k\\pi i/n x=e2kπi/n

快速多项式乘法具体步骤

  1. 补0
  2. 求值DFT
  3. 乘法
  4. 插值IDFT

——然而蓝书上说自己去找FFT详细过程。
“对应的求值点是2*n次单位根”也还需要证明。

步骤2. 通过blog看懂FFT和NTT

https://blog.csdn.net/enjoy_pascal/article/details/81478582/
(%*10000——博主是初二写的oi健er)

DFT前置知识&技能

复数

z 1 = a + b i , z 2 = c + d i z_1=a+bi,z_2=c+di z1=a+bi,z2=c+di
可看成 x O y xOy xOy坐标系的向量
有坐标表示形式
z 1 = ( a , b ) , z 2 = ( c , d ) z_1=(a,b),z_2=(c,d) z1=(a,b),z2=(c,d)
有优美的结论
z 1 + z 2 = ( a + b , c + d ) z_1+z_2=(a+b,c+d) z1+z2=(a+b,c+d)
极坐标表示形式
z 1 = ( ρ 1 , θ 1 ) , z 2 = ( ρ 2 , θ 2 ) z_1=( \\rho1 ,\\theta1),z_2=(\\rho2,\\theta2) z1=(ρ1,θ1),z2=(ρ2,θ2)
有优美的结论
z 1 ∗ z 2 = ( ρ 1 ∗ ρ 2 , θ 1 + θ 2 ) z_1*z_2=(\\rho1*\\rho2,\\theta1+\\theta2) z1z2=(ρ1ρ2,θ1+θ2)

  • 证明

DFT(离散傅里叶变换)

  • 一定注意从这里开始所有的 n n n都默认为 2 2 2的整数次幂

之后晚上在床上看算法导论觉得算法导论更清楚,所以步骤二无疾而终。。。

步骤3.通过《算法导论》系统学习FFT和高效FFT

这个,,,我应该不会比算法导论》讲的更好了

步骤4.一些改进的方向

NTT

https://horizonwd.blog.csdn.net/article/details/81771910

没有精度差
——blog路人黑的纸巾
从数值稳定性的角度,插值是一个众所周知的棘手问题。
——算法导论

变基FFT

什么意思呢
就是现在的FFT迭代是
a = a 1 + x ∗ a 2 a=a_1+x*a_2 a=a1+xa2
因为是二因式,叫2基
拆分成
a = a 1 + x ∗ a 2 + x 2 ∗ a 3 + x 4 ∗ a 4 a=a_1+x*a_2+x^2*a_3+x^4*a_4 a=a1+xa2+x2a3+x4a4
就是4基

例如,次数为16,
2基要 l o g 2 16 = 4 log_2 16=4 log216=4
4基只要 l o g 4 16 = 2 log_4 16=2 log416=2

多维FFT

多维在信息处理中有着更广泛的作用
若各维的维数为 n 1 , n 2 , . . . , n k n_1,n_2,...,n_k n1,n2,...,nk
则令 n = n 1 , n 2 , . . . , n k n=n_1,n_2,...,n_k n=n1,n2,...,nk
可以在 O ( n l o g 2 n ) O(n log_2n) O(nlog2n)时间复杂度内变换出

以上是关于快速傅里叶变换FFT及其延伸(只是一个引导)的主要内容,如果未能解决你的问题,请参考以下文章

快速傅里叶变换fft

傅里叶(FFT)+小波变换+数据压缩

快速傅里叶变换(fft)及其逆变换(iff)的c代码实现

[算法模板]FFT-快速傅里叶变换

快速傅里叶变换 FFT

如何在 Matlab 中使用 FFT(快速傅里叶变换)