仿真实验四 循环卷积和线性卷积的实现

发布时间:2019-07-27 15:02:40   来源:文档文库   
字号:

实验四 循环卷积和线性卷积的实现

1、实验目的

1.进一步了解并掌握循环卷积与线性卷积的概念

2.掌握线性卷积与循环卷积软件实现的方法,理解掌握二者的关系

2、实例分析与计算

实验原理:

两个序列的N点循环卷积定义为

从定义中可以看出,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环卷积的结果认为N点序列,而它们的线性卷积的结果的长度则为2N-1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。

圆卷积与线卷积结果完全不同,出现这种差异的实质是:线卷积过程中,经反褶再向右平移的序列,在左端将依次留出空位,而圆卷积过程中,经反褶做圆移的序列,向右移去的样值又从左端循环出现,这样就使两种情况下相乘、叠加所得之数值截然不同。

根据DFT循环卷积性质中的卷积定理

可通过两种方法求两个序列的循环卷积:一是直接根据定义计算;二是根据性质先分别求两个序列的NDFT,并相乘,然后取IDFT以得到循环卷积。第二种方法看起来要经过若干个步骤,但由于求序列的DFTIDFT都有快速算法,因此它的效率比第一种方法高得多。

已知有线长序列如图题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》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式