循环卷积与线性卷积的实现

更新时间:2024-02-27 20:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验五 循环卷积与线性卷积的实现

一、实验目的

(1) 进一步理解并掌握循环卷积与线性卷积的概念; (2) 理解掌握二者的关系。

二、实验原理

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

[h(n)?x(n)]N??h(m)x((n?m))N (0?n?N)k?0N?1从定义中可以看到,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环

卷积结果仍为N点序列,而它们的线性卷积的结果长度则为2N-1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。正是这些不同,导致了线性卷积和循环卷积有不同的结果和性质。

两个序列的N点循环卷积是它们的线性卷积以N为周期的周期延拓。设序列h(n)的长度为N1,序列x(n)的长度为N2,此时线性卷积结果的序列点数为N'?N1?N2?1;因此如果循环卷积的点数N小于N1?N2?1,那么上述周期性延拓的结果就会产生混叠,从而两种卷积会有不同的结果。而如果满足N?N'的条件,就有循环卷积与线性卷积的结果在0?n?N范围内相同。

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

DFT{[h(n)?x(n)]N}?DFT[x(n)]?DFT[h(n)]

因此可以根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积。

三、实验分析

例题:已知有限长序列x(n)与h(n)如下图所示, (1) 画出两者之间的线性卷积 (2) 8点圆卷积。 (3) 5点圆卷积。

解析如下:

(1)x(n)与h(n)的线性卷积,由公式可知:

h(n)*x(n)?m????x(m)h(n?m)

?x(m)与h(?m)的图形如下:

利用方格平移法:

1 3 2 1 0 0

由方格平移法可知: 当n?0时,h(n)*x(n)?0 当n?1时,h(n)*x(n)?0

当n?2时,h(n)*x(n)?0*1?1*1?1 当n?3时,h(n)*x(n)?2*1?1*1?0*1?3 当n?4时,h(n)*x(n)?3*1?2*1?1*1?0*1?6 当n?5时,h(n)*x(n)?3*1?2*1?1*1?0*1?6 当n?6时,h(n)*x(n)?3*1?2*1?1*1?6 当n?7时,h(n)*x(n)?3*1?2*1?5 当n?8时,h(n)*x(n)?3*1?3

1 1 1 1

得到图形如下:

(2)x(n)与h(n)的8点圆卷积,由公式可知:

x(n)?h(n)??x((m))8h((n?m))8G8(n)

n?07x((m))8与h((?m))8的图形如下:

根据下面图表可计算得到圆卷积: 当n?0时: 1 1 1 1 0 0 0 0 0 0 0 0 1 3 3 0 2 0 0 1 0 0 0 0 取和得到圆卷积为3。

当n?1时: 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 3 0 0 2 0 0 1 0 取和得到圆卷积为0。

当n?2时: 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 3 0 0 2 0 取和得到圆卷积为1。

当n?3时: 1 1 2 2 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 3 0 取和得到圆卷积为3。

当n?4时: 1 1 3 3 2 2 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 取和得到圆卷积为6。

当n?5时: 1 1 0 0 3 3 1 2 2 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 取和得到圆卷积为6。

当n?6时: 1 1 0 0 0 0 1 3 3 1 2 2 1 1 1 0 0 0 0 0 0 0 0 0 取和得到圆卷积为6。

当n?7时: 1 1 0 0 0 0 1 0 0 1 3 3 1 2 2 0 1 0 0 0 0 0 0 0 取和得到圆卷积为5。

得到波形如下:

(2)x(n)与h(n)的5点圆卷积,由公式可知:

x(n)?h(n)??x((m))4h((n?m))4G4(n)

n?04x((m))4与h((?m))4的图形如下:

根据图标可计算得到圆卷积: 当n?0时: 1 1 0 0 取和得到圆卷积为6。

1 2 2 1 1 1 1 0 0 3 3

当n?1时:

1 0 0 取和得到圆卷积为6。

当n?2时: 1 1 1 取和得到圆卷积为6。

当n?3时: 1 2 2 取和得到圆卷积为6。

当n?4时: 1 3 3 取和得到圆卷积为6。

画出波形如下:

1 0 0 1 3 3 1 2 2 1 1 1 1 0 0 1 0 0 1 3 3 1 2 2 1 1 1 1 0 0 1 0 0 1 3 3 1 2 2 1 1 1 1 0 0 1 0 0

四、仿真实验

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中的大小写的严格区别,导致程序运行错误。经过反复检查之后发现了错误,经改正后得到了正确的运行结果。收获很大。

本文来源:https://www.bwwdw.com/article/kyea.html

Top