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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树笔记

2-3树 -> 左倾红黑树 红黑树实际上是2-3树的一种基于BST的实现。普通二叉搜索树(BST)中的每一个节点,只有一个键,两条链接(两个子节点),这种节点被称为2节点。2-3树中,引入了一个…

【智能算法】土拨鼠优化算法(PDO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年,AE Ezugwu等人受到土拨鼠觅食行为与自然行为启发,提出了土拨鼠优化算法(Prairie Dog Optimization algorithm, PDO)。 2.算法原理 2.1算法思…

云服务器搭建XSS-platform、DVWA靶机和Permeate论坛

目录 前言准备环境安装步骤一、 部署MySQL二、 系统部署三、系统安装主页介绍 前言 我发现目前网上的xss-platform的搭建教程都是基于本地搭建的,这样搭建好的xss平台只能在本地使用,无法测试别的网站。而网络上的大部分xss平台又几乎都是收费的&#x…

vue3学习笔记-快速上手

创建第一个vue3的应用 之前看书学习vue,书籍对应的版本是vue2,今天群里看小伙伴聊天,觉得他们说得对 ,反正是从零开始学,而且vue2都不维护了,那为什么不直接学习vue3呢,于是乎,又开启了从0学vue3之路。 参考…

2024Xtu程设第一次练习题解

程设练习题谢大会专门查重 1.1531奇怪的数字 题目让我们从小到大输出1e6以内所有的答案,其实也没什么好的思路 就是将一个数n的所有位都拆出来,遍历这些位(每次取一个x),然后通过作除法(y n / x&#xf…

java多态知识

目录 一、定义 二、注意事项 三、多态的好处 四、多态的弊端以及解决办法 一、定义 多态定义:多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。 对象多态:都是同一对象,表现出不同角色,比如小明,…

java:SpringBoot入门

Spring 提供若干子项目,每个项目用于完成特定功能 Spring Boot 可以简化配置并且快速开发 SpringBootWeb快速入门 创建Springboot模块并使用Springweb依赖 在类上添加注解 RestController可以将字符串自动转成json返回数据给页面 再在方法上添加注解 RequestMapping(&…

python应用-socket网络编程(2)

socket 是 Python 标准库中的一个模块,它提供了低级别的网络通信接口。使用 socket 模块,你可以创建客户端和服务器应用程序,以便在网络上进行数据交换。 接着上文我们介绍下socket模块其他的一些函数。 目录 gettimeout() 和settimeout()…

0422empAJAX项目

数据库字段: 多条件查询; 分页查询; 添加图片; ajax离职操作; 删除选项,点击离职操作后仍然可实现删除选项

项目部署总结

1、安装jdk 第一步:上传jdk压缩安装包到服务器 第二步:将压缩安装包解压 tar -xvf jdk-8uXXX-linux-x64.tar.gz 第三步:配置环境变量 编辑/etc/profile文件,在文件末尾添加以下内容: export JAVA_HOME/path/to/j…

鉴权到底做什么

两种方案: 将 token 放在 cookie 里;将 token 放在请求头里,用 Authorization 字段。 无论对于前端还是后端而言,这两种方案都是各有利弊的,下面稍微讲几点,实际开发中根据需求来选用即可。 将 token 放在…

进程控制5 - exit()退出+子进程被收养+僵死进程

我们应当知道的是,在用fork创建子进程后,父子进程的执行的先后顺序是不定的,这时,我们可以用wait函数,wait()会暂停当前进程的执行,直到有信号到来或者子进程结束。总的来说,wait()的作用就是阻…

C语言编译的优化等级应该选哪个?O0、O1、O2还是O3

在使用IDE开发STM32程序时,IDE一般都会提供优化等级设置的选项,例如下图中KEIL软件优化等级的设置。 从上图中也可以看出,设置不同的优化等级,实际上是修改了编译器的编译参数。这个编译器是由ARM公司提供的C/C编译器armclang或者…

微信小程序Vue+nodejs+uniapp课堂教学辅助在线学习系统

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 后台主要实现功能:一、用户的管理(用户的信息管理) 二、 课程的管理(课程发布,课后成绩的查看&#xff0c…

DAY 5

1. 2. #include <iostream>using namespace std; class Person {string name;int *age;public:Person():name("zhangsan"),age(new int (18)){cout << "Person的无参函数" << endl;}Person(string name,int *age):name("zhangsan&q…

水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)

是自己利用LabelImg工具进行手工标注&#xff0c;数据集制作不易&#xff0c;请尊重版权&#xff08;稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫&#xff09; 如果需要yolv8检测模型和数据集放在一起的压缩包&#xff0c;可以关注&#xff1a;最新最…

聊聊Flink:Docker搭建Flink

一、准备工作 查看下Docker和Docker Compose版本&#xff0c;确保你安装了这些软件。 在 Flink 官网上下载 Flink 的 Docker 镜像。您可以使用以下命令从 Docker Hub 中下载&#xff1a; docker pull flink:1.18.0-scala_2.12 此命令将下载 Flink 1.18.0 版本的 Docker 镜像…

电商架构:系统设计+表设计

如有不对&#xff0c;请指正 欢迎评论区交流 需要哪些系统 商品系统、订单系统、权限系统、审核系统等。 商品系统 订单系统 审核系统 权限系统 参考 基于电商中台架构-商品系统设计(一) 附件

2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试&#xff0c;包含流动式起重机司机报名考试答案和解析及流动式起重机司机复审模拟考试练习。安全生产模拟考试一点通结合国家流动式起重机司机考试…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程&#xff0c;但是小白重新去看了一下&#xff0c;发现写的内容太多&#xff0c;怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲&#xff1a;在同一台机器上安装Windows10双系统的教程。 注意哦&#xff01;这里的Wi…