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

相关推荐
rit843249912 小时前
有限元法求转子临界转速的MATLAB实现
开发语言·matlab
Matlab程序设计与单片机12 小时前
【机器人最短路径规划】基于标准蚁群算法
matlab·蚁群算法·路径规划问题
Marye_爱吃樱桃12 小时前
MATLAB R2024b的安装、简单设置——保姆级教程
开发语言·matlab
IT猿手1 天前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
【建模先锋】1 天前
创新首发!基于注意力机制优化的高创新故障诊断模型
深度学习·信号处理·故障诊断·特征融合·轴承故障诊断·fft变换·vmd分解
Evand J1 天前
【MATLAB复现RRT(快速随机树)算法】用于二维平面上的无人车路径规划与避障,含性能分析与可视化
算法·matlab·平面·无人车·rrt·避障
s09071361 天前
【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
开发语言·算法·matlab·合成孔径声呐·后向投影算法·条带拼接
IT猿手1 天前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手1 天前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队
SugarFreeOixi1 天前
MATLAB绘图风格记录NP类型
python·matlab·numpy