当前位置: 首页 > article >正文

基于matlab的线性卷积演示系统

文章目录

  • 前言
  • 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.运行展示

展示了运行的结果,以及一定的交互性在这里插入图片描述

结语

本篇博客中的代码资源已上传至个人资源中,有需要自行获取,也可以关注私聊我获取。同时本篇博客可能内容有些内容理解有些错误,欢迎批评指正!!!


http://www.kler.cn/a/376925.html

相关文章:

  • 【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务
  • 论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction
  • 单片机原理与应用:连接数字世界的微型大脑
  • phcharm贪吃蛇小游戏后续一(代码1,2,3前文已发)
  • HTML 基础标签——多媒体标签<img>、<object> 与 <embed>
  • K8S nginx pod结合cronJob实现日志按天切割 —— 筑梦之路
  • C# 接口(Interface)
  • Vue梳理1——Vue2的安装
  • 【计算机网络安全】湖北大学-MAC泛洪攻击实验
  • vxe-table 表格中实现多行文本的编辑
  • 企业数据安全举报投诉如何有效处理?
  • 手机贴膜气泡识别组件定位图像分割系统:快速图像识别
  • 在ubuntu上安装最新版的clang
  • c++多线程处理数据
  • 【Grafana】Grafana 基础入门
  • 多线程环境下内存池的实现(C++)
  • SpringBoot+FileBeat+ELK8.x版本收集日志
  • npm入门教程10:npm生命周期钩子
  • Flutter 获取照片权限的时候是否要获取存储权限?
  • SCSS在Vue中的用法