基于Matlab GUI的信号发生器界面程序示例

前些日子,被一朋友拜托了一课设,不是很难,但基于matlab GUI的设计中文论坛资源较少,所以我做完顺便分享一下。

程序主要内容:

效果展示:

主要代码:

代码展示,复制粘贴不能直接执行,请在code文件中下载,并在matlab界面中打开该code文件执行,才可正常运行。

classdef WaveCreater < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure              matlab.ui.Figure
        Slider2               matlab.ui.control.Slider
        Slider_2              matlab.ui.control.Slider
        Slider                matlab.ui.control.Slider
        witdthN               matlab.ui.control.NumericEditField
        Label_7               matlab.ui.control.Label
        delayN                matlab.ui.control.NumericEditField
        Label_6               matlab.ui.control.Label
        Button_3              matlab.ui.control.Button
        CheckBox              matlab.ui.control.CheckBox
        Button_2              matlab.ui.control.Button
        DropDown_2            matlab.ui.control.DropDown
        Label_5               matlab.ui.control.Label
        EroP                  matlab.ui.control.NumericEditField
        Label_4               matlab.ui.control.Label
        timessEditField       matlab.ui.control.NumericEditField
        timessEditFieldLabel  matlab.ui.control.Label
        sEditField            matlab.ui.control.EditField
        sEditFieldLabel       matlab.ui.control.Label
        intensi               matlab.ui.control.NumericEditField
        Label_3               matlab.ui.control.Label
        KHzEditField          matlab.ui.control.NumericEditField
        Label_2               matlab.ui.control.Label
        DropDown              matlab.ui.control.DropDown
        Label                 matlab.ui.control.Label
        Button                matlab.ui.control.Button
        UIAxes                matlab.ui.control.UIAxes
    end


    properties (Access = private)
        Check=false; % Description
    end

    methods (Access = private)

        function x = CreatW(app)
            % 参数设置
            Fs = app.timessEditField.Value;       % 采样率(每秒采样点数)
            T = 1/Fs;        % 采样周期
            L = str2double(app.sEditField.Value)*Fs;        % 信号长度
            t = (0:L-1)*T;   % 时间向量
            N = length(t); % 假设 t 是时间向量

            f =app.KHzEditField.Value/1000;          % 信号频率(Hz/μs)
            A = app.intensi.Value;           % 信号幅度
            ep=app.EroP.Value;          %噪声值
            x = zeros(1, N); % 预分配信号数组
            Wid=app.witdthN.Value;%锯齿波宽度
            dT=(1/f)*app.delayN.Value/(2*pi);

            if app.DropDown.ValueIndex==1    % 正弦波参数
                x = A * (sin(2*pi*f*(t+dT)) + ep/100*rand(1,L));

            elseif app.DropDown.ValueIndex==2 %方波
                x = A* (square(2*pi*(t+dT)*f, 50)+ep/100*rand(1,L));

            elseif app.DropDown.ValueIndex==3  %锯齿波
                x = A*(sawtooth(f*pi*(t+dT)*2, Wid)+rand(1,L)*ep/100);

            end



            % 绘制信号
            plot(app.UIAxes,t, x);
            app.Button_2.Enable="on";
            app.Button_3.Enable='on';

        end
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Value changed function: CheckBox
        function CheckBoxValueChanged(app, event)
            if app.CheckBox.Value==1
                app.Check=true;
                app.Button.Enable="off";
            else
                app.Button.Enable='on';
            end
            if app.Check
                app.CreatW;
            end

        end

        % Button pushed function: Button
        function ButtonPushed(app, event)
            app.CreatW;
        end

        % Value changed function: DropDown
        function DropDownValueChanged(app, event)
            if app.Check
                app.CreatW;
            end
            if app.DropDown.ValueIndex==3
                app.witdthN.Enable='on';
            end

        end

        % Value changed function: KHzEditField
        function KHzEditFieldValueChanged(app, event)
            if app.Check
                app.CreatW;
            end
            if app.Slider.Value~=app.KHzEditField.Value
                app.Slider.Value=app.KHzEditField.Value;
            end
        end

        % Value changed function: intensi
        function intensiValueChanged(app, event)
            if app.Check
                app.CreatW;
            end
            if  app.Slider_2.Value~=app.intensi.Value
                app.Slider_2.Value=app.intensi.Value;
            end
        end

        % Value changed function: sEditField
        function sEditFieldValueChanged(app, event)
            if app.Check
                app.CreatW;
            end

        end

        % Value changed function: timessEditField
        function timessEditFieldValueChanged(app, event)
            if app.Check
                app.CreatW;
            end

        end

        % Value changed function: EroP
        function EroPValueChanged(app, event)
            if app.Check
                app.CreatW;
            end
        end

        % Button pushed function: Button_2
        function Button_2Pushed(app, event)
            % 参数设置
            Fs = app.timessEditField.Value;       % 采样率(每秒采样点数)
            T = 1/Fs;        % 采样周期
            L = str2double(app.sEditField.Value)*Fs;        % 信号长度
            t = (0:L-1)*T;   % 时间向量
            N = length(t); % 假设 t 是时间向量

            f =app.KHzEditField.Value/1000;          % 信号频率(Hz/μs)
            A = app.intensi.Value;           % 信号幅度
            ep=app.EroP.Value;          %噪声值
            x = zeros(1, N); % 预分配信号数组
            Wid=app.witdthN.Value;%锯齿波宽度
            dT=(1/f)*app.delayN.Value/(2*pi);

            if app.DropDown.ValueIndex==1    % 正弦波参数
                x = A * (sin(2*pi*f*(t+dT)) + ep/100*rand(1,L));

            elseif app.DropDown.ValueIndex==2 %方波
                x = A* (square(2*pi*(t+dT)*f, 50)+ep/100*rand(1,L));

            elseif app.DropDown.ValueIndex==3  %锯齿波
                x = A*(sawtooth(f*pi*(t+dT)*2, Wid)+rand(1,L)*ep/100);

            end

            % 绘制信号
            figure
            plot(t, x);


        end

        % Value changed function: witdthN
        function witdthNValueChanged(app, event)
            if app.Check
                app.CreatW;
            end

        end

        % Value changed function: delayN
        function delayNValueChanged(app, event)
            if app.Check
                app.CreatW;
            end
            if app.Slider2.Value~=app.delayN.Value
                app.Slider2.Value=app.delayN.Value;
            end
        end

        % Button pushed function: Button_3
        function Button_3Pushed(app, event)
            % 获取用户选择的文件名
            x = CreatW(app);
            [filename, pathname] = uiputfile({'*.mat', 'MATLAB Files (*.mat)';...
                '*.*', 'All Files (*.*)'}, ...
                'Save Parameters');

            % 如果用户选择了文件名
            if ~isequal(filename,0)
                % 拼接完整的文件路径
                fullPath = fullfile(pathname, filename);

                % 这里可以保存你的参数或数据到选择的文件中
                % 例如,保存一个变量 myData 到 MAT 文件
                save(fullPath, 'x');
            end
        end

        % Value changed function: Slider
        function SliderValueChanged(app, event)
            app.KHzEditField.Value = app.Slider.Value;
            if app.Check
                app.CreatW;
            end
        end

        % Value changed function: Slider_2
        function Slider_2ValueChanged(app, event)
            app.intensi.Value = app.Slider_2.Value;
            if app.Check
                app.CreatW;
            end
        end

        % Value changed function: Slider2
        function Slider2ValueChanged(app, event)
            app.delayN.Value = app.Slider2.Value;
            if app.Check
                app.CreatW;
            end
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 755 568];
            app.UIFigure.Name = 'MATLAB App';

            % Create UIAxes
            app.UIAxes = uiaxes(app.UIFigure);
            title(app.UIAxes, '信号波形')
            xlabel(app.UIAxes, '时间(μs)')
            ylabel(app.UIAxes, '信号强度')
            app.UIAxes.Position = [14 19 458 505];

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.Position = [524 80 100 23];
            app.Button.Text = '生成信号';

            % Create Label
            app.Label = uilabel(app.UIFigure);
            app.Label.HorizontalAlignment = 'right';
            app.Label.Position = [546 533 53 22];
            app.Label.Text = '信号类型';

            % Create DropDown
            app.DropDown = uidropdown(app.UIFigure);
            app.DropDown.Items = {'正弦波', '方波', '锯齿波'};
            app.DropDown.ValueChangedFcn = createCallbackFcn(app, @DropDownValueChanged, true);
            app.DropDown.Position = [614 533 100 22];
            app.DropDown.Value = '正弦波';

            % Create Label_2
            app.Label_2 = uilabel(app.UIFigure);
            app.Label_2.HorizontalAlignment = 'right';
            app.Label_2.Position = [516 492 84 22];
            app.Label_2.Text = '信号频率(KHz)';

            % Create KHzEditField
            app.KHzEditField = uieditfield(app.UIFigure, 'numeric');
            app.KHzEditField.Limits = [100 200];
            app.KHzEditField.ValueChangedFcn = createCallbackFcn(app, @KHzEditFieldValueChanged, true);
            app.KHzEditField.HorizontalAlignment = 'center';
            app.KHzEditField.Position = [615 492 100 22];
            app.KHzEditField.Value = 100;

            % Create Label_3
            app.Label_3 = uilabel(app.UIFigure);
            app.Label_3.HorizontalAlignment = 'right';
            app.Label_3.Position = [555 403 53 22];
            app.Label_3.Text = '信号幅度';

            % Create intensi
            app.intensi = uieditfield(app.UIFigure, 'numeric');
            app.intensi.Limits = [0 10];
            app.intensi.ValueChangedFcn = createCallbackFcn(app, @intensiValueChanged, true);
            app.intensi.HorizontalAlignment = 'center';
            app.intensi.Position = [623 403 100 22];
            app.intensi.Value = 1;

            % Create sEditFieldLabel
            app.sEditFieldLabel = uilabel(app.UIFigure);
            app.sEditFieldLabel.HorizontalAlignment = 'right';
            app.sEditFieldLabel.Position = [508 226 90 22];
            app.sEditFieldLabel.Text = '显示范围(μs)';

            % Create sEditField
            app.sEditField = uieditfield(app.UIFigure, 'text');
            app.sEditField.InputType = 'digits';
            app.sEditField.ValueChangedFcn = createCallbackFcn(app, @sEditFieldValueChanged, true);
            app.sEditField.HorizontalAlignment = 'center';
            app.sEditField.Position = [613 226 100 22];
            app.sEditField.Value = '20';

            % Create timessEditFieldLabel
            app.timessEditFieldLabel = uilabel(app.UIFigure);
            app.timessEditFieldLabel.HorizontalAlignment = 'right';
            app.timessEditFieldLabel.Position = [489 185 110 22];
            app.timessEditFieldLabel.Text = '采样率(times/μs)';

            % Create timessEditField
            app.timessEditField = uieditfield(app.UIFigure, 'numeric');
            app.timessEditField.Limits = [1 100];
            app.timessEditField.ValueChangedFcn = createCallbackFcn(app, @timessEditFieldValueChanged, true);
            app.timessEditField.HorizontalAlignment = 'center';
            app.timessEditField.Position = [614 185 100 22];
            app.timessEditField.Value = 5;

            % Create Label_4
            app.Label_4 = uilabel(app.UIFigure);
            app.Label_4.HorizontalAlignment = 'right';
            app.Label_4.Position = [486 112 112 22];
            app.Label_4.Text = '噪声相对强度(%)';

            % Create EroP
            app.EroP = uieditfield(app.UIFigure, 'numeric');
            app.EroP.Limits = [0 100];
            app.EroP.ValueChangedFcn = createCallbackFcn(app, @EroPValueChanged, true);
            app.EroP.HorizontalAlignment = 'center';
            app.EroP.Position = [613 112 100 22];
            app.EroP.Value = 5;

            % Create Label_5
            app.Label_5 = uilabel(app.UIFigure);
            app.Label_5.HorizontalAlignment = 'right';
            app.Label_5.Position = [546 150 53 22];
            app.Label_5.Text = '噪声类型';

            % Create DropDown_2
            app.DropDown_2 = uidropdown(app.UIFigure);
            app.DropDown_2.Items = {'高斯'};
            app.DropDown_2.Position = [614 150 100 22];
            app.DropDown_2.Value = '高斯';

            % Create Button_2
            app.Button_2 = uibutton(app.UIFigure, 'push');
            app.Button_2.ButtonPushedFcn = createCallbackFcn(app, @Button_2Pushed, true);
            app.Button_2.Enable = 'off';
            app.Button_2.Position = [523 41 185 32];
            app.Button_2.Text = '自定义波形图像';

            % Create CheckBox
            app.CheckBox = uicheckbox(app.UIFigure);
            app.CheckBox.ValueChangedFcn = createCallbackFcn(app, @CheckBoxValueChanged, true);
            app.CheckBox.Text = '实时生成';
            app.CheckBox.Position = [646 81 70 22];

            % Create Button_3
            app.Button_3 = uibutton(app.UIFigure, 'push');
            app.Button_3.ButtonPushedFcn = createCallbackFcn(app, @Button_3Pushed, true);
            app.Button_3.Enable = 'off';
            app.Button_3.Position = [524 10 190 23];
            app.Button_3.Text = '保存波形数据';

            % Create Label_6
            app.Label_6 = uilabel(app.UIFigure);
            app.Label_6.HorizontalAlignment = 'right';
            app.Label_6.Position = [539 321 65 22];
            app.Label_6.Text = '相位偏移角';

            % Create delayN
            app.delayN = uieditfield(app.UIFigure, 'numeric');
            app.delayN.Limits = [0 6.28318530717959];
            app.delayN.ValueChangedFcn = createCallbackFcn(app, @delayNValueChanged, true);
            app.delayN.HorizontalAlignment = 'center';
            app.delayN.Position = [619 321 100 22];

            % Create Label_7
            app.Label_7 = uilabel(app.UIFigure);
            app.Label_7.HorizontalAlignment = 'right';
            app.Label_7.Enable = 'off';
            app.Label_7.Position = [63 533 283 22];
            app.Label_7.Text = '锯齿波上升比(为0是标准锯齿波,为0.5是三角波)';

            % Create witdthN
            app.witdthN = uieditfield(app.UIFigure, 'numeric');
            app.witdthN.ValueChangedFcn = createCallbackFcn(app, @witdthNValueChanged, true);
            app.witdthN.Enable = 'off';
            app.witdthN.Position = [361 533 100 22];

            % Create Slider
            app.Slider = uislider(app.UIFigure);
            app.Slider.Limits = [100 200];
            app.Slider.ValueChangedFcn = createCallbackFcn(app, @SliderValueChanged, true);
            app.Slider.Position = [564 469 150 3];
            app.Slider.Value = 100;

            % Create Slider_2
            app.Slider_2 = uislider(app.UIFigure);
            app.Slider_2.Limits = [0 10];
            app.Slider_2.ValueChangedFcn = createCallbackFcn(app, @Slider_2ValueChanged, true);
            app.Slider_2.Position = [565 382 150 3];

            % Create Slider2
            app.Slider2 = uislider(app.UIFigure);
            app.Slider2.Limits = [0 6.28318530717959];
            app.Slider2.ValueChangedFcn = createCallbackFcn(app, @Slider2ValueChanged, true);
            app.Slider2.Position = [568 294 150 3];

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = WaveCreater

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

Code文件下载:

网盘链接: https://pan.baidu.com/s/1e3WKdpiMstkRgEr1AlJdzw
提取码: bq9u

MATLAB中,可以使用GUI(图形用户界面)来创建信号发生器。下面是一个简单的示例,演示了如何使用MATLABGUI工具箱创建一个基本的信号发生器。 首先,需要创建一个新的GUI应用程序。可以通过在MATLAB命令窗口中输入`guide`来打开GUI编辑器。然后,按照以下步骤进行操作: 1. 在GUI编辑器中,选择“Blank GUI”模板,然后点击“OK”按钮。 2. 在左侧的“Component Browser”窗格中,选择“Standard”选项卡,并从中拖动一个“Slider”组件到GUI窗口中。 3. 在“Properties”窗格中,将“Slider”组件的“Min”属性设置为信号的最小值,将“Max”属性设置为信号的最大值。 4. 在左侧的“Component Browser”窗格中,选择“Standard”选项卡,并从中拖动一个“Axes”组件到GUI窗口中。 5. 在“Properties”窗格中,将“Axes”组件的“Tag”属性设置为“axes1”。 6. 在左侧的“Component Browser”窗格中,选择“Standard”选项卡,并从中拖动一个“Push Button”组件到GUI窗口中。 7. 在“Properties”窗格中,将“Push Button”组件的“String”属性设置为“Generate Signal”。 8. 在左侧的“Component Browser”窗格中,选择“Callbacks”选项卡,并双击“Push Button”组件的“Callback”属性。 9. 在弹出的编辑器中,输入以下代码来生成信号并在图形窗口中显示: ```matlab function pushbutton1_Callback(hObject, eventdata, handles) % 获取滑块的值 sliderValue = get(handles.slider1, 'Value'); % 生成信号 t = 0:0.1:10; signal = sin(sliderValue * t); % 在图形窗口中显示信号 axes(handles.axes1); plot(t, signal); xlabel('Time'); ylabel('Amplitude'); title('Generated Signal'); ``` 10. 点击“Save”按钮保存代码,并关闭编辑器。 现在,可以运行GUI应用程序。在MATLAB命令窗口中输入`mygui`(假设应用程序的文件名为`mygui.m`),然后按下回车键。GUI窗口将打开,并显示一个滑块和一个按钮。通过调整滑块的值,可以生成不同的信号,并在图形窗口中显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值