C++实现快速傅里叶变换

本文深入介绍了傅里叶变换(FT)及其离散形式(DFT),详细阐述了离散傅里叶变换的递归计算方法——快速傅里叶变换(FFT)。通过复数类的设计,展示了如何用C++实现FFT,并通过示例验证了其正确性。此外,还提及了更高效的蝶形算法作为FFT的另一种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础公式

傅里叶变换(FT):
F ( ω ) = F [ f ( t ) ] = ∫ − ∞ + ∞ f ( t ) e − j ω t d t F(\omega)=F[f(t)]=\int_{-\infty}^{+\infty}f(t)e^{-j\omega t}dt F(ω)=F[f(t)]=+f(t)etdt
离散傅里叶变换(DFT):
X ( k ) = ∑ 0 N − 1 x ( n ) W N k n ( k = 0 , 1 , 2 , 3 ⋯ N − 1 ) X(k)=\sum_0^{N-1}x(n)W_N^{kn} \quad (k=0,1,2,3\cdots N-1) X(k)=0N1x(n)WNkn(k=0,1,2,3N1)
其中 W N k n = e − j 2 π N k n W_N^{kn}=e^{-j\frac{2\pi}{N}kn} WNkn=ejN2πkn,称为旋转因子。

\quad FFT是基于DFT的一种算法,将长序列的DFT分解为短序列的DFT,利用旋转因子的周期性、对称性、可约性,减少了重复运算。

FFT原理

对于一个多项式
A ( x ) = ∑ 0 n − 1 a i x i = a 0 + a 1 x + a 2 x 2 + ⋯ + a n − 1 x n − 1 A(x)=\sum_0^{n-1}a_ix^i=a_0+a_1x+a_2x^2+\cdots +a_{n-1}x^{n-1} A(x)=0n1aixi=a0+a1x+a2x2++an1xn1
按照下标的奇偶性把A(x)分成两部分
A ( x ) = ( a 0 + a 2 x 2 + a 4 x 4 + ⋯ + a n − 2 x n − 2 ) + ( a 1 x + a 3 x 3 + a 5 x 5 + a n − 1 x n − 1 )    = ( a 0 + a 2 x 2 + a 4 x 4 + ⋯ + a n − 2 x n − 2 ) + x ( a 1 + a 3 x 2 + a 5 x 4 + a n − 1 x n − 2 ) A(x)=(a_0+a_2x^2+a_4x^4+\cdots+a_{n-2}x^{n-2})+(a_1x+a_3x^3+a_5x^5+a_{n-1}x^{n-1}) \\ \quad\quad\; =(a_0+a_2x^2+a_4x^4+\cdots+a_{n-2}x^{n-2})+x(a_1+a_3x^2+a_5x^4+a_{n-1}x^{n-2})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值