matlab学习004-使用matlab绘制卷积波形图

目录

 1,序列:x(n)=u(n-2)-u(n-10),h(n)=((0.9)^n)*u(n)

1)前期基础 

①conv函数 

②离散单位阶跃信号 

2)波形图 

3)代码

①使用input方法

②代码改进【推荐使用】

2,信号x(t)=2[u(t+1)-u(t-1)],h(t)=u(t+2)-u(t-2) 

1)波形图

2)代码

3,信号:x=u(t)-u(t-4),h=u(t)*sin(Πt)

 1)波形图

2)代码 

 ①代码【推荐使用】

 ②代码


 接下来绘制的是下面对应序列及信号卷积的波形图👇

  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=(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的起始和终止位置。不然,就无法成功绘制。

  1. 卷积和序列y的起始点=两个待卷积序列的起始点相加                                                                (即:            start_x+start_h                      或                            nx(1)+nh(1))           ;
  2. 卷积和序列y的终止点=两个待卷积序列的非零采样值的宽度+两个待卷积序列的起始点。
  3. 注意:因为卷积会导致时间轴扩展,所以我需要去调整卷积和序列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中已经使用代码绘制了离散的(非三角)序列,所以,上面的代码依旧适用,我只需要:

  1. 将采样时间间隔p修改成0.01(使得绘制出来的波形更加接近我们想要的信号图像)
  2. 将x和h修改成对应的信号
  3. 之后将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在线。

  • 20
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值