matlab序列的运算
实验三 序列的运算
一、实验内容
1、序列的乘积:仿真并完成例题1.22
2、序列的移位:编写seqshift()函数,实现序列的移位,并作图验证。
3、序列的卷积:编写convwthn()函数,实现具体序列的卷积,并且进行理论计算,比较结果。
4、序列的相关:仿真并完成例题1.24
二、MATLAB仿真 1、序列的乘积
解:
function [y,n] = seqadd(x1,n1,x2,n2) n=min((n1),min(n2)):max((n1):max(n2)); y1=zeros(1,length(n));y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; y=y1+y2;
function [y,n] = seqmult(x1,n1,x2,n2); n=min((n1),min(n2)):max((n1):max(n2)); y1=zeros(1,length(n));y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; y=y1.*y2;
代码:
clc;clear all;
x1=[1,3,5,7,6,4,2,1];ns1=-3; x2=[4,0,2,1,-1,3];ns2=1; nf1=ns1+length(x1)-1; nf2=ns2+length(x2)-1; n1=ns1:nf1; n2=ns2:nf2;
n=min(ns1,ns2):max(nf1:nf2); y1=zeros(1,length(n));y2=y1;
y1(find((n>=ns1)&(n<=nf1)==1))=x1; y2(find((n>=ns2)&(n<=nf2)==1))=x2; ya=y1+y2; ym=y1.*y2;
2
subplot(221);
stem(n1,x1,'*','r'); ylabel('x1(n)'); grid;
subplot(223);
stem(n2,x2,'*','r'); xlabel('n');
ylabel('x2(n)'); grid;
subplot(222);
stem(n,ya,'*','r'); ylabel('y1(n)+y2(n)'); grid;
subplot(224);
stem(n,ym,'*','r'); xlabel('n');
ylabel('y1(n)*y2(n)'); grid;
如图1所示。
clc;clear all;
x1=[1,3,5,7,6,4,2,1]; ns1=-3;
x2=[4,0,2,1,-1,3]; ns2=1;
nf1=ns1+length(x1)-1; nf2=ns2+length(x2)-1; n1=ns1:nf1; n2=ns2:nf2;
[ya,n] = seqadd(x1,n1,x2,n2); [ym,n] = seqmult(x1,n1,x2,n2); subplot(221);
stem(n1,x1,'*','r'); ylabel('x1(n)'); grid;
subplot(223);
stem(n2,x2,'*','r'); xlabel('n');
ylabel('x2(n)'); grid;
subplot(222);
stem(n,ya,'*','r');
3
ylabel('y1(n)+y2(n)'); grid;
subplot(224);
stem(n,ym,'*','r'); xlabel('n');
ylabel('y1(n)*y2(n)'); grid;
图1
4
2、序列的移位 解:
function [y,ny] = seqshift(x,nx,m) ny = nx+m; y = x;
代码:
clc;clear all x=[1,2,3,4,5]; nx=-2:2; m=2; %
向右移2个单位
[y,ny] = seqshift(x,nx,m); subplot(211);
stem(nx,x,'*','r'); title('
原序列x(n)');
xlabel('n'); ylabel('x(n)'); subplot(212);
stem(ny,y,'*','r'); title('
移位后序列y(n)');
xlabel('n'); ylabel('y(n)'); grid;
如下图2所示:
5
图2
3、序列的卷积 解:
function [y,ny] = convwthn(x,nx,h,nh) ny1 = nx(1)+nh(1);
ny2 = nx(end)+nh(end); y = conv(x,h); ny = (ny1:ny2);
代码:
clc;clear all;
x = [1,2,3,-1,-2]; nx = -1:3;
h = [2,2,1,-1,4,-2]; nh = -3:2;
[y,ny] = convwthn(x,nx,h,nh); stem(ny,y,'*','r'); xlabel('n'); ylabel('y(n)'); grid;
x(n)与h(n)相卷积得到的图形如图3所示:
6
图3
4、序列的相关 解:
function [y,ny] = convwthn(x,nx,h,nh) ny1 = nx(1)+nh(1);
ny2 = nx(end)+nh(end); y = conv(x,h); ny = (ny1:ny2);
7
代码:
clc;clear all
x = [2,1,3,2,1,5,1]; nx = 1:7;
y = [2,1,3,4]; ny = 1:4;
N1 = length(x)-1; N2 = length(y)-1;
rxy = convwthn(fliplr(y),-ny,x,nx); k = -(N2):N1;
stem(k,rxy,'*','r'); xlabel('n');
ylabel('rxy(n)'); title('
x(n)与y(n)之间的互相关');
axis([-N2,N1,0,35]); grid;
8
图4
9
三、实验小结
通过这次实验使我知道序列的卷积可以通过matlab实现。Matlab里本身有丰富的库函数,画图,求卷积各种运算只要调用相应的库函数即可。本次实验的难点就在conv()函数和各序列长度的计算,如果不注意其中的计算关系很容易出错。而conv()函数只要写错,后面的图形就不能准确的绘制出来。
10
因篇幅问题不能全部显示,请点此查看更多更全内容