优化下面的代码,解决图框显示不完全的问题,其余不需要优化,给我完整的代码:classdef TDMApp8888 < matlab.apps.AppBase
% Properties corresponding to app components
properties (Access = public)
UIFigure matlab.ui.Figure
SignalConfigPanel matlab.ui.container.Panel
NumSignalsEditField matlab.ui.control.NumericEditField
NumSignalsLabel matlab.ui.control.Label
SignalTypeDropDown matlab.ui.control.DropDown
SignalTypeLabel matlab.ui.control.Label
FrequencyEditField matlab.ui.control.NumericEditField
FrequencyLabel matlab.ui.control.Label
AddSignalButton matlab.ui.control.Button
RemoveSignalButton matlab.ui.control.Button
SignalsListBox matlab.ui.control.ListBox
SignalsListLabel matlab.ui.control.Label
StrategyPanel matlab.ui.container.Panel
FixedRadioButton matlab.ui.control.RadioButton
PriorityRadioButton matlab.ui.control.RadioButton
StrategyButtonGroup matlab.ui.container.ButtonGroup
TotalSlotsEditField matlab.ui.control.NumericEditField
TotalSlotsLabel matlab.ui.control.Label
SimulationPanel matlab.ui.container.Panel
RunSimulationButton matlab.ui.control.Button
RunFeedbackButton matlab.ui.control.Button
RunAnalysisButton matlab.ui.control.Button
ResultsTabGroup matlab.ui.container.TabGroup
SignalsTab matlab.ui.container.Tab
OriginalAxes matlab.ui.control.UIAxes
TDMAxes matlab.ui.control.UIAxes
DemuxAxes matlab.ui.control.UIAxes
SyncedAxes matlab.ui.control.UIAxes
PerformanceTab matlab.ui.container.Tab
BERAxes matlab.ui.control.UIAxes
ParametersTab matlab.ui.container.Tab
ParametersTextArea matlab.ui.control.TextArea
StatusLabel matlab.ui.control.Label
ProgressBar matlab.ui.control.Lamp
SNREditField matlab.ui.control.NumericEditField
SNRLabel matlab.ui.control.Label
IterationsEditField matlab.ui.control.NumericEditField
IterationsLabel matlab.ui.control.Label
DurationEditField matlab.ui.control.NumericEditField
DurationLabel matlab.ui.control.Label
SamplingRateEditField matlab.ui.control.NumericEditField
SamplingRateLabel matlab.ui.control.Label
% 新增编码配置控件
EncodingPanel matlab.ui.container.Panel
EncodingTypeDropDown matlab.ui.control.DropDown
EncodingTypeLabel matlab.ui.control.Label
QuantBitsEditField matlab.ui.control.NumericEditField
QuantBitsLabel matlab.ui.control.Label
StepSizeEditField matlab.ui.control.NumericEditField
StepSizeLabel matlab.ui.control.Label
FrameConfigPanel matlab.ui.container.Panel
FrameHeaderEditField matlab.ui.control.EditField
FrameHeaderLabel matlab.ui.control.Label
CRCCheckBox matlab.ui.control.CheckBox
end
properties (Access = private)
signals % 存储信号配置的cell数组
params % 系统参数结构体
tdmSystem % TDMSystem实例
controller % TDMFeedbackController实例
analyzer % TDMPerformanceAnalyzer实例
end
methods (Access = private)
function updateParams(app)
% 更新系统参数
app.params = struct();
app.params.fs = app.SamplingRateEditField.Value;
app.params.duration = app.DurationEditField.Value;
app.params.numSignals = numel(app.signals);
app.params.snrDb = app.SNREditField.Value;
app.params.iterations = app.IterationsEditField.Value;
app.params.totalSlots = app.TotalSlotsEditField.Value;
% 新增编码参数
app.params.encodingType = app.EncodingTypeDropDown.Value;
app.params.quantBits = app.QuantBitsEditField.Value;
app.params.stepSize = app.StepSizeEditField.Value;
app.params.frameHeader = app.FrameHeaderEditField.Value;
app.params.useCRC = app.CRCCheckBox.Value;
% 设置时隙分配策略
if app.FixedRadioButton.Value
app.params.strategy = 'fixed';
else
app.params.strategy = 'priority';
end
% 设置时钟漂移
app.params.clockDrift = zeros(1, app.params.numSignals);
if app.params.numSignals > 0
app.params.clockDrift(1) = 0.001;
end
if app.params.numSignals > 1
app.params.clockDrift(2) = 0.002;
end
if app.params.numSignals > 2
app.params.clockDrift(3:end) = -0.001;
end
end
function generateSignals(app)
% 生成信号数据
t = 0:1/app.params.fs:app.params.duration-1/app.params.fs;
app.tdmSystem.originalSignals = zeros(app.params.numSignals, length(t));
app.tdmSystem.signalInfo = cell(app.params.numSignals, 1);
for i = 1:app.params.numSignals
sigConfig = app.signals{i};
switch sigConfig.type
case '正弦波'
freq = sigConfig.frequency;
app.tdmSystem.originalSignals(i, :) = sin(2*pi*freq*t);
app.tdmSystem.signalInfo{i} = sprintf('正弦波 (%dHz)', freq);
case '方波'
freq = sigConfig.frequency;
app.tdmSystem.originalSignals(i, :) = square(2*pi*freq*t);
app.tdmSystem.signalInfo{i} = sprintf('方波 (%dHz)', freq);
case '随机噪声'
app.tdmSystem.originalSignals(i, :) = randn(1, length(t));
app.tdmSystem.signalInfo{i} = '随机噪声';
case '锯齿波'
freq = sigConfig.frequency;
app.tdmSystem.originalSignals(i, :) = sawtooth(2*pi*freq*t);
app.tdmSystem.signalInfo{i} = sprintf('锯齿波 (%dHz)', freq);
case '脉冲信号'
freq = sigConfig.frequency;
duty = 0.3; % 占空比
app.tdmSystem.originalSignals(i, :) = pulstran(t, 0:1/freq:app.params.duration, ...
'rectpuls', duty/freq);
app.tdmSystem.signalInfo{i} = sprintf('脉冲信号 (%dHz)', freq);
end
end
% 设置编码参数
app.tdmSystem.encodingParams = struct(...
'type', app.params.encodingType, ...
'quantBits', app.params.quantBits, ...
'stepSize', app.params.stepSize);
% 设置帧配置
app.tdmSystem.frameConfig = struct(...
'header', app.params.frameHeader, ...
'useCRC', app.params.useCRC);
end
function updateParametersDisplay(app)
% 更新参数显示
paramText = sprintf('系统参数:\n');
paramText = [paramText sprintf('采样频率: %d Hz\n', app.params.fs)];
paramText = [paramText sprintf('信号持续时间: %.2f 秒\n', app.params.duration)];
paramText = [paramText sprintf('信号源数量: %d\n', app.params.numSignals)];
paramText = [paramText sprintf('信噪比: %d dB\n', app.params.snrDb)];
paramText = [paramText sprintf('时隙分配策略: %s\n', app.params.strategy)];
paramText = [paramText sprintf('总时隙数量: %d\n', app.params.totalSlots)];
paramText = [paramText sprintf('仿真迭代次数: %d\n', app.params.iterations)];
% 新增编码参数
paramText = [paramText sprintf('\n编码配置:\n')];
paramText = [paramText sprintf(' 编码类型: %s\n', app.params.encodingType)];
paramText = [paramText sprintf(' 量化位数: %d bits\n', app.params.quantBits)];
paramText = [paramText sprintf(' 步长: %.4f\n', app.params.stepSize)];
% 新增帧配置
paramText = [paramText sprintf('\n帧配置:\n')];
paramText = [paramText sprintf(' 帧头: %s\n', app.params.frameHeader)];
paramText = [paramText sprintf(' CRC校验: %s\n', ifelse(app.params.useCRC, '启用', '禁用'))];
% 添加信号信息
paramText = [paramText sprintf('\n信号配置:\n')];
for i = 1:app.params.numSignals
sig = app.signals{i};
paramText = [paramText sprintf('信号 %d: %s (频率: %d Hz)\n', i, sig.type, sig.frequency)];
end
app.ParametersTextArea.Value = paramText;
end
function plotSignals(app)
% 绘制原始信号
t = 0:1/app.params.fs:app.params.duration-1/app.params.fs;
cla(app.OriginalAxes);
hold(app.OriginalAxes, 'on');
colors = lines(app.params.numSignals);
for i = 1:app.params.numSignals
plot(app.OriginalAxes, t, app.tdmSystem.originalSignals(i, :), ...
'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i});
end
hold(app.OriginalAxes, 'off');
legend(app.OriginalAxes, 'Location', 'best');
title(app.OriginalAxes, '原始信号');
xlabel(app.OriginalAxes, '时间 (s)');
ylabel(app.OriginalAxes, '幅度');
grid(app.OriginalAxes, 'on');
% 绘制TDM信号
cla(app.TDMAxes);
plot(app.TDMAxes, t, app.tdmSystem.tdmSignal);
title(app.TDMAxes, ['TDM复用信号 (' app.params.strategy '策略)']);
xlabel(app.TDMAxes, '时间 (s)');
ylabel(app.TDMAxes, '幅度');
grid(app.TDMAxes, 'on');
% 绘制解复用信号
cla(app.DemuxAxes);
hold(app.DemuxAxes, 'on');
for i = 1:app.params.numSignals
plot(app.DemuxAxes, t, app.tdmSystem.demuxSignals(i, :), ...
'Color', colors(i, :), 'DisplayName', ['信号 ' num2str(i)]);
end
hold(app.DemuxAxes, 'off');
legend(app.DemuxAxes, 'Location', 'best');
title(app.DemuxAxes, '解复用信号');
xlabel(app.DemuxAxes, '时间 (s)');
ylabel(app.DemuxAxes, '幅度');
grid(app.DemuxAxes, 'on');
% 绘制同步后信号
cla(app.SyncedAxes);
hold(app.SyncedAxes, 'on');
for i = 1:app.params.numSignals
plot(app.SyncedAxes, t, app.tdmSystem.syncedSignals(i, :), ...
'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i});
end
hold(app.SyncedAxes, 'off');
legend(app.SyncedAxes, 'Location', 'best');
title(app.SyncedAxes, '同步后信号');
xlabel(app.SyncedAxes, '时间 (s)');
ylabel(app.SyncedAxes, '幅度');
grid(app.SyncedAxes, 'on');
% 绘制误码率和信噪比
cla(app.BERAxes);
yyaxis(app.BERAxes, 'left');
bar(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.ber, 0.6, 'FaceColor', [0.2 0.6 0.8]);
ylabel(app.BERAxes, '均方误差 (MSE)');
yyaxis(app.BERAxes, 'right');
plot(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.performance.snr, 'o-', 'LineWidth', 2, 'MarkerSize', 8);
ylabel(app.BERAxes, 'SNR (dB)');
title(app.BERAxes, '信号质量分析');
xlabel(app.BERAxes, '信号编号');
grid(app.BERAxes, 'on');
xticks(app.BERAxes, 1:app.params.numSignals);
legend(app.BERAxes, {'MSE', 'SNR'}, 'Location', 'best');
end
end
% Callbacks that handle component events
methods (Access = private)
% Code that executes after component creation
function startupFcn(app)
% 初始化参数
app.signals = {};
app.params = struct();
app.StatusLabel.Text = '准备就绪';
app.ProgressBar.Color = 'green';
% 设置默认参数
app.SamplingRateEditField.Value = 1000;
app.DurationEditField.Value = 1;
app.SNREditField.Value = 20;
app.IterationsEditField.Value = 5;
app.TotalSlotsEditField.Value = 50;
app.NumSignalsEditField.Value = 0;
app.PriorityRadioButton.Value = true;
% 新增编码参数默认值
app.EncodingTypeDropDown.Value = 'PCM';
app.QuantBitsEditField.Value = 8;
app.StepSizeEditField.Value = 0.05;
app.FrameHeaderEditField.Value = 'A5A5';
app.CRCCheckBox.Value = true;
% 更新参数显示
updateParams(app);
updateParametersDisplay(app);
end
% Button pushed function: AddSignalButton
function AddSignalButtonPushed(app, ~)
% 添加新信号
signalType = app.SignalTypeDropDown.Value;
frequency = app.FrequencyEditField.Value;
if frequency <= 0
uialert(app.UIFigure, '频率必须大于0', '无效参数');
return;
end
newSignal = struct(...
'type', signalType, ...
'frequency', frequency);
app.signals{end+1} = newSignal;
app.NumSignalsEditField.Value = numel(app.signals);
% 更新信号列表
signalList = cell(1, numel(app.signals));
for i = 1:numel(app.signals)
sig = app.signals{i};
signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency);
end
app.SignalsListBox.Items = signalList;
% 更新参数
updateParams(app);
updateParametersDisplay(app);
app.StatusLabel.Text = sprintf('已添加信号: %s (%d Hz)', signalType, frequency);
end
% Button pushed function: RemoveSignalButton
function RemoveSignalButtonPushed(app, ~)
% 移除选中的信号
selectedIdx = app.SignalsListBox.Value;
if isempty(selectedIdx) || selectedIdx > numel(app.signals)
uialert(app.UIFigure, '请选择要删除的信号', '无选择');
return;
end
% 移除信号
removedSig = app.signals{selectedIdx};
app.signals(selectedIdx) = [];
% 更新信号列表
app.NumSignalsEditField.Value = numel(app.signals);
signalList = cell(1, numel(app.signals));
for i = 1:numel(app.signals)
sig = app.signals{i};
signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency);
end
app.SignalsListBox.Items = signalList;
% 如果没有信号,清除选择
if isempty(app.signals)
app.SignalsListBox.Value = [];
else
app.SignalsListBox.Value = min(selectedIdx, numel(app.signals));
end
% 更新参数
updateParams(app);
updateParametersDisplay(app);
app.StatusLabel.Text = sprintf('已移除信号: %s (%d Hz)', removedSig.type, removedSig.frequency);
end
% Value changed function: NumSignalsEditField
function NumSignalsEditFieldValueChanged(app, ~)
% 信号数量变化时更新
updateParams(app);
updateParametersDisplay(app);
end
% Value changed function: SamplingRateEditField
function SamplingRateEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Value changed function: DurationEditField
function DurationEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Value changed function: SNREditField
function SNREditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Value changed function: IterationsEditField
function IterationsEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Value changed function: TotalSlotsEditField
function TotalSlotsEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Selection changed function: StrategyButtonGroup
function StrategyButtonGroupSelectionChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% 新增编码参数变化回调
function EncodingTypeDropDownValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
function QuantBitsEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
function StepSizeEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
function FrameHeaderEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
function CRCCheckBoxValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
end
% Button pushed function: RunSimulationButton
function RunSimulationButtonPushed(app, ~)
% 运行基础仿真
app.StatusLabel.Text = '运行基础仿真...';
app.ProgressBar.Color = 'yellow';
drawnow;
try
% 更新参数
updateParams(app);
% 检查信号配置
if app.params.numSignals == 0
uialert(app.UIFigure, '请至少添加一个信号', '无信号');
app.ProgressBar.Color = 'red';
return;
end
% 检查信号数量是否足够
if app.params.numSignals < 3
uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足');
app.ProgressBar.Color = 'red';
return;
end
% 创建TDM系统
app.tdmSystem = TDMSystem(app.params);
% 生成信号
generateSignals(app);
% 运行仿真
app.tdmSystem = app.tdmSystem.runSimulation();
% 显示结果
plotSignals(app);
updateParametersDisplay(app);
app.StatusLabel.Text = '基础仿真完成!';
app.ProgressBar.Color = 'green';
catch ME
app.StatusLabel.Text = ['错误: ' ME.message];
app.ProgressBar.Color = 'red';
uialert(app.UIFigure, ME.message, '仿真错误');
end
end
% Button pushed function: RunFeedbackButton
function RunFeedbackButtonPushed(app, ~)
% 运行反馈控制仿真
app.StatusLabel.Text = '运行反馈控制仿真...';
app.ProgressBar.Color = 'yellow';
drawnow;
try
% 更新参数
updateParams(app);
% 检查信号配置
if app.params.numSignals == 0
uialert(app.UIFigure, '请至少添加一个信号', '无信号');
app.ProgressBar.Color = 'red';
return;
end
% 检查信号数量是否足够
if app.params.numSignals < 3
uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足');
app.ProgressBar.Color = 'red';
return;
end
% 创建反馈控制器
app.controller = TDMFeedbackController(app.params);
% 生成信号
generateSignals(app);
% 运行反馈仿真
app.controller = app.controller.runFeedbackSimulation();
% 显示结果(简化版)
app.tdmSystem = app.controller; % 用于显示基本结果
plotSignals(app);
updateParametersDisplay(app);
app.StatusLabel.Text = '反馈控制仿真完成!';
app.ProgressBar.Color = 'green';
% 显示反馈控制结果
visualizeFeedbackResults(app.controller);
catch ME
app.StatusLabel.Text = ['错误: ' ME.message];
app.ProgressBar.Color = 'red';
uialert(app.UIFigure, ME.message, '仿真错误');
end
end
% Button pushed function: RunAnalysisButton
function RunAnalysisButtonPushed(app, ~)
% 运行性能分析
app.StatusLabel.Text = '运行性能分析...';
app.ProgressBar.Color = 'yellow';
drawnow;
try
% 更新参数
updateParams(app);
% 检查信号配置
if app.params.numSignals == 0
uialert(app.UIFigure, '请至少添加一个信号', '无信号');
app.ProgressBar.Color = 'red';
return;
end
% 检查信号数量是否足够
if app.params.numSignals < 3
uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足');
app.ProgressBar.Color = 'red';
return;
end
% 创建性能分析器
app.analyzer = TDMPerformanceAnalyzer(app.params);
% 生成信号
generateSignals(app);
% 运行性能分析
app.analyzer = app.analyzer.runPerformanceAnalysis();
% 显示结果(简化版)
app.tdmSystem = app.analyzer; % 用于显示基本结果
plotSignals(app);
updateParametersDisplay(app);
app.StatusLabel.Text = '性能分析完成!';
app.ProgressBar.Color = 'green';
catch ME
app.StatusLabel.Text = ['错误: ' ME.message];
app.ProgressBar.Color = 'red';
uialert(app.UIFigure, ME.message, '仿真错误');
end
end
end
% App initialization and construction
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure
app.UIFigure = uifigure;
app.UIFigure.Position = [100 100 1200 900];
app.UIFigure.Name = 'TDM通信系统仿真';
app.UIFigure.Scrollable = 'on';
% Create SignalConfigPanel
app.SignalConfigPanel = uipanel(app.UIFigure);
app.SignalConfigPanel.Title = '信号配置';
app.SignalConfigPanel.Position = [20 700 360 210];
% Create NumSignalsLabel
app.NumSignalsLabel = uilabel(app.SignalConfigPanel);
app.NumSignalsLabel.Position = [20 160 80 22];
app.NumSignalsLabel.Text = '信号数量:';
% Create NumSignalsEditField
app.NumSignalsEditField = uieditfield(app.SignalConfigPanel, 'numeric');
app.NumSignalsEditField.Position = [110 160 60 22];
app.NumSignalsEditField.Value = 0;
app.NumSignalsEditField.ValueChangedFcn = createCallbackFcn(app, @NumSignalsEditFieldValueChanged, true);
% Create SignalTypeLabel
app.SignalTypeLabel = uilabel(app.SignalConfigPanel);
app.SignalTypeLabel.Position = [20 130 80 22];
app.SignalTypeLabel.Text = '信号类型:';
% Create SignalTypeDropDown
app.SignalTypeDropDown = uidropdown(app.SignalConfigPanel);
app.SignalTypeDropDown.Position = [110 130 100 22];
app.SignalTypeDropDown.Items = {'正弦波', '方波', '随机噪声', '锯齿波', '脉冲信号'};
% Create FrequencyLabel
app.FrequencyLabel = uilabel(app.SignalConfigPanel);
app.FrequencyLabel.Position = [20 100 80 22];
app.FrequencyLabel.Text = '频率 (Hz):';
% Create FrequencyEditField
app.FrequencyEditField = uieditfield(app.SignalConfigPanel, 'numeric');
app.FrequencyEditField.Position = [110 100 60 22];
app.FrequencyEditField.Value = 50;
% Create AddSignalButton
app.AddSignalButton = uibutton(app.SignalConfigPanel, 'push');
app.AddSignalButton.ButtonPushedFcn = createCallbackFcn(app, @AddSignalButtonPushed, true);
app.AddSignalButton.Position = [220 130 100 22];
app.AddSignalButton.Text = '添加信号';
% Create RemoveSignalButton
app.RemoveSignalButton = uibutton(app.SignalConfigPanel, 'push');
app.RemoveSignalButton.ButtonPushedFcn = createCallbackFcn(app, @RemoveSignalButtonPushed, true);
app.RemoveSignalButton.Position = [220 100 100 22];
app.RemoveSignalButton.Text = '移除信号';
% Create SignalsListLabel
app.SignalsListLabel = uilabel(app.SignalConfigPanel);
app.SignalsListLabel.Position = [20 70 80 22];
app.SignalsListLabel.Text = '信号列表:';
% Create SignalsListBox
app.SignalsListBox = uilistbox(app.SignalConfigPanel);
app.SignalsListBox.Position = [20 20 300 50];
app.SignalsListBox.Items = {};
% 新增编码配置面板
app.EncodingPanel = uipanel(app.UIFigure);
app.EncodingPanel.Title = '编码配置';
app.EncodingPanel.Position = [20 560 360 130];
% 编码类型
app.EncodingTypeLabel = uilabel(app.EncodingPanel);
app.EncodingTypeLabel.Position = [20 80 80 22];
app.EncodingTypeLabel.Text = '编码类型:';
app.EncodingTypeDropDown = uidropdown(app.EncodingPanel);
app.EncodingTypeDropDown.Position = [110 80 100 22];
app.EncodingTypeDropDown.Items = {'PCM', 'DPCM', 'DM'};
app.EncodingTypeDropDown.Value = 'PCM';
app.EncodingTypeDropDown.ValueChangedFcn = createCallbackFcn(app, @EncodingTypeDropDownValueChanged, true);
% 量化位数
app.QuantBitsLabel = uilabel(app.EncodingPanel);
app.QuantBitsLabel.Position = [20 50 80 22];
app.QuantBitsLabel.Text = '量化位数:';
app.QuantBitsEditField = uieditfield(app.EncodingPanel, 'numeric');
app.QuantBitsEditField.Position = [110 50 60 22];
app.QuantBitsEditField.Value = 8;
app.QuantBitsEditField.ValueChangedFcn = createCallbackFcn(app, @QuantBitsEditFieldValueChanged, true);
% 步长
app.StepSizeLabel = uilabel(app.EncodingPanel);
app.StepSizeLabel.Position = [20 20 80 22];
app.StepSizeLabel.Text = '步长:';
app.StepSizeEditField = uieditfield(app.EncodingPanel, 'numeric');
app.StepSizeEditField.Position = [110 20 60 22];
app.StepSizeEditField.Value = 0.05;
app.StepSizeEditField.ValueChangedFcn = createCallbackFcn(app, @StepSizeEditFieldValueChanged, true);
% 新增帧配置面板
app.FrameConfigPanel = uipanel(app.UIFigure);
app.FrameConfigPanel.Title = '帧配置';
app.FrameConfigPanel.Position = [20 460 360 90];
% 帧头
app.FrameHeaderLabel = uillabel(app.FrameConfigPanel);
app.FrameHeaderLabel.Position = [20 50 80 22];
app.FrameHeaderLabel.Text = '帧头:';
app.FrameHeaderEditField = uieditfield(app.FrameConfigPanel, 'text');
app.FrameHeaderEditField.Position = [110 50 100 22];
app.FrameHeaderEditField.Value = 'A5A5';
app.FrameHeaderEditField.ValueChangedFcn = createCallbackFcn(app, @FrameHeaderEditFieldValueChanged, true);
% CRC校验
app.CRCCheckBox = uicheckbox(app.FrameConfigPanel);
app.CRCCheckBox.Text = '启用CRC校验';
app.CRCCheckBox.Position = [20 20 120 22];
app.CRCCheckBox.Value = true;
app.CRCCheckBox.ValueChangedFcn = createCallbackFcn(app, @CRCCheckBoxValueChanged, true);
% Create StrategyPanel
app.StrategyPanel = uipanel(app.UIFigure);
app.StrategyPanel.Title = '时隙分配策略';
app.StrategyPanel.Position = [400 700 250 210];
% Create StrategyButtonGroup
app.StrategyButtonGroup = uibuttongroup(app.StrategyPanel);
app.StrategyButtonGroup.SelectionChangedFcn = createCallbackFcn(app, @StrategyButtonGroupSelectionChanged, true);
app.StrategyButtonGroup.Position = [20 100 200 80];
app.StrategyButtonGroup.Title = '选择策略';
% Create FixedRadioButton
app.FixedRadioButton = uiradiobutton(app.StrategyButtonGroup);
app.FixedRadioButton.Text = '固定分配';
app.FixedRadioButton.Position = [11 35 75 22];
% Create PriorityRadioButton
app.PriorityRadioButton = uiradiobutton(app.StrategyButtonGroup);
app.PriorityRadioButton.Text = '优先级分配';
app.PriorityRadioButton.Position = [11 10 100 22];
app.PriorityRadioButton.Value = true;
% Create TotalSlotsLabel
app.TotalSlotsLabel = uilabel(app.StrategyPanel);
app.TotalSlotsLabel.Position = [20 60 80 22];
app.TotalSlotsLabel.Text = '总时隙数:';
% Create TotalSlotsEditField
app.TotalSlotsEditField = uieditfield(app.StrategyPanel, 'numeric');
app.TotalSlotsEditField.ValueChangedFcn = createCallbackFcn(app, @TotalSlotsEditFieldValueChanged, true);
app.TotalSlotsEditField.Position = [110 60 60 22];
app.TotalSlotsEditField.Value = 50;
% Create SimulationPanel
app.SimulationPanel = uipanel(app.UIFigure);
app.SimulationPanel.Title = '仿真控制';
app.SimulationPanel.Position = [670 700 250 210];
% Create RunSimulationButton
app.RunSimulationButton = uibutton(app.SimulationPanel, 'push');
app.RunSimulationButton.ButtonPushedFcn = createCallbackFcn(app, @RunSimulationButtonPushed, true);
app.RunSimulationButton.Position = [30 150 190 30];
app.RunSimulationButton.Text = '运行系统仿真';
% Create RunFeedbackButton
app.RunFeedbackButton = uibutton(app.SimulationPanel, 'push');
app.RunFeedbackButton.ButtonPushedFcn = createCallbackFcn(app, @RunFeedbackButtonPushed, true);
app.RunFeedbackButton.Position = [30 100 190 30];
app.RunFeedbackButton.Text = '运行反馈控制';
% Create RunAnalysisButton
app.RunAnalysisButton = uibutton(app.SimulationPanel, 'push');
app.RunAnalysisButton.ButtonPushedFcn = createCallbackFcn(app, @RunAnalysisButtonPushed, true);
app.RunAnalysisButton.Position = [30 50 190 30];
app.RunAnalysisButton.Text = '运行性能分析';
% Create ResultsTabGroup
app.ResultsTabGroup = uitabgroup(app.UIFigure);
app.ResultsTabGroup.Position = [20 20 1150 420];
% Create SignalsTab
app.SignalsTab = uitab(app.ResultsTabGroup);
app.SignalsTab.Title = '信号可视化';
% Create OriginalAxes
app.OriginalAxes = uiaxes(app.SignalsTab);
title(app.OriginalAxes, '原始信号')
xlabel(app.OriginalAxes, '时间 (s)')
ylabel(app.OriginalAxes, '幅度')
app.OriginalAxes.Position = [20 220 530 180];
% Create TDMAxes
app.TDMAxes = uiaxes(app.SignalsTab);
title(app.TDMAxes, 'TDM复用信号')
xlabel(app.TDMAxes, '时间 (s)')
ylabel(app.TDMAxes, '幅度')
app.TDMAxes.Position = [20 20 530 180];
% Create DemuxAxes
app.DemuxAxes = uiaxes(app.SignalsTab);
title(app.DemuxAxes, '解复用信号')
xlabel(app.DemuxAxes, '时间 (s)')
ylabel(app.DemuxAxes, '幅度')
app.DemuxAxes.Position = [580 220 530 180];
% Create SyncedAxes
app.SyncedAxes = uiaxes(app.SignalsTab);
title(app.SyncedAxes, '同步后信号')
xlabel(app.SyncedAxes, '时间 (s)')
ylabel(app.SyncedAxes, '幅度')
app.SyncedAxes.Position = [580 20 530 180];
% Create PerformanceTab
app.PerformanceTab = uitab(app.ResultsTabGroup);
app.PerformanceTab.Title = '性能分析';
% Create BERAxes
app.BERAxes = uiaxes(app.PerformanceTab);
title(app.BERAxes, '信号质量分析')
xlabel(app.BERAxes, '信号编号')
app.BERAxes.Position = [50 50 1000 300];
yyaxis(app.BERAxes, 'left');
ylabel(app.BERAxes, 'MSE');
yyaxis(app.BERAxes, 'right');
ylabel(app.BERAxes, 'SNR (dB)');
% Create ParametersTab
app.ParametersTab = uitab(app.ResultsTabGroup);
app.ParametersTab.Title = '系统参数';
% Create ParametersTextArea
app.ParametersTextArea = uitextarea(app.ParametersTab);
app.ParametersTextArea.Position = [20 50 1100 340];
app.ParametersTextArea.Value = {'系统参数将在此显示'};
% Create StatusLabel
app.StatusLabel = uilabel(app.UIFigure);
app.StatusLabel.HorizontalAlignment = 'right';
app.StatusLabel.Position = [100 900 800 22];
app.StatusLabel.Text = '准备就绪';
% Create ProgressBar
app.ProgressBar = uilamp(app.UIFigure);
app.ProgressBar.Position = [930 900 20 20];
app.ProgressBar.Color = [0.47 0.67 0.19];
% Create SNRLabel
app.SNRLabel = uilabel(app.UIFigure);
app.SNRLabel.Position = [950 560 80 22];
app.SNRLabel.Text = '信噪比 (dB):';
% Create SNREditField
app.SNREditField = uieditfield(app.UIFigure, 'numeric');
app.SNREditField.ValueChangedFcn = createCallbackFcn(app, @SNREditFieldValueChanged, true);
app.SNREditField.Position = [1040 560 60 22];
app.SNREditField.Value = 20;
% Create IterationsLabel
app.IterationsLabel = uilabel(app.UIFigure);
app.IterationsLabel.Position = [950 530 80 22];
app.IterationsLabel.Text = '迭代次数:';
% Create IterationsEditField
app.IterationsEditField = uieditfield(app.UIFigure, 'numeric');
app.IterationsEditField.ValueChangedFcn = createCallbackFcn(app, @IterationsEditFieldValueChanged, true);
app.IterationsEditField.Position = [1040 530 60 22];
app.IterationsEditField.Value = 5;
% Create DurationLabel
app.DurationLabel = uilabel(app.UIFigure);
app.DurationLabel.Position = [950 500 80 22];
app.DurationLabel.Text = '持续时间 (s):';
% Create DurationEditField
app.DurationEditField = uieditfield(app.UIFigure, 'numeric');
app.DurationEditField.ValueChangedFcn = createCallbackFcn(app, @DurationEditFieldValueChanged, true);
app.DurationEditField.Position = [1040 500 60 22];
app.DurationEditField.Value = 1;
% Create SamplingRateLabel
app.SamplingRateLabel = uilabel(app.UIFigure);
app.SamplingRateLabel.Position = [950 470 80 22];
app.SamplingRateLabel.Text = '采样率 (Hz):';
% Create SamplingRateEditField
app.SamplingRateEditField = uieditfield(app.UIFigure, 'numeric');
app.SamplingRateEditField.ValueChangedFcn = createCallbackFcn(app, @SamplingRateEditFieldValueChanged, true);
app.SamplingRateEditField.Position = [1040 470 60 22];
app.SamplingRateEditField.Value = 1000;
end
end
methods (Access = public)
% Construct app
function app = TDMApp8888
% Create and configure components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
% Execute the startup function
runStartupFcn(app, @startupFcn)
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
% 辅助函数
function out = ifelse(condition, true_val, false_val)
if condition
out = true_val;
else
out = false_val;
end
end
最新发布