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在线。

相关推荐
yong99903 小时前
基于小波分析与粒子群算法的电网潮流优化实现(MATLAB)
开发语言·算法·matlab
Dev7z3 小时前
基于MATLAB HSI颜色空间的图像美颜系统设计与实现
开发语言·matlab
竹一阁4 小时前
跟踪导论(十二)——卡尔曼滤波的启动:初始参数的设置
算法·信号处理·雷达·信号与系统
ghie90904 小时前
MATLAB 高速公路裂缝检测
开发语言·matlab
天呐草莓7 小时前
热传导方程
算法·matlab
hoiii1878 小时前
基于MATLAB实现无监督数据建模
开发语言·matlab
kaikaile19959 小时前
使用纯MATLAB M函数实现的无刷直流电机控制系统仿真
开发语言·matlab
崇山峻岭之间9 小时前
Matlab学习记录09
开发语言·学习·matlab
Dargon28821 小时前
实例讲解Simulink的MATLAB Function模块
开发语言·matlab·simulink·mbd软件开发
崇山峻岭之间1 天前
Matlab学习记录05
开发语言·学习·matlab