文章目录
- 前言
- 1. 卷积的简单介绍
- 1.1 翻褶
- 1.2 移位
- 1.3 相乘
- 1.4相加
- 1.5 整体的运行效果展示
- 2.App Designer的介绍
- 3.具体的开发步骤
- 3.1 声明成员变量
- 3.2 设计基本布局
- 3.3 编写回调函数
- 4.运行展示
- 结语
前言
本篇文章按照如下要求,完成线性卷积演示系统
(1)用matlab完成线性卷积的计算过程,并绘图;
(2)使用GUI/app design设计一个线性卷积的基本演示系统;要求两个卷积信号的参数可以自由给定;设计框图中直接包含“计算按钮”,直接计算卷积结果;
(3) 分析卷积计算结果。
1. 卷积的简单介绍
卷积包括四个步骤,翻褶
、移位
、相乘
、相加
四个步骤,下面是对具体步骤的演示
1.1 翻褶
首先,我们定义了一个x=[1 2 3 4 5]的一个向量,通过fliplr()
函数将序列进行翻褶得到 [5 4 3 2 1]
在实际中,我们需要对下标也进行翻褶,如图所示
stem(0:length(x)-1,x,"filled")
stem(-(length(x)-1):0,fliplr(x),"filled")
运行结果:
原序列:
翻褶后的序列:
当然也可以画在一个figure
1.2 移位
翻褶过后根据n值进行移位。
n<0,向左移位;n>0,向右移位
具体移位效果需要根据另一个序列的起始下标和翻褶后的下标共同来决定
这里制作效果展示,具体代码运行不做解释,因为本项目直接使用conv()
函数求卷积结果
1.3 相乘
x(m)*h(n-m)
1.4相加
将每次的n值相乘的结果进行累加
1.5 整体的运行效果展示
这里只是为了更好的解释卷积过程
2.App Designer的介绍
App Designer 是 MATLAB 中用于创建图形用户界面(GUI)应用程序的一个集成开发环境(IDE),它提供了一种直观且高效的方式来设计、开发和部署具有交互功能的 MATLAB 应用程序。
本项目使用App Designer进行可视化,具体的使用方法不做介绍
3.具体的开发步骤
3.1 声明成员变量
min1,min2:表示序列的起始下标
max1, max2:表示序列的终止下标
y1, y2:表示两个参与卷积的序列
properties (Access = private)
Property % Description
min1,min2,max1,max2,y1,y2;
end
3.2 设计基本布局
直接从组件库将需要的进行拖拽即可
3.3 编写回调函数
本项目的回调函数编写在下拉框中,即在下拉框中选择函数过后即可在相应坐标轴上显示,当然在此之前需要对参数赋初值,不过我们也实现了一定的交互性,会出现报错提示窗
回调函数:
function xDropDownValueChanged(app, event)
value = app.xDropDown.Value;
a=app.aEditField.Value;
b=app.bEditField.Value;
x=-2:5;
app.min1=-2;
app.max1=5;
% value
if isempty(a)||isempty(b)
errordlg("请先输入参数!!!");
return;
end
switch value
case "正弦型序列y=a*sin(b*x)"
app.y1=a*sin(b*x);
case "指数衰减函数y=a*exp(-b*t)"
app.y1=a*exp(-b*x);
case "无"
errordlg("请选择函数","错误提示窗口");
return;
end
stem(app.UIAxes,x,app.y1,"filled","r");
end
此时,就能在app.UIAxes坐标中画出y1序列,起始坐标为-2:5
同理在另一个下拉文本框中编写回调函数
function xDropDown_2ValueChanged(app, event)
value = app.xDropDown_2.Value;
% value = app.xDropDown.Value;
a=app.aEditField_2.Value;
b=app.bEditField_2.Value;
if isempty(a)||isempty(b)
errordlg("请先输入参数!!!");
return;
end
switch value
case "矩形门:a,b分别表示上下界"
x=a:b;
app.min2=a;
app.max2=b;
if a>b
errordlg("a应当小于b","错误提示窗");
return;
end
app.y2=ones(b-a+1,1);
case "高斯门:y=exp(-(x-a).^2/b)"
x=0:1:7;
app.min2=0;
app.max2=7;
app.y2 = exp(-(x - a).^2 / (b * b));
case "无"
errordlg("请选择函数","错误提示窗口");
return;
end
stem(app.UIAxes_2,x,app.y2,"filled","b");
end
此时,就能在app.UIAxes_2坐标中画出y2序列,起始坐标为0:7(选择高斯门函数),起始坐标为a:b(选择门函数)
卷积结果(编写在计算按钮的回调函数中):
function ButtonPushed(app, event)
% app.y1
% app.y2
if isempty(app.y1) || isempty(app.y2)
errordlg("请选择合适的函数!");
return;
end
h=conv(app.y1,app.y2);
n=app.min1+app.min2:1:app.max1+app.max2;
stem(app.UIAxes_3,n,h,"filled");
msgbox("绘制完成","help");
end
4.运行展示
展示了运行的结果,以及一定的交互性
结语
本篇博客中的代码资源已上传至个人资源中,有需要自行获取,也可以关注私聊我获取。同时本篇博客可能内容有些内容理解有些错误,欢迎批评指正!!!