一、实验目的
1.利用MATLAB实现循环卷积。
2.比较循环卷积与线性卷积的区别。
二、实验条件
PC机,MATLAB7.0
三、实验内容
1)循环卷积的定义:两个序列的N点循环卷积定义为:
[h(n)x(n)]Nh(m)x(nm)N(0nN)k0N1
利用MATLAB实现两个序列的循环卷积可以分三个步骤完成:
(1)初始化:确定循环点数N,测量输入2个序列的长度。
(2)循环右移函数:将序列x(n)循环右移,一共移N次(N为循环卷积的循环次数),最后将每次循环成的新序列组成一个矩阵V。
(3)相乘:将x(n)移位后组成的矩阵V与第二个序列h(n)对应相乘,即得循环卷积结果。程序如下:
程序一:
clear;close all;
N=10;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(3,1,1);
stem(xxn1,x1);
subplot(3,1,2);
stem(xxn2,x2);
x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
运行后所得图形如下:
观察所得的循环卷积结果发现并没有呈现周期性的序列,因此将程序做下列改变。程序二:
clear;close all;
N=40;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
x2=[x2,x2,x2,x2];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(3,1,1);
stem(xxn1,x1);
subplot(3,1,2);
stem(xxn2,x2);
x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
从图中可以看出循环卷积的结果已经呈循环序列。将程序进一步改进——在x2序列之间加一些零矩阵;程序如下:
clear;close all;
N=50;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
x2=[x2,zeros(1,7),x2,zeros(1,7),x2,zeros(1,7),x2];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(3,1,1);
stem(xxn1,x1);
subplot(3,1,2);
stem(xxn2,x2);
x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
2)线性卷积与循环卷积的区别:
从循环卷积的定义公式中可以看出,循环卷积和线性卷积的不同之处在于:①两个N点序列的N点循环卷积的结果仍为N点序列,而两个N点序列线性卷积的结果的长度则变为为2N-1;②循环卷积对序列的移位采取循环移位,而线性卷积对序列则是采取线性位移。而就是这两点不同,导致循环卷积和线性卷积有不同的结果和性质。
然而虽然循环卷积和线性卷积虽然是不同的概念,但是它们之间有一个有意义的公式联系
y(n)[h(n)x(n)]Ny'(nrN)GN(n)r在一起,其中y'(n)h(n)*x(n);也就是说,两个序列的N
点循环卷积是他们的线性卷积以N为周期的周期延阔。设序列h(n)的长度为N1,序列x(n)的长度为N2,此时,线性卷积结果的序列的点数为N'N1N2-1;因此如果循环卷积的点数N小于
N1N21,那么上述周期性延阔的结果就会产生混叠,从而两种卷积会有不同的结果。而如果
N满足NN'的条件,就会有y(n)y'(n)(0nN)。这就会意味着在时域不会产生混叠。因此,可以得出结论:若通过在序列的末尾填充适当的零值,使得x(n)和h(n)成为N1N21点序
列,并作出这两个序列的N1N21循环卷积与线性卷积的结果在0nN范围内相同。
将循环卷积的结果与线性卷积做对比,程序如下:
clear;close all;
N=50;
x1=[6 15 -6 3 5 7 0 1];
x21=[7 1 2 9 4 3 20 6];
x2=[x21,zeros(1,7),x21,zeros(1,7),x21,zeros(1,7),x21];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(4,1,1);
stem(xxn1,x1);
subplot(4,1,2);
stem(xxn2,x2);
x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(4,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
y2=conv(x1,x21);
subplot(4,1,4)
stem(y2,'.');
title('线性卷积的结果');
xlabel('n');ylabel('y2(n)');
关于循环卷积,需要知道循环卷积仅仅是针对离散傅里叶变换;然而,这里的循环是针对周期序列而言的;而线性卷积是针对有限长序列,要用DFT求线性卷积,必然要求周期序列的一个周期内求卷积能和有限长序列求线性卷积等值。因此需要求N点长度的循环卷积必然要和线性卷积的长度一致。至少N要不少于线性卷积的长度。
四、实验结论和讨论
1.学习了与循环卷积相关的概念,知道了有限长序列的循环移位是指y((m-n))RN(n),也就是先让序列y(n)以N为周期进行周期延拓,再进行反折,然后朝右移位,只朝一个方向移位的原因是:对周期序列向右移动一个位置,也就相当于向左移动了N-1个位置,最后取(0,N-1)的N个值就得到了循环移位后的N个序列值。 设有序列x(n)和y(n),其N点循环卷积为:
Y(m)h(m)x((nm))NRN(n)k0N1由于循环移位的关系最后得到的循环卷积的长度就是N点,
m取[0,1,2,„,N-1]。循环卷积的简介表示为:
Y(m)h(n)x(n)。
熟知了循环卷积的算法以及如何用MATLAB实现循环卷积的运算。一共分为三步分别是初始化:确定循环点数N,测量输入2个序列的长度,长度小于N的在后面补0;循环右移函数:将序列x(n)循环右移,一共移N次(N为循环卷积的循环次数),最后将每次循环成的新序列组成一个矩阵V;相乘:将x(n)移位后组成的矩阵V与第二个序列h(n)对应相乘,即得循环卷积结果。
2.再次复习了一边线性卷积的相关性质,比较了线性卷积与循环卷积之间相同与不同之处。知道当循环卷积L>=线性卷积的长度时,线性卷积的结果与循环卷积的结果是相等的;但是循环卷积首先长度是不变的,而线性卷积的长度是L1+L2-1,也就是说积分或者求和的上限是不一样的,前者是1:N,而后者是无穷。
3.通过这次设计我也发现了自身存在的一些问题,程序的逻辑虽然在脑海中能有一个大概的轮廓,但是要将它实现并写出完整的程序却还是有些困难。虽然这次程序在老师的指导和帮助下写了出来,但是在一些基础的语言结果比如零矩阵的数输写还无法在没有程序的参考下写出来。这也体现了我对MATLAB还不熟悉,需要更多的练习来巩固和完善自己。
因篇幅问题不能全部显示,请点此查看更多更全内容