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

相关推荐
凌晨7点19 分钟前
拓展:simulink中将仿真环境离散化
matlab·simulink
Evand J1 小时前
【PSINS工具箱】MATLAB例程,二维平面上的组合导航,EKF融合速度、位置和IMU数据,4维观测量
开发语言·matlab·平面
凌晨7点16 小时前
控制建模matlab练习14:线性状态反馈控制器-③极点配置
matlab
khystal19 小时前
HUMS 2023齿轮箱数据分析
数据库·数据分析·信号处理
wearegogog1232 天前
MATLAB的脉搏信号分析预处理
算法·matlab
foundbug9992 天前
人工神经网络MATLAB工具箱指南
matlab
软件算法开发3 天前
基于IPO智能粒子优化的IIR滤波器参数识别算法matlab仿真
matlab·参数优化·ipo智能粒子优化·iir滤波器
程高兴6 天前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
念念01077 天前
基于MATLAB多智能体强化学习的出租车资源配置优化系统设计与实现
大数据·人工智能·matlab
fengfuyao9857 天前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab