实验五 循环卷积与线性卷积的实现
一、实验目的
(1) 进一步理解并掌握循环卷积与线性卷积的概念; (2) 理解掌握二者的关系。
二、实验原理
两个序列的N 点的循环卷积定义为
1
0[()()]()(())N N N k h n x n h m x n m -=⊗=-∑ (0)
n N ≤< 从定义中可以看到,循环卷积和线性卷积的不同之处在于:两个N 点序列的N 点循环
卷积结果仍为N 点序列,而它们的线性卷积的结果长度则为2N -1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。
正是这些不同,导致了线性卷积和循环卷积有不同的结果和性质。
两个序列的N 点循环卷积是它们的线性卷积以N 为周期的周期延拓。
设序列()h n 的长度为1N ,序列()x n 的长度为2N ,此时线性卷积结果的序列点数为'121N N N =+-;因此如果循环卷积的点数N 小于121N N +-,那么上述周期性延拓的结果就会产生混叠,从而两种卷积会有不同的结果。
而如果满足'N N =的条件,就有循环卷积与线性卷积的结果在0n N ≤<范围内相同。
根据DFT 循环卷积性质中的卷积定理
{[()()]}[()][()]N DFT h n x n DFT x n DFT h n ⊗=∙
因此可以根据性质先分别求两个序列的N 点DFT ,并相乘,然后取IDFT 以得到循环卷积。
三、实验分析
例题:已知有限长序列()x n 与()h n 如下图所示, (1) 画出两者之间的线性卷积 (2) 8点圆卷积。
(3) 5点圆卷积。
解析如下:
(1)()x n 与()h n 的线性卷积,由公式可知:
()*()()()m h n x n x m h n m ∞
=-∞
=
-∑
()x m 与()h m -的图形如下:
利用方格平移法:
由方格平移法可知: 当0n =时,()*()0h n x n = 当1n =时,()*()0h n x n =
当2n =时,()*()0*11*11h n x n =+= 当3n =时,()*()2*11*10*13h n x n =++= 当4n =时,()*()3*12*11*10*16h n x n =+++= 当5n =时,()*()3*12*11*10*16h n x n =+++= 当6n =时,()*()3*12*11*16h n x n =++= 当7n =时,()*()3*12*15h n x n =+= 当8n =时,()*()3*13h n x n ==
得到图形如下:
(2)()x n 与()h n 的8点圆卷积,由公式可知:
7
8880
()()(())(())()n x n h n x m h n m G n =⊗=-∑
8(())x m 与8(())h m -的图形如下:
根据下面图表可计算得到圆卷积:
取和得到圆卷积为3。
n=时:
当2
取和得到圆卷积为1。
取和得到圆卷积为6。
n=
5
取和得到圆卷积为6。
取和得到圆卷积为6。
7
n=
取和得到圆卷积为5。
得到波形如下:
(2)()x n 与()h n 的5点圆卷积,由公式可知:
4
4440
()()(())(())()n x n h n x m h n m G n =⊗=-∑
4(())x m 与4(())h m -的图形如下:
根据图标可计算得到圆卷积: 当0n =
取和得到圆卷积为6。
n=时:
当1
取和得到圆卷积为6。
n=
当2
n=
当3
取和得到圆卷积为6。
n=
当4
画出波形如下:
四、仿真实验
Matlab程序设计如下:
编写的循环卷积程序:
方法一:直接根据定义计算,程序编辑如下:
function y=circonv1(x1,x2,N)
if length(x1)>N
error('N must not be less than length of x1')
end
if length(x2)>N
error('N must not be less than length of x2')
end
x1=[x1,zeros(1,N-length(x1))];
x2=[x2,zeros(1,N-length(x2))];
n=[0:1:N-1];
x2=x2(mod(-n,N)+1);
H=zeros(N,N);
for n=1:1:N
H(n,:)=cd(x2,n-1,N);
end
y=x1*H';
function y=cd(x,m,N)
if length(x)>N
error
end
x=[x zeros(1,N-length(x))];
n=[0:1:N-1];
n=mod(n-m,N);
y=x(n+1);
方法二:根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积
function y=circonv2(x1,x2,N)
if length(x1)>N
error('N must not be less than length of x1')
end
if length(x2)>N
error('N must not be less than length of x2')
end
X1k=fft(x1,N);
X2k=fft(x2,N);
Yk=X1k.*X2k;
y=ifft(Yk);
if((all(imag(x1)==0))&&(all(imag(x2)==0))) y=real(y);
end
编写的主程序:
n=[0:1:4];m=[0:1:4];
N1=length(n);N2=length(m);
xn=ones(1,5);
hn=[0,0,1,2,3];
y1n=conv(xn,hn);
y2n=circonv2(xn,hn,N1+N2-1);
y3n=circonv1(xn,hn,N1);
ny1=[0:1:length(y1n)-1];
ny2=[0:1:length(y3n)-1];
subplot(3,1,1);
stem(ny1,y1n);
subplot(3,1,2);
stem(ny1,y2n);
subplot(3,1,3);
stem(ny2,y3n);
运行结果如下:
图表1实验结果
与理论结果一致。
五、实验小结
通过本次实验理解并掌握了循环卷积与线性卷积的概念,也掌握了两者之间的关系。
学会了matlab中线性卷积函数,以及如何编写循环卷积。
在仿真过程中出现了一些问题,由于matlab提供线性卷积函数,则只需要自己编写循环卷积,在编写过程中,没有注意到matlab 中的大小写的严格区别,导致程序运行错误。
经过反复检查之后发现了错误,经改正后得到了正确的运行结果。
收获很大。