软件的界面如下:
主要分为了三个控制区模块,即信号生成预览区,信号观测区以及信号分析区。在信号生成区可以通过键盘输入或是滑块调节的方式改变输入信号的频率、赋值以及初相,信号生成区的预览窗口可以实时的动态调整当前信号的波形展示。此外目前设计了白噪声、正弦波、方波以及正弦波四种类型的信号输入。
完成输入参数的调节后,点击“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