《C》C语言实现FFT算法

一、什么是FFT?

DFT虽好,但是其计算的次数太多,不利于大数据量的计算,FFT是DFT的快速算法,可以节省大量的计算时间,快速傅里叶变换(FFT)是一种能在O(nlogn)的时间内将一个多项式转换成它的点值表示的算法。

1

  • 点值表示法:

    设一个函数f(x)为n-1次多项式,带入一个n个不同的x会得到n个不同的y,这n对(x,y)唯一确定了该多项式,即只有一个多项式能同时满足“代入这些x,得到的分别是这些y”。

二、FFT的目的

FFT可以用来加速多项式乘法。假设有两个n−1次多项式A(x)和B(x),我们的目标是——把它们乘起来。
普通的多项式乘法的复杂度是O(n2)的,我们要枚举A(x)中的每一项,分别与B(x)中的每一项相乘,来得到一个新的多项式C(x)。
但是,如果A(x),B(x)两个多项式用点值表示的方法进行相乘,复杂度是O(n)的。具体方法:C(xi)=A(xi)×B(xi),所以枚举xi即可。
要是我们把两个多项式转换成点值表示,再相乘,再把新的点值表示转换成多项式岂不就可以O(n)的复杂度来解决多项式乘法了!
显然,把多项式转换成点值表示的朴素算法是O(n2)O(n^2)O(n2)的。难道大整数乘法就只能是O(n2)O(n^2)O(n2)吗?不甘心的同学可以发现,大整数乘法复杂度的瓶颈可能在“多项式转换成点值表示”这一步做改进,只要完成这一步就可以O(n)的复杂度求答案了。傅里叶变换的发明就是为完成这个使命

三、FFT过程分析
1. 复数的引入

傅里叶规定点值表示中的n个x为n个模长为1的复数。
而这n个复数不是随机寻找的,而是把单位圆(圆心为原点、1为半径的圆)n等分,取这n个点所表示的复数,即分别以这n个点的横坐标为实部、纵坐标为虚部,所构成的复数。
2
从点(1,0)开始,逆时针将这n个点从0开始编号,第k个点对应的虚数记作wnkw^k_nwnk,根据复数相乘时模长相乘幅角相加可以看出,wnkw^k_nwnkwn1w^1_nwn1的k次方,所以wn1w^1_nwn1被称为n次单位根。
根据每个复数的幅角,可以计算出所对应的点。wnkw^k_nwnk对应的点是(cos2πkn,sin2πkn)(cos2π \frac{k}{n},sin2π\frac{k}{n})(cos2πnk,sin2πnk),也就是说这个复数是cos2πkn+isin2πkncos2π\frac{k}{n}+isin2π\frac{k}{n}cos2πnk+isin2πnk
把这n个复数ωn0,ωn1,ωn2,...,ωnn−1ω^0_n,ω^1_n,ω^2_n,...,ω^{n-1}_nωn0,ωn1,ωn2,...,ωnn1代入多项式,能得到一种特殊的点值表示,这种点值表示就叫离散傅里叶变换

2. 分治的思想

我们要计算n个采样点
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ p=p0,p1,...,pn−1p={p_0,p_1,...,p_{n-1}}p=p0p1...pn1
的傅里叶变换,可以归结为计算多项式
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ f(x)=p0+p1x+p2x+...+pn−1xn−1f(x)=p_0+p_1x+p_2x+...+p_{n-1}x^n-1f(x)=p0+p1x+p2x+...+p

06-17
### FFT算法实现及应用 #### 1. FFT算法的基本原理 快速傅里叶变换(Fast Fourier Transform, FFT)是一种高效的离散傅里叶变换(DFT)算法,能够显著减少计算复杂度。FFT的核心思想是通过递归将输入序列分解为更小的子问题,利用对称性和周期性减少冗余计算。例如,在处理8个信号时,只需用三位二进制数表示信号下标,并通过倒位序重新排列输入数据[^1]。 #### 2. 倒位序与FFT的关系 在FFT中,倒位序是一种重要的预处理步骤。以8点FFT为例,输入信号的下标可以表示为三位二进制数(如000B到111B)。将这些二进制数的位顺序反转后得到新的下标,从而生成倒位序排列。例如,下标1(001B)反转后变为4(100B),下标2(010B)反转后仍为2(010B)。这种排列方式有助于将偶数和奇数下标的信号分离,便于后续蝶形运算的执行[^1]。 #### 3. FFT算法实现 以下是基于Python的FFT算法实现示例: ```python import numpy as np def fft(x): N = len(x) if N <= 1: return x even = fft(x[0::2]) odd = fft(x[1::2]) factor = np.exp(-2j * np.pi * np.arange(N) / N) return np.concatenate([even + factor[:N // 2] * odd, even + factor[N // 2:] * odd]) # 示例输入 x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) result = fft(x) print(result) ``` 上述代码通过递归将输入序列分为偶数和奇数部分,分别计算其FFT值,并利用旋转因子合并结果。最终输出的是输入序列的频域表示。 #### 4. FFT的应用场景 FFT广泛应用于信号处理、图像处理、通信系统等领域。以下是一些具体应用: - **频谱分析**:通过FFT将时域信号转换为频域信号,用于分析信号的频率成分。 - **滤波器设计**:利用FFT实现快速卷积,设计数字滤波器。 - **图像压缩**:在JPEG等图像压缩标准中,FFT被用于去除冗余信息。 - **无线通信**:在OFDM(正交频分复用)技术中,FFT用于调制和解调多载波信号[^1]。 #### 5. FFT与其他算法的比较 相比于直接计算DFT,FFT的时间复杂度从O(N^2)降低到O(N log N),极大地提高了计算效率。这种改进使得FFT成为大规模数据处理中的必备工具。 ---
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值