zoukankan      html  css  js  c++  java
  • MATLAB GUI设计(线性卷积和循环卷积的比较--笔记)

     

    原创循环卷积代码,转载需注明出处

    线性卷积与循环卷积的比较

    实验目的和要求

     掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系。

    实验内容和步骤

    1) 已知两序列X(n) =   ;  h(n)=;

    求两序列的线性卷积和它们的 N 点循环卷积;

    2)设计一个GUI小软件,对N进行设定和调整,显示的序列(用stem 画出)时域信号图,线性卷积和N点循环卷积的时域结果图,要求N改变结果图也随之改变;

    3)总结归纳循环卷积与线性卷积之间的关系。

    实验要求

    1) 提供MATLAB 程序;

    2) 写出实验报告,对设计的思路和步骤结果进行分析和说明。

    设计思路和步骤

    设计思路:

    ① 确定GUI界面包含的控件 ,包含 显示h(n)、x(n)的坐标轴、显示x(n)与h(n)线性卷积结果的坐标轴、显示x(n)与h(n)循环卷积结果的坐标轴,以及一个滑杆(slider)用于调整循环卷积的点数N,作为辅助增加一个文本编辑框(edit)可以输入N值,作用与滑杆一样。

    ②从简单到复杂,控件功能符合预定要求后再把下一部分的控件添加到GUI界面上,逐步增加直至完成。

    设计步骤:

     ①新建 空白GUI工程:

    在MATLAB命令窗口输入 “guide” 命令选择新建 空白GUI工程:

    选好存储位置及设置好名字,将会弹出GUI图形用户设计界面:

    常用到的就是 控件栏里面的控件,可编辑文本框以及滑杆、坐标轴都可从这里拉到编辑面板,

    选中控件后可以点击“属性检查器” 查看、编辑对象的各种属性值:

    如图为一个可编辑文本框的各项属性,用到的属性是String 和Tag。

    String即字符串的值就是初始状态呈现给用户看见的,如图设置将会显示“可编辑文本”;

    Tag 即标签,每个控件都应当有一个独一无二的标签,后面我们对这个控件进行操作时就是通过它的标签来的,这里Tag值为edit2,那就用handles.edit2来操作这个文本框。完整语句用到set函数,set函数一般格式为set(句柄,’属性名称’,‘属性值’);如set(handles.edit1,'string',’Nvalue’);那Tag为edit1的可编辑文本框就会显示‘‘Nvalue’’;

     

    (handles像C语言的结构体一般,装着所有控件的Tag,可以全局引用,但需注意在控件生成后该控件的Tag才会更新到handles里面,所以在写控件生成时候的CreateFcn时还不能引用诸如handles.edit1这样的参数;再而如果用户要添加一个handles.xxx,需要在handles.xxx=XXXXX后面加上guidata(hObject, handles); 来更新handles)。

     ②先生成一个滑杆和一个文本编辑框,实现他们的“N”值同步,即滑动滑杆文本编辑框中显示的string –N也相应的改变,编辑文本框中的 N,滑杆也相应的改变,

     

    考虑到用户可能会在文本框输入浮点数,而循环卷积需要的是整数,所以当用户输入浮点数时,要通过取整(用到了int16),再把取整后的数显示在文本框、再同步到滑杆的value。文本框中的callback函数中的语句:  set(handles.edit1,'string',num2str(int16(str2num(get(handles.edit1,'string')))));

    实现的就是这一功能;其中get(handles.edit1,'string');作用是为了获取Tag为 edit1的文本框的“string”的值,str2num是将字符串转化为数字,num2str则反之,这样用是因为edit1显示的东西要是 string 字符串而滑杆的value 这个属性的值应当为 数字。操作控件的基本方法就是这样,其他控件类似,简写见,详见工程代码

    用坐标轴显示h(n)、x(n)、h(n) * x(n)。

    坐标轴1显示x(n):

    stem(handles.axes1,(0:length(handles.Xndata)-1),handles.Xndata);

    坐标轴2显示h(n):

    stem(handles.axes2,(0:length(handles.Hndata)-1),handles.Hndata);

    坐标轴3显示x(n)与h(n)线性卷积:

    stem(handles.axes3,(0:length(handles.xhconv)-1),handles.xhconv);

     

    坐标轴4显示x(n)与h(n)的N 点循环卷积:

    貌似MATLAB 系统没有提供循环卷积的函数,所以根据自己了一个循环卷积函数:

    function y = Circonv(A,B,L)   % 矩阵 A  B 的 L 点循环卷积

    y=[];

    if L>0               %限制L 为正整数,看起来没有影响

    if length(A)<L     %当矩阵A长度不足L时补零,否则会出错

              A=[A, zeros(1,(L-length(A)))];

            end

            if length(B)<L %当矩阵B长度不足L时补零,否则会出错

               B=[B,zeros(1,(L-length(B)))];

             end

     

            for n=0:L-1          %相当于公式里的 Rn(L)

                sum=0;

                for m=0:L-1       % ,

                     sum=sum+A(m+1)*B(mod((n-m),L)+1); 

    %sum作为 求和 容器

    %按照公式应为sum=sum+A(m)*B(mod((n-·m),L));

    %因为 MATLAB中的矩阵元素下标是从 1 开始的,所以调用元素时加上 1

     end                     

       y=[y,sum];

     end

      end

    end

    坐标轴4显示x(n)与h(n)的N 点循环卷积:

    stem(handles.axes4,(0:length(handles.circon)-1),handles.circon);

    设计结果分析与说明

    设计结果符合 预期要求并添加了部分功能:

    1. 考虑到用户可能输入浮点数作为N点 循环卷积的 参数 N,所以添加 取整功能;
    2. 当循环卷积的 点数 大于25即显示x(n) 、h(n)线性卷积 的坐标轴的长度时,把两个坐标轴同时延长为相同长度,便于比较两种卷积的结果。

    分析:

    设A矩阵的程度为N,B的长度为M则当L N +M -1 时A与B的L点循环卷积才等于A与B的线性卷积。

     2019-03-08

    << 转载需注明出处 >>
  • 相关阅读:
    EasyMvc入门教程基本控件说明(6)进度条
    EasyMvc入门教程基本控件说明(3)时间线
    EasyMvc入门教程基本控件说明(4)折叠面板
    EasyMvc入门教程基本控件说明(11)菜单导航
    在一天的24小时之中,时钟的时针、分针和秒针完
    Maven Tutorial
    JXL操作Excel
    Beanutils的基本用法
    利用hibernate分析数据库中的表,属性以及对应的类的类名,字段
    beanutils的一个应用
  • 原文地址:https://www.cnblogs.com/Huae/p/10498309.html
Copyright © 2011-2022 走看看