目录
1,序列:x(n)=u(n-2)-u(n-10),h(n)=((0.9)^n)*u(n)
2,信号x(t)=2[u(t+1)-u(t-1)],h(t)=u(t+2)-u(t-2)
3,信号:x=u(t)-u(t-4),h=u(t)*sin(Πt)
接下来绘制的是下面对应序列及信号卷积的波形图👇
- 序列:x(n)=u(n-2)-u(n-10),h(n)=((0.9)^n)*u(n)
- 信号:x(t)=2[u(t+1)-u(t-1)],h(t)=u(t+2)-u(t-2)
- 信号:x=u(t)-u(t-4),h=(ut)*sin(Πt)
如果遇到其它的序列或者是信号,要绘制它们卷积的波形图,都可以使用本文代码。
1,序列:x(n)=u(n-2)-u(n-10),h(n)=((0.9)^n)*u(n)
设h(n)=(0.9)^n*u(n),输入x(n)=u(n-2)-u(n-10),求系统输出y(n)=x(n)*h(n)。
1)前期基础
①conv函数
关于卷积,matlab软件中就有指定的内置函数conv,如下为该函数的官方解释:
知道了有这个conv函数之后我就可以开始直接绘制了吗?答案是:不,还不可以直接绘制。
结合《信号与系统》及《数字信号处理》等书籍,可知:
- 如果两个序列x(n)和h(n)为有限长序列,那么它们的卷积和序列y(n)也是有限长序列,且卷积和序列y(n)的长度为卷积序列长度之和-1,即L=M+N-1。L为卷积和序列的长度,M和N分别为两个卷积序列的长度。
因此,如果我想要成功的绘制出卷积和序列,那么我得需要知道该卷积和序列y的起始和终止位置。不然,就无法成功绘制。
- 卷积和序列y的起始点=两个待卷积序列的起始点相加 (即: start_x+start_h 或 nx(1)+nh(1)) ;
- 卷积和序列y的终止点=两个待卷积序列的非零采样值的宽度+两个待卷积序列的起始点。
- 注意:因为卷积会导致时间轴扩展,所以我需要去调整卷积和序列y的时间轴来匹配使用了conv函数得到的卷积结果y
②离散单位阶跃信号
观察所要绘制的序列,可以看到,x,h序列都是有关单位阶跃序列的表达式,因此,我接下来就需要去了解离散单位阶跃信号该如何绘制。
在这篇文章👇中
matlab学习001-简单的矩阵输入运算及绘制信号曲线-CSDN博客
我已经知道了使用heaviside函数可以绘制单位阶跃信号(连续时间域),如果想要绘制离散的单位阶跃信号可以使用下面的表达式:
u=(t>n); % n=0,1,2,3,4,5,....N
绘制出的图像如下:
如果使用heaviside函数来绘制离散时间序列的话,就不符合离散时间序列的定义:在0处取值1。
知道了以上的信息之后,我就可以开始绘制卷积和序列。下面是绘制出来的图像和代码:
2)波形图
3)代码
①使用input方法
startx=input('序列x的起始点startx=');
endx=input('序列x的终止点endx=');
starth=input('序列h的起始点starth=');
endh=input('序列h的终止点endh=');
nx=startx:endx; % h序列的采样长度
nh=starth:endh; % x序列的采样长度
starty=startx+starth; % 卷积和序列y的起始位置为两序列的起始位置相加
widey=(endx-startx+1)+(endh-starth+1)-2; %卷积和序列的非零次采样值的宽度(即序列有多少个间隔)
endy=widey+starty; % 卷积和序列y的终止位置=y序列的起始值+y序列的非零采样值的宽度
ny=starty:endy; % y序列的采样长度
h=0.9.^nh.*(nh>=0); %h(n)=(0.9)^n*u(n)
x=(nx>=2)-(nx>=10); %x(n)=u(n-2)-u(n-10)
y=conv(h,x); %y(n)=x(n)*h(n)
subplot(221);
stem(nh,h); %stem函数用于绘制离散时间序列
title('冲击响应h(n)');
xlabel('n');
ylabel('h');
axis([0 25 0 2]);
subplot(222);
stem(nx,x);
title('输入序列x(n)');
xlabel('n');
ylabel('x');
axis([0 12 0 2]);
subplot(223);
stem(ny,y);
title('输出序列y(n)');
xlabel('n');
ylabel('y');
axis([0 25 0 6]);
也可以不使用input方法,可以将上面的input方法删掉,等号后面直接写上指定的数值即可。
上面的代码还不够好,可以使用如下代码:
②代码改进【推荐使用】
p=1; % 抽样间隔,绘制离散时间序列,可以指定抽样间隔为1
nx=(-5:p:15); % x序列的时间序列
nh=(-5:p:23); % h序列的时间序列
x=(nx>=2)-(nx>=10); % x序列的表达式
h=(0.9).^nh.*(nh>=0);
y=conv(h,x); %y(n)=x(n)*h(n)
y=y*p;
starty=nx(1)+nh(1); % 求卷积序列y的时间序列起始位置
widey=length(nx)+length(nh)-2; %卷积序列y的时间序列间隔
endy=starty+widey*p; % 卷积序列y的时间序列终止位置
ny=(starty:p:endy); % 卷积序列y的时间序列
subplot(221);
stem(nh,h); %stem函数用于绘制离散时间序列
grid on; % 打开网格线
title('冲击响应h(n)');
xlabel('n');
ylabel('h');
%axis([-1 10 -1.2 1.2]); % 指定序列在x和y坐标轴的起始结束位置
%grid off; % 关闭网格线
subplot(222);
stem(nx,x);
grid on;
title('输入序列x(n)');
xlabel('n');
ylabel('x');
%axis([-1 6 0 1.5]);
subplot(223);
h=get(gca,'position');
h(3)=1.5*h(3); % 第三个子图的横坐标变为原来的1.5倍
set(gca,'position',h);
sizeny=size(ny); %作为函数返回值的其中一个打印出来
disp(sizeny); % 调用方法disp,用于在命令行窗口打印y序列的长度sizeny变量
sizey=size(y);
disp(sizey); % 调用方法disp,用于在命令行窗口打印y序列的长度sizey变量
stem(ny,y);
grid on;
title('输出序列y(n)');
xlabel('n');
ylabel('y');
%axis([-6 20 -0.7 0.7]);
绘制的波形图如下:
2,信号x(t)=2[u(t+1)-u(t-1)],h(t)=u(t+2)-u(t-2)
因为在1中已经使用代码绘制了离散的(非三角)序列,所以,上面的代码依旧适用,我只需要:
- 将采样时间间隔p修改成0.01(使得绘制出来的波形更加接近我们想要的信号图像)
- 将x和h修改成对应的信号
- 之后将stem函数修改成plot函数就行。
1)波形图
2)代码
p=0.01; % 抽样间隔,
nx=(-5:p:15); % x序列的时间序列
nh=(-5:p:23); % h序列的时间序列
x=2.*(heaviside(nx+1)-heaviside(nx-1));
h=heaviside(nh+2)-heaviside(nh-2);
y=conv(h,x); %y(n)=x(n)*h(n)
y=y*p;
starty=nx(1)+nh(1); % 求卷积序列y的时间序列起始位置
widey=length(nx)+length(nh)-2; %卷积序列y的时间序列间隔
endy=starty+widey*p; % 卷积序列y的时间序列终止位置
ny=(starty:p:endy); % 卷积序列y的时间序列
subplot(221);
plot(nh,h); %plot函数用于绘制连续时间序列
grid on; % 打开网格线
title('冲击响应h(n)');
xlabel('n');
ylabel('h');
%axis([-1 10 -1.2 1.2]); % 指定序列在x和y坐标轴的起始结束位置
%grid off; % 关闭网格线
subplot(222);
plot(nx,x);
grid on;
title('输入序列x(n)');
xlabel('n');
ylabel('x');
%axis([-1 6 0 1.5]);
subplot(223);
h=get(gca,'position');
h(3)=1.5*h(3); % 第三个子图的横坐标变为原来的1.5倍
set(gca,'position',h);
sizeny=size(ny); %作为函数返回值的其中一个打印出来
disp(sizeny); % 调用方法disp,用于在命令行窗口打印y序列的长度sizeny变量
sizey=size(y);
disp(sizey); % 调用方法disp,用于在命令行窗口打印y序列的长度sizey变量
plot(ny,y);
grid on;
title('输出序列y(n)');
xlabel('n');
ylabel('y');
%axis([-6 20 -0.7 0.7]);
3,信号:x=u(t)-u(t-4),h=u(t)*sin(Πt)
1)波形图
2)代码
①代码【推荐使用】
nx=(-6:0.01:9); % x序列的时间序列
nh=(-9:0.01:8); % h序列的时间序列
p=0.01; % 抽样间隔
% 定义信号x(t) = u(t) - u(t-4)
x = double(nx >= 0) - double(nx >= 4); % double函数可用来绘制单位阶跃信号,也可以使用heaviside函数。
% 定义信号h(t) = u(t) * sin(πt)
h = double(nh >= 0) .* sin(pi*nh);
% 计算卷积y(t) = x(t) ⊗ h(t)
y = conv(x, h, 'full');
y=y*p;
starty=nx(1)+nh(1); % 求卷积序列y的时间序列起始位置
widey=length(nx)+length(nh)-2; %卷积序列y的时间序列间隔
endy=starty+widey*p; % 卷积序列y的时间序列终止位置
ny=(starty:p:endy); % 卷积序列y的时间序列
subplot(221);
plot(nh,h);
grid on; % 打开网格线
title('冲击响应h(n)');
xlabel('n');
ylabel('h');
axis([-1 10 -1.2 1.2]);
%grid off; % 关闭网格线
subplot(222);
plot(nx,x);
grid on;
title('输入序列x(n)');
xlabel('n');
ylabel('x');
axis([-1 6 0 1.5]);
subplot(223);
h=get(gca,'position');
h(3)=1.5*h(3); % 第三个子图的横坐标变为原来的1.5倍
set(gca,'position',h);
sizeny=size(ny); %作为函数返回值的其中一个打印出来
disp(sizeny); % 调用方法disp,用于在命令行窗口打印y序列的长度sizeny变量
sizey=size(y);
disp(sizey); % 调用方法disp,用于在命令行窗口打印y序列的长度sizey变量
plot(ny,y);
grid on;
title('输出序列y(n)');
xlabel('n');
ylabel('y');
axis([-6 20 -0.7 0.7]);
也可以将两个序列**(x和y序列 )的时间序列设置为一样**的,对应的代码就可以如下写👇
②代码
n=(0:0.01:8); % 定义时间轴
% 定义信号x(t) = u(t) - u(t-4)
x = (n >= 0) - (n >= 4);
% 定义信号h(t) = u(t) * sin(πt)
h = (n >= 0) .* sin(pi.*n);
% 计算卷积y(t) = x(t) ⊗ h(t)
y = conv(x, h, 'full');
starty=n(1); % 求卷积序列y的时间序列起始位置
endy=length(y)-(0-n(1)+1); % 卷积序列y的时间序列终止位置
match=(n(2)-n(1)); % 因为卷积会导致时间轴扩展,需要调整时间轴以匹配卷积结果
ny=(starty:endy)*match; % 卷积序列y的时间序列
subplot(221);
plot(n,h);
grid on; % 打开网格线
title('冲击响应h(n)');
xlabel('n');
ylabel('h');
%axis([-1 10 -1.2 1.2]);
%grid off; % 关闭网格线
subplot(222);
plot(n,x);
grid on;
title('输入序列x(n)');
xlabel('n');
ylabel('x');
%axis([-1 6 0 1.5]);
subplot(223);
h=get(gca,'position');
h(3)=1.5*h(3); % 第三个子图的横坐标变为原来的1.5倍
set(gca,'position',h);
sizeny=size(ny); %作为函数返回值的其中一个打印出来
disp(sizeny); % 调用方法disp,用于在命令行窗口打印y序列的长度sizeny变量
sizey=size(y);
disp(sizey); % 调用方法disp,用于在命令行窗口打印y序列的长度sizey变量
plot(ny,y);
grid on;
title('输出序列y(n)');
xlabel('n');
ylabel('y');
%axis([-6 20 -0.7 0.7]);
绘制的波形图:
有问题请在评论区留言或者是私信我,1天8h在线。