记住,对于离散时间系统来说,这种基于变换的方法致使循环卷积代替线性卷积,我们必须在h[n]和x[n]中补0。当两个序列h[n]和x[n]都适当补0后,由于乘法关系循环卷积在频域中的结果与时域中h[n]和x[n]的线性卷积的结果相同。这一点在下面的Matlab清单中可以看出。
程序清单8.1:一个线性卷积和循环卷积相比较的Matlab程序清单
在这个程序清单中,第2行声明了一个4阶滤波器的脉冲响应h[n],第3行声明了一个4阶滤波器的输入序列x[n],输入序列将被滤波器“处理”。第6行执行的是Matlab内嵌的conv()命令,并且第7行确定这个卷积结果的长度。第8行执行循环卷积(通过使用FFT、点对点相乘和IFFT),第9行确定结果序列的长度。Matlab命令窗口结果如下:
在此,需要指出两个非常重要的观察结果:
(1)两种处理的输出,y和循环卷积变换结果circularConvolutionResult不是同样的序列。
(2)序列的结果,y和循环卷积变换结果circularConvolutionResult的序列长度不同。
如前所述,补0(有时只叫做填充)能够使循环卷积变成相等的线性卷积。为了这个目的我们必须进行如下操作:
(1)确保补0后的h[n]和x[n]长度相同。
(2)调整补0后的h[n]和x[n]长度,至少等于h[n]和x[n]序列线性卷积后结果的序列长度,通过下式给出:(www.xing528.com)
N+M-1
这里N是x[n]序列未补0时的长度并且M是h[n]序列未补0时的长度。在前面Matlab程序清单中的输出值是9,这里N=5,M=5。因此
N+M-1=5+5-1=9
注意这个结果,9是线性卷积的长度,yLength是Matlab先前计算使用的。所以,转换循环卷积为等价的线性卷积我们必须补0到x[n]和h[n]长度至少为9。更新Matlab程序清单来达到这个目的,代码显示如下:程序清单8.2:一个Matlab程序,演示了循环卷积如何转换成等价的线性卷积
在这个程序中,第2行改变了显示形式来去除0的拖尾,第6、7行的x[n]和h[n]序列补进4个0到原序列中。Matlab命令窗口结果如下:
注意这个结果,两种方法产生的卷积结果序列长度是相同的。你是否也注意到在Matlab程序中的第13行,real指令用来从结果中移除不想要的虚数项了呢?因为我们知道两个实数值序列h[n]和x[n]的卷积,也会是一个实数值序列。这些虚数项是数字化而产生的“噪声”,它的发生是由于在变换处理过程中数字化精度有限。因为滤波器输出的虚部应该是0,而导致虚部噪声应该被忽略掉。
注意,补0操作也可以被FFT计算的需要推动。对于基2的FFT,输入数组的长度必须是2的幂次。在我们前面列举的例子中,如果我们使用基2的FFT,我们将需要补M个和N个0,使补完后的长度L是邻近的2的较高次幂,且L≥(N+M-1)。在上面的例子中N+M-1=9,所以我们将需要补到L=16。一个时域卷积需要NM次运算,但是使用L点的基2 FFT的快速卷积需要8Llog2(L)+4L次运算[51]。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。