【数字信号处理】基于Matlab Designer制作的信号生成、叠加与检测器

该博客介绍了一款Matlab开发的信号处理软件。软件界面有信号生成预览区、信号观测区和信号分析区。在生成区可调节信号参数、选择信号类型;观测区能叠加信号、观测波形运动、播放声音;分析区可对叠加信号进行频域图等参数分析,还给出了下载链接和源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载链接(CSDN)
下载链接(百度网盘)

软件的界面如下:
在这里插入图片描述
主要分为了三个控制区模块,即信号生成预览区,信号观测区以及信号分析区。在信号生成区可以通过键盘输入或是滑块调节的方式改变输入信号的频率、赋值以及初相,信号生成区的预览窗口可以实时的动态调整当前信号的波形展示。此外目前设计了白噪声、正弦波、方波以及正弦波四种类型的信号输入。
完成输入参数的调节后,点击“ADD”按钮,就可以将当前的信号送入信号观测区,当ADD进入了多个信号通道后,就可以观测到多信号叠加后的输出波形。点击“Run”可以动态观测叠加波形的运动。点击“Play”可以播放当前叠加波的声音,持续一秒钟时间。点击“Clear”,就可以清空当前信号观测区的信号输入。
最后,在信号分析区,设计了针对叠加信号的频域图以及其他参数的分析功能,具体如界面所示。
如无法下载,源码如下

classdef Digital_signal_generation_and_analyzer_exported < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure                matlab.ui.Figure
        SignalAnalysis          matlab.ui.container.Panel
        STD_error               matlab.ui.control.NumericEditField
        Label_9                 matlab.ui.control.Label
        DigitalSignalGenerationandAnalyzerLabel  matlab.ui.control.Label
        PoweredbyVulcan_QLabel  matlab.ui.control.Label
        Analysis                matlab.ui.control.Button
        Mean                    matlab.ui.control.NumericEditField
        Label_8                 matlab.ui.control.Label
        RMS                     matlab.ui.control.NumericEditField
        Label_7                 matlab.ui.control.Label
        Peak_Grain              matlab.ui.control.NumericEditField
        Label_6                 matlab.ui.control.Label
        Grain                   matlab.ui.control.NumericEditField
        Label_5                 matlab.ui.control.Label
        Peak                    matlab.ui.control.NumericEditField
        Label_3                 matlab.ui.control.Label
        UIAxes                  matlab.ui.control.UIAxes
        SignalObservation       matlab.ui.container.Panel
        ClearObservation        matlab.ui.control.Button
        PlayObservation         matlab.ui.control.Button
        StopObservation         matlab.ui.control.Button
        RunObservation          matlab.ui.control.Button
        SignalObservation_axis  matlab.ui.control.UIAxes
        SignalGenerated         matlab.ui.container.Panel
        TextPhase               matlab.ui.control.TextArea
        radLabel                matlab.ui.control.Label
        PhaseSlider             matlab.ui.control.Slider
        AddSignal               matlab.ui.control.Button
        TextAmplitude           matlab.ui.control.TextArea
        Label_2                 matlab.ui.control.Label
        TextFrequency           matlab.ui.control.TextArea
        Label                   matlab.ui.control.Label
        AmplitudeSlider         matlab.ui.control.Slider
        FrequencySlider         matlab.ui.control.Slider
        SignalTypes             matlab.ui.container.ButtonGroup
        SquareWave              matlab.ui.control.RadioButton
        TriangularWave          matlab.ui.control.RadioButton
        SineWave                matlab.ui.control.RadioButton
        WhiteNoise              matlab.ui.control.RadioButton
        SignalPreview_axis      matlab.ui.control.UIAxes
    end


    properties (Access = private)
        FrequencyGenerate  % 信号生成窗口的信号频率(600为初始值)
        AmplitudeGenerate  % 信号生成窗口的信号幅值(0.5为初始值)
        PhaseGenerate % 信号生成窗口的信号相位
        Timer_Generate % 信号生成窗口的定时器,用于预览输入信号
        Phase_generate  % 信号生成窗口绘制函数运行相位
        Phase_generate_step  % 一次计时中断预览窗口的变化步长
        Fs  %采样频率
        N_observation %生成区采样长度
        N_Generate  %观测区采样长度
        Timer_View % 信号观测窗口的定时器,用于大屏输出观测信号
        InformationStorage = []; %频率,赋值,相位,类型
        InformationPlot = []; % Description
        Phase_observation = 0;
        Phase_observation_step = 0.1 * pi;
        observation_flag = 0; %默认关闭observation
        generate_flag = 1; %默认打开generate
    end

    methods (Access = private)

        function value = cell2double(~,value)
            value = cell2mat(value);
            value = str2double(value);
        end

        function  TimerInit_G(app)
            app.Timer_Generate = timer;
            app.Timer_Generate.StartDelay = 0;
            app.Timer_Generate.Period = 0.05 ; %定时器定时中断周期
            app.Timer_Generate.ExecutionMode = 'fixedDelay';
            app.Timer_Generate.TimerFcn = @(~,~)TimerGenerate_handler(app);
            start(app.Timer_Generate);
        end
        function TimerInit_O(app)
            app.Timer_View = timer;
            app.Timer_View.StartDelay = 0;
            app.Timer_View.Period = 0.1 ; %定时器定时中断周期
            app.Timer_View.ExecutionMode = 'fixedDelay';
            app.Timer_View.TimerFcn = @(~,~)TimerObservation_handler(app);
            %start(app.TimerInit_O);
        end
        function TimerObservation_handler(app)
            app.Phase_observation = app.Phase_observation + app.Phase_observation_step;
            if app.Phase_observation >= 2*pi
                app.Phase_observation = 0;
            end
            WaveMake(app);
            ObservationPlot(app);
        end
        function TimerGenerate_handler(app)
            app.Phase_generate = app.Phase_generate + app.Phase_generate_step;
            if app.Phase_generate >= 2*pi
                app.Phase_generate = 0;
            end
            SignalGenerated_draw(app);
        end
        function SignalGenerated_draw(app)
            dt = 1.0/app.Fs;
            time = 0:dt:app.N_Generate * dt;
            if app.SignalTypes.SelectedObject.Text == "SineWave"
                wave = app.AmplitudeGenerate * sin(time .* 2*pi*app.FrequencyGenerate + app.PhaseGenerate + app.Phase_generate);
                plot(app.SignalPreview_axis,time,wave,'LineWidth', 1.5);
            elseif app.SignalTypes.SelectedObject.Text == "SquareWave"
                wave = app.AmplitudeGenerate * square(time .* 2*pi*app.FrequencyGenerate + app.PhaseGenerate + app.Phase_generate);
                plot(app.SignalPreview_axis,time,wave,'LineWidth', 1.5);
            elseif app.SignalTypes.SelectedObject.Text == "TriangularWave"
                wave = app.AmplitudeGenerate * sawtooth(time .* 2*pi*app.FrequencyGenerate + app.PhaseGenerate + app.Phase_generate,0.5);
                plot(app.SignalPreview_axis,time,wave,'LineWidth', 1.5);
            elseif app.SignalTypes.SelectedObject.Text == "WhiteNoise"
                wave = 0.2 *app.AmplitudeGenerate * randn(1,app.N_Generate+1);
                plot(app.SignalPreview_axis,time,wave,'LineWidth', 1.5);
            end
            clear("wave");
            clear("time");

        end

        function Startup_init(app)
            app.FrequencyGenerate = 600; % 信号生成窗口的信号频率(600为初始值)
            app.AmplitudeGenerate = 0.5; % 信号生成窗口的信号幅值(0.5为初始值)
            app.PhaseGenerate = 0; % 信号观测窗口的信号相位
            app.Phase_generate = 0; % 信号生成窗口绘制函数运行相位
            app.Phase_generate_step = 0.1*pi; % 一次计时中断预览窗口的变化步长
            app.Fs = 44100; %采样频率
            app.N_observation = 441*5; %采样长度
            app.N_Generate = 441;
        end
        
        
        function  LockInput(app,odder)
            if odder == 1 % 允许写操作
                app.TextAmplitude.Editable = 'on';
                app.AmplitudeSlider.Enable = 'on';
                app.TextFrequency.Editable = 'on';
                app.FrequencySlider.Enable = 'on';
                app.TextPhase.Editable = 'on';
                app.PhaseSlider.Enable = 'on';
                app.AddSignal.Enable = 'on';
            elseif odder == 0
                app.TextAmplitude.Editable = 'off';
                app.AmplitudeSlider.Enable = 'off';
                app.TextFrequency.Editable = 'off';
                app.FrequencySlider.Enable = 'off';
                app.TextPhase.Editable = 'off';
                app.PhaseSlider.Enable = 'off';
                app.AddSignal.Enable = 'off';
            end
        end
        
        function WaveMake(app)
            dt = 1.0/app.Fs;
            time = 0:dt:app.N_observation * dt;
            Numbers = size(app.InformationStorage,1);
            app.InformationPlot = zeros([Numbers+1,app.N_observation + 1]);
            for i = 1:Numbers
                if app.InformationStorage(i,4) == 1
                    app.InformationPlot