用离散傅里叶变换实现线性卷积

两个长度为N的序列的线性卷积的长度为2N-1;

两个长度为N的序列的周期卷积的周期为N。

如果我们将两个长度为N的序列做DFT、相乘、IDFT,得到的是这两个序列的周期卷积。

周期卷积的结果可看做线性卷积移位rN个点后的线性叠加(r为整数,-∞<r<∞)。因为移位长度N小于线性卷积长度2N-1,所以发生了时域混叠。

因此,如果将这两个序列补零到长度为2N-1,那么就不会发生时域混叠,周期卷积的一个周期就等于这两个序列的线性卷积。

根据以上内容,可以设计出两种用离散傅立叶变换实现线性卷积的方法:

1. 重叠相加法

我们知道,卷积是线性运算,因此可以将输入x[n]拆分为许多长度为L的子序列,与长度为P的h[n](用离散傅里叶变换)做(周期)卷积,然后将卷积结果移位叠加。当然,DFT的长度至少为L+P-1,x[n]和h[n]都补零到这个长度,以使得周期卷积的一个周期等于线性卷积。各次卷积结果相互间隔L重叠相加得到结果。

x[n]的第一个子序列与h[n]卷积结果所在区间为[0, L+P-2];    // 长度L+P-1

x[n]的第二个子序列与h[n]卷积结果所在区间为[L, 2L+P-2];  // 与第一个序列的重叠部分为[L, L+P-2],重叠部分长度P-1

……

2. 重叠保留法

同样将输入序列拆分为长度为L的子序列。和重叠相加法不同,这种方法保留下循环卷积结果中和线性卷积相同的部分,丢弃不同的部分,然后将输出序列补在一起。因此,在拆分x[n]的时候是“重叠”拆分的。取L>P,DFT长度为L,线性卷积长度应为L+P-1,但周期卷积长度只有L,这可以看做将线性卷积尾巴上的P-1个点“回绕”到头部做叠加,因此(用离散傅里叶变换)做卷积后的开头P-1个点是不正确的,将其丢弃。剩下的L-P+1个点是正确的。这种方法必须取L>P,否则周期卷积的所有点都不等于线性卷积。

x[n]的第一个子序列为x[0, L-1];

x[n]的第二个子序列为x[L-(P-1), 2L-P];

……

更详细理论参考奥本海默,《离散时间信号处理》。

---------------------------------------------------------------------------------------------------------------

Example 1

设h[n]长度P为500。

使用重叠相加法,DFT长度取为1024,于是输入数据长度L必须满足L+P-1<=1024,L<=525。取L=512。

将L和P都补零到1024,每次卷积结果长度就是DFT长度1024,每次重叠相加部分长度512。

Example 2

设h[n]长度P为500。

使用重叠保留法,输入数据长度L和DFT长度相同,必须大于P,取为1024。h[n]补零到1024。

每次DFT长度1024,丢弃点数需大于P-1即499。为了方便,卷积后丢弃前面512点,保留后512点。

每次取输入数据时,将上一次运算时的512点和新的512点拼成1024点。

原文地址:https://www.cnblogs.com/byeyear/p/6111206.html