实验四 循环卷积和线性卷积的实现
1、实验目的
1.进一步了解并掌握循环卷积与线性卷积的概念
2.掌握线性卷积与循环卷积软件实现的方法,理解掌握二者的关系
2、实例分析与计算
实验原理:
两个序列的N点循环卷积定义为
从定义中可以看出,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环卷积的结果认为N点序列,而它们的线性卷积的结果的长度则为2N-1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。
圆卷积与线卷积结果完全不同,出现这种差异的实质是:线卷积过程中,经反褶再向右平移的序列,在左端将依次留出空位,而圆卷积过程中,经反褶做圆移的序列,向右移去的样值又从左端循环出现,这样就使两种情况下相乘、叠加所得之数值截然不同。
根据DFT循环卷积性质中的卷积定理
可通过两种方法求两个序列的循环卷积:一是直接根据定义计算;二是根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积。第二种方法看起来要经过若干个步骤,但由于求序列的DFT和IDFT都有快速算法,因此它的效率比第一种方法高得多。
已知有线长序列如图题5-8所示,试画出
(1)与的线卷积;
(2)与的4点圆卷积;
(3)与的10点圆卷积;
(4)欲使与的圆卷积和线卷积相同,求长度L之最小值
解:(1)线卷积
m 0 1 2 3
X(m) 0.5 1 1 0.5
H(m) 0.5 0 0 0 y(0)=0.5x0.5=0.25
1 0.5 0 0 y(1)=1x0.5+1x0.5=1
1 1 0.5 0 y(2)=1x0.5+1x1+1x0.5=2
0.5 1 1 0.5 y(3)=0.5x0.5+1x1+1x1+0.5x0.5=2.5
0 0.5 1 1 y(4)=0.5x1+1x1+0.5x1=2
0 0 0.5 1 y(5)=0.5x1+0.5x1=1
0 0 0 0.5 y(6)=0.5x0.5=0.25
0 0 0 0 y(7)=0
(2)
0 1 2 3
0.5 1 1 0.5
0.5 0.5 1 1
y(0)=0.5x0.5+1x0.5+1x1+0.5x1=
0 1 2 3
0.5 1 1 0.5
1 0.5 0.5 1
y(1)=0.5x1+1x0.5+1x0.5+0.5x1=2
0 1 2 3
0.5 1 1 0.5
1 1 0.5 0.5
y(2)=0.5x1+1x1+1x0.5+0.5x0.5=
0 1 2 3
0.5 1 1 0.5
0.5 1 1 0.5
y(3)=0.5x0.5+1x1+1x1+0.5x0.5=2.5
(3)
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0.5 0 0 0 0 0 0 0.5 1 1
y(0)=0.5x0.5=0.25
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
1 0.5 0 0 0 0 0 0 0.5 1
y(1)=0.5x1+1x0.5=1
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
1 1 0.5 0 0 0 0 0 0 0.5
y(2)=0.5x1+1x1+1x0.5=2
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0.5 1 1 0.5 0 0 0 0 0 0
y(3)=0.5x0.5+1x1+1x1+0.5x0.5=2.5
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0.5 1 1 0.5 0 0 0 0 0
y(4)=1x0.5+1x1+0.5x1=2
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0 0.5 1 1 0.5 0 0 0 0
y(5)=1x0.5+0.5x1=1
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0 0 0.5 1 1 0.5 0 0 0
y(6)=0.5x0.5=0.25
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0 0 0 0.5 1 1 0.5 0 0
y(7)=0
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0 0 0 0 0.5 1 1 0.5 0
y(8)=0
0 1 2 3 4 5 6 7 8 9
0.5 1 1 0.5 0 0 0 0 0 0
0 0 0 0 0 0 0.5 1 1 0.5
y(9)=0
(4)
LM+N-1=4+4-1=7
所以L的最小长度为7
3、应用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,:)=cirshiftd(x2,n-1,N);
end
y=x1*H';
function y=cirshiftd(x,m,N)
% 输出序列含循环移位(y=Output sequence contains circular shift。)
% 输入序列长度x<=N。
% 样本位移m=sample shift.
% 循环范围N=size of circular buffer.
% 模式:y(n)=x((n-m)mod N).
if length(x)>N
error('N 必须大于等于x 的长度!')
end
x=[x zeros(1,N-length(x))];
n=[0:1:N-1];
n=mod(n-m,N);
y=x(n+1);
上述函数直接利用循环函数的定义。本来最简单的方法是用两个for循环嵌套,但是这样的效率显然很低。因此,这里采用矩阵计算的方法,即先生成矩阵H,它的第k行包括序列 ,这样,矩阵H与序列相乘的结果就是两个序列的循环卷积。这种方案的效率有很大的提高。
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:3];m=[0:1:3]; N1=length(n);N2=length(m);
xn=[0.5,1,1,0.5];
hn=xn;
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);
axis[0,10,0,3];
4、总结
通过本次实验仿真,对线卷积与圆卷积有了更深一步的了解,它们的计算结果完全不同,且结果表明,在补零扩展后的长度L不应小于前面求的的线卷积长度M+N-1,亦即满足LM+N-1的条件下,圆卷积与线卷积的结果一致。
本文来源:https://www.2haoxitong.net/k/doc/fc39680f581b6bd97f19eadf.html
文档为doc格式