实验五循环卷积与线性卷积的实现一、实验目的(1)进一步理解并掌握循环卷积与线性卷积的概念;(2)理解掌握二者的关系。二、实验原理两个序列的N点的循环卷积定义为10[()()]()(())NNNkhnxnhmxnm(0)nN从定义中可以看到,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环卷积结果仍为N点序列,而它们的线性卷积的结果长度则为2N-1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。正是这些不同,导致了线性卷积和循环卷积有不同的结果和性质。两个序列的N点循环卷积是它们的线性卷积以N为周期的周期延拓。设序列()hn的长度为1N,序列()xn的长度为2N,此时线性卷积结果的序列点数为'121NNN;因此如果循环卷积的点数N小于121NN,那么上述周期性延拓的结果就会产生混叠,从而两种卷积会有不同的结果。而如果满足'NN的条件,就有循环卷积与线性卷积的结果在0nN范围内相同。根据DFT循环卷积性质中的卷积定理{[()()]}[()][()]NDFThnxnDFTxnDFThn因此可以根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积。三、实验分析例题:已知有限长序列()xn与()hn如下图所示,(1)画出两者之间的线性卷积(2)8点圆卷积。(3)5点圆卷积。解析如下:(1)()xn与()hn的线性卷积,由公式可知:()*()()()mhnxnxmhnm()xm与()hm的图形如下:利用方格平移法:1111132100由方格平移法可知:当0n时,()*()0hnxn当1n时,()*()0hnxn当2n时,()*()0*11*11hnxn当3n时,()*()2*11*10*13hnxn当4n时,()*()3*12*11*10*16hnxn当5n时,()*()3*12*11*10*16hnxn当6n时,()*()3*12*11*16hnxn当7n时,()*()3*12*15hnxn当8n时,()*()3*13hnxn得到图形如下:(2)()xn与()hn的8点圆卷积,由公式可知:78880()()(())(())()nxnhnxmhnmGn8(())xm与8(())hm的图形如下:根据下面图表可计算得到圆卷积:当0n时:111110000000321000003000取和得到圆卷积为3。当1n时:111110000000032100000000取和得到圆卷积为0。当2n时:111110001000003200000000取和得到圆卷积为1。当3n时:111110002100000321000000取和得到圆卷积为3。当4n时:111110003210000032100000取和得到圆卷积为6。当5n时:111110000321000003210000取和得到圆卷积为6。当6n时:111110000032100000321000取和得到圆卷积为6。当7n时:111110000003210000032000取和得到圆卷积为5。得到波形如下:(2)()xn与()hn的5点圆卷积,由公式可知:44440()()(())(())()nxnhnxmhnmGn4(())xm与4(())hm的图形如下:根据图标可计算得到圆卷积:当0n时:111110321003210取和得到圆卷积为6。当1n时:111110032100321取和得到圆卷积为6。当2n时:111111003210032取和得到圆卷积为6。当3n时:111112100321003取和得到圆卷积为6。当4n时:111113210032100取和得到圆卷积为6。画出波形如下:四、仿真实验Matlab程序设计如下:编写的循环卷积程序:方法一:直接根据定义计算,程序编辑如下:functiony=circonv1(x1,x2,N)iflength(x1)Nerror('Nmustnotbelessthanlengthofx1')endiflength(x2)Nerror('Nmustnotbelessthanlengthofx2')endx1=[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);forn=1:1:NH(n,:)=cd(x2,n-1,N);endy=x1*H';functiony=cd(x,m,N)iflength(x)Nerrorendx=[xzeros(1,N-length(x))];n=[0:1:N-1];n=mod(n-m,N);y=x(n+1);方法二:根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积functiony=circonv2(x1,x2,N)iflength(x1)Nerror('Nmustnotbelessthanlengthofx1')endiflength(x2)Nerror('Nmustnotbelessthanlengthofx2')endX1k=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中的大小写的严格区别,导致程序运行错误。经过反复检查之后发现了错误,经改正后得到了正确的运行结果。收获很大。