实验二 快速傅立叶变换及应用

一、实验目的

1、掌握利用 FFT 计算线性卷积的原理及具体实现方法。

2、加深理解重叠相加法和重叠保留法。

3、考察利用 FFT 计算线性卷积各种方法的适用范围。

二、实验原理

1、线性卷积与圆周卷积

设𝑥(𝑛)为𝐿点序列,ℎ(𝑛)为M点序列,x(n)和 h(n) 的线性卷积为

y_{l}^{_{}}\left( n \right) =x\left( n \right) *h\left( n \right) =\sum_{m=-\infty}^{\infty}{x\left( m \right) h\left( n-m \right)}

y_l(n)的长度为L+M-1

x(n)和 h(n) 的N 点圆周卷积为

y\left( n \right) =x\left( n \right) \otimes h\left( n \right) =\sum_{m=0}^{N-1}{x\left( m \right) h\left( \left( n-m \right) \right) _NR_N\left( n \right)}

圆周卷积与线性卷积相等而不产生交叠的必要条件为

N\ge L+M-1

圆周卷积定理: 根据 DFT 的性质,𝑥(𝑛) 和ℎ(𝑛) 的𝑁 点圆周卷积的 DFT 等于它们 DFT 的乘积

DFT\left[ x\left( n \right) \otimes h\left( n \right) \right] =X\left( k \right) H\left( k \right)

2、快速卷积

快速卷积算法用圆周卷积实现线性卷积,根据圆周卷积定理利用 FFT 算法实现圆周卷积。可以将快速卷积的步骤归纳如下:

(1) 为了使线性卷积可以用圆周卷积来计算,必须选择 𝑁 ≥ 𝐿 + 𝑀 − 1: 同时为了能使用基-2FFT完成卷积运算,要求N=2^v 。采用补零的办法使𝑥(𝑛)和ℎ(𝑛)的长度均为𝑁。

(2) 计算𝑥(𝑛)和ℎ(𝑛)的𝑁点FFT

 x\left( n \right) \xrightarrow{FFT}X\left( k \right)

h\left( n \right) \xrightarrow{FFT}H\left( k \right)

(3) 组成乘积

Y\left( k \right) =X\left( k \right) H\left( k \right)

(4) 利用 IFFT 计算𝑌(𝑘) 的 IDFT, 得到线性卷积

 Y\left( k \right) \xrightarrow{IFFT}y\left( n \right)

Y\left( k \right) \xrightarrow{IFFT}y\left( n \right)

3、分段卷积

我们考察单位取样响应为ℎ(𝑛)的线性系统,输入为𝑥(𝑛),输出为𝑦(𝑛),则

y\left( n \right) =x\left( n \right) *h\left( n \right)

当输入序列𝑥(𝑛)极长时,如果要等𝑥(𝑛)全部集齐时再开始进行卷积,会使输出相对输入有较大的延时,再者如果序列太长,需要大量的存储单元。为此,我们把𝑥(𝑛)分段,分别求出每段的卷积,合在一起得到最后总的输出。这种方法称为分段卷积。分段卷积可细分为重叠相加法和重叠保留法。

重叠保留法:

设𝑥(𝑛)的长度为N_x , ℎ(𝑛) 的长度为𝑀。我们把序列𝑥(𝑛) 分成多段 N 点序列x_i(n) ,每段与前一段重叠𝑀 − 1个样本。由于第一段没有前一段保留信号,为了修正我们在第一个输入段前面填充𝑀 − 1个零。计算每一段与ℎ(𝑛) 的圆周卷积,则其每段卷积结果的前𝑀 − 1个样本不等于线性卷积值,不是正确的样本值。

所以我们将每段卷积结果的前𝑀 − 1个样本舍去,只保留后面的𝑁 − 𝑀 + 1个正确输出样本,把这些输出样本合起来,得到总得输出。

利用 FFT 实现重叠保留法的步骤如下:

(1) 在𝑥(𝑛)前面填充𝑀 − 1个零,扩大以后的序列为

                                        \hat{x}(n)=\{ \underbrace{0,0,\cdots,0}_{M-1 },x(n) \}

(2) 将𝑥(𝑛)分为若干𝑁点子段,设𝐿 = 𝑁 − 𝑀 + 1为每一段的有效数据长度,则第𝑖 段𝑥𝑖(𝑛) (0 ≤ 𝑛 ≤ 𝑁 − 1)的数据为

x_i(n)=\hat x(m) \qquad iL\leq m \leq iL+N-1 \qquad 0\leq n\leq N-1

(3) 计算每一段与ℎ(𝑛)的𝑁点圆周卷积,利用 FFT计算圆周卷积:

x_i\left( n \right) \xrightarrow{FFT}X_i\left( k \right)

h\left( n \right) \xrightarrow{FFT}H\left( k \right)

Y_i\left( k \right) =X_i\left( k \right) H\left( k \right)

Y_i\left( k \right) \xrightarrow{IFFT}y_i\left( n \right)

(4) 舍去每一段卷积结果的前𝑀 − 1个样本,连接剩下样本,得到卷积结果 𝑦(𝑛)

三、实验内容

假设要计算序列𝑥(𝑛) = 𝑢(𝑛) − 𝑢(𝑛 − 𝐿),    0 ≤ 𝑛 ≤ 𝐿和 ℎ(𝑛) = cos(0.2𝜋𝑛),0 ≤𝑛 ≤ 𝑀的线性卷积,完成以下实验内容

1、设𝐿 = 𝑀 ,根据线性卷积的表达式和快速卷积的原理,分别编程实现计算两个序列线性卷积的方法,比较当序列长度分别为 8, 16, 32, 64, 256, 512, 1024 时,两种方法计算线性卷积所需时间。

2、当𝐿 = 2048且𝑀 = 256时,比较直接计算线性卷积和快速卷积所需的时间,进一步考察当𝐿 = 4096且𝑀 = 256时两种算法所需的时间。

3、编程实现利用重叠相加法计算两个序列的线性卷积,考察𝐿 = 2048且𝑀 =256 时计算线性卷积的时间,与第2题的结果进行比较。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐