优化下面的代码,使显示的图框更美观,图框布局更美观,显示的结果显示完全详细,增加和删除信号有显示:classdef TDMApp222 < 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
PriorityWeightsLabel matlab.ui.control.Label
PriorityWeightsEditField matlab.ui.control.EditField
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;
% 设置时隙分配策略
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 >= 1
app.params.clockDrift(1) = 0.001;
end
if app.params.numSignals >= 2
app.params.clockDrift(2) = 0.002;
end
if app.params.numSignals >= 3
app.params.clockDrift(3:end) = -0.001;
end
% 解析优先级权重
if ~isempty(app.PriorityWeightsEditField.Value)
try
weights = str2num(app.PriorityWeightsEditField.Value);
if numel(weights) ~= app.params.numSignals
error('权重数量必须等于信号数量');
end
app.params.priorities = weights / sum(weights);
catch
% 使用默认权重
app.params.priorities = ones(1, app.params.numSignals) / app.params.numSignals;
end
else
% 默认权重
app.params.priorities = ones(1, app.params.numSignals) / app.params.numSignals;
end
end
function generateSignals(app)
% 生成信号数据 - 支持任意数量的信号
t = 0:1/app.params.fs:app.params.duration-1/app.params.fs;
numSamples = length(t);
app.tdmSystem.signals = zeros(app.params.numSignals, numSamples);
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;
amp = sigConfig.amplitude;
app.tdmSystem.signals(i, :) = amp * sin(2*pi*freq*t);
app.tdmSystem.signalInfo{i} = sprintf('正弦波 (%dHz, %.1fV)', freq, amp);
case '方波'
freq = sigConfig.frequency;
amp = sigConfig.amplitude;
duty = sigConfig.dutyCycle;
app.tdmSystem.signals(i, :) = amp * square(2*pi*freq*t, duty);
app.tdmSystem.signalInfo{i} = sprintf('方波 (%dHz, %.1fV, %.0f%%)', freq, amp, duty);
case '随机噪声'
amp = sigConfig.amplitude;
app.tdmSystem.signals(i, :) = amp * randn(1, numSamples);
app.tdmSystem.signalInfo{i} = sprintf('随机噪声 (σ=%.1fV)', amp);
case '锯齿波'
freq = sigConfig.frequency;
amp = sigConfig.amplitude;
app.tdmSystem.signals(i, :) = amp * sawtooth(2*pi*freq*t);
app.tdmSystem.signalInfo{i} = sprintf('锯齿波 (%dHz, %.1fV)', freq, amp);
case '脉冲信号'
freq = sigConfig.frequency;
amp = sigConfig.amplitude;
duty = 0.3; % 占空比
app.tdmSystem.signals(i, :) = amp * pulstran(t, 0:1/freq:app.params.duration, ...
'rectpuls', duty/freq);
app.tdmSystem.signalInfo{i} = sprintf('脉冲信号 (%dHz, %.1fV)', freq, amp);
end
end
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')];
for i = 1:app.params.numSignals
sig = app.signals{i};
switch sig.type
case {'正弦波', '方波', '锯齿波', '脉冲信号'}
paramText = [paramText sprintf('信号 %d: %s (频率: %d Hz, 振幅: %.1fV)', ...
i, sig.type, sig.frequency, sig.amplitude)];
if strcmp(sig.type, '方波')
paramText = [paramText sprintf(', 占空比: %.0f%%', sig.dutyCycle)];
end
paramText = [paramText newline];
case '随机噪声'
paramText = [paramText sprintf('信号 %d: %s (振幅: %.1fV)', ...
i, sig.type, sig.amplitude) newline];
end
end
% 添加优先级权重
paramText = [paramText sprintf('\n优先级权重:\n')];
for i = 1:app.params.numSignals
paramText = [paramText sprintf('信号 %d: %.2f\n', i, app.params.priorities(i))];
end
app.ParametersTextArea.Value = paramText;
end
function plotSignals(app)
% 绘制原始信号 - 优化布局
t = 0:1/app.params.fs:app.params.duration-1/app.params.fs;
colors = lines(app.params.numSignals);
% 原始信号
cla(app.OriginalAxes);
if app.params.numSignals > 0
hold(app.OriginalAxes, 'on');
for i = 1:app.params.numSignals
plot(app.OriginalAxes, t, app.tdmSystem.signals(i, :), ...
'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i});
end
hold(app.OriginalAxes, 'off');
legend(app.OriginalAxes, 'Location', 'best', 'Interpreter', 'none');
title(app.OriginalAxes, '原始信号');
xlabel(app.OriginalAxes, '时间 (s)');
ylabel(app.OriginalAxes, '幅度');
grid(app.OriginalAxes, 'on');
end
% TDM信号
cla(app.TDMAxes);
if ~isempty(app.tdmSystem.tdmSignal)
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');
end
% 解复用信号
cla(app.DemuxAxes);
if ~isempty(app.tdmSystem.demuxSignals) && app.params.numSignals > 0
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');
end
% 同步后信号
cla(app.SyncedAxes);
if ~isempty(app.tdmSystem.syncedSignals) && app.params.numSignals > 0
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', 'Interpreter', 'none');
title(app.SyncedAxes, '同步后信号');
xlabel(app.SyncedAxes, '时间 (s)');
ylabel(app.SyncedAxes, '幅度');
grid(app.SyncedAxes, 'on');
end
% 误码率
cla(app.BERAxes);
if ~isempty(app.tdmSystem.ber) && app.params.numSignals > 0
bar(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.ber, 0.6, 'FaceColor', [0.2 0.4 0.8]);
title(app.BERAxes, '各信号的均方误差');
xlabel(app.BERAxes, '信号编号');
ylabel(app.BERAxes, '均方误差 (MSE)');
grid(app.BERAxes, 'on');
xticks(app.BERAxes, 1:app.params.numSignals);
% 添加数据标签
hold(app.BERAxes, 'on');
for i = 1:app.params.numSignals
text(app.BERAxes, i, app.tdmSystem.ber(i), ...
sprintf('%.4f', app.tdmSystem.ber(i)), ...
'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'bottom');
end
hold(app.BERAxes, 'off');
end
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.PriorityWeightsEditField.Value = '';
% 更新参数显示
updateParams(app);
updateParametersDisplay(app);
end
% Button pushed function: AddSignalButton
function AddSignalButtonPushed(app, ~)
% 添加新信号 - 支持振幅参数
signalType = app.SignalTypeDropDown.Value;
frequency = app.FrequencyEditField.Value;
amplitude = 1.0; % 默认振幅
dutyCycle = 50; % 默认占空比
if frequency <= 0
uialert(app.UIFigure, '频率必须大于0', '无效参数');
return;
end
% 为方波添加占空比配置
if strcmp(signalType, '方波')
dutyCycle = inputdlg('请输入占空比 (0-100):', '方波参数', [1 40], {'50'});
if isempty(dutyCycle)
return;
end
dutyCycle = str2double(dutyCycle{1});
if isnan(dutyCycle) || dutyCycle < 0 || dutyCycle > 100
uialert(app.UIFigure, '占空比必须在0-100之间', '无效参数');
return;
end
end
% 为所有信号添加振幅配置
amplitude = inputdlg('请输入信号振幅:', '振幅参数', [1 40], {'1.0'});
if isempty(amplitude)
return;
end
amplitude = str2double(amplitude{1});
if isnan(amplitude) || amplitude <= 0
uialert(app.UIFigure, '振幅必须大于0', '无效参数');
return;
end
newSignal = struct(...
'type', signalType, ...
'frequency', frequency, ...
'amplitude', amplitude, ...
'dutyCycle', dutyCycle);
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};
switch sig.type
case {'正弦极波', '方波', '锯齿波', '脉冲信号'}
signalList{i} = sprintf('信号 %d: %s (%d Hz, %.1fV)', i, sig.type, sig.frequency, sig.amplitude);
case '随机噪声'
signalList{i} = sprintf('信号 %极d: %s (σ=%.1fV)', i, sig.type, sig.amplitude);
end
end
app.SignalsListBox.Items = signalList;
% 更新参数
updateParams(app);
updateParametersDisplay(app);
app.StatusLabel.Text = sprintf('已添加信号: %s (%d Hz, %.1fV)', signalType, frequency, amplitude);
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};
switch sig.type
case {'正弦波', '方波', '锯齿波', '脉冲信号'}
signalList{i} = sprintf('信号 %d: %s (%d Hz, %.1fV)', i, sig.type, sig.frequency, sig.amplitude);
case '随机噪声'
signalList{i} = sprintf('信号 %d: %s (σ=%.1fV)', i, sig.type, sig.amplitude);
end
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, %.1fV)', removedSig.type, removedSig.frequency, removedSig.amplitude);
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
% 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.totalSlots < app.params.numSignals
uialert(app.UIFigure, '总时隙数必须大于等于信号数量', '无效参数');
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.totalSlots < app.params.numSignals
uialert(app.UIFigure, '总时隙数必须大于等于信号数量', '无效参数');
app.ProgressBar.Color = 'red';
return;
end
% 创建反馈控制器
app.controller = TDMFeedbackController(app.params);
% 生成信号
generateSignals(app);
% 运行反馈仿真
app.controller.runFeedbackSimulation();
% 显示结果
app.tdmSystem = app.controller; % 用于显示基本结果
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: 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.totalSlots < app.params.numSignals
uialert(app.UIFigure, '总时隙数必须大于等于信号数量', '无效参数');
app.ProgressBar.Color = 'red';
return;
end
% 创建性能分析器 - 使用优化后的类
app.analyzer = TDMPerformanceAnalyzer(app.params);
% 生成信号
generateSignals(app);
% 运行性能分析 - 调用正确的方法
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
% Value changed function: PriorityWeightsEditField
function PriorityWeightsEditFieldValueChanged(app, ~)
updateParams(app);
updateParametersDisplay(app);
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 850];
app.UIFigure.Name = 'TDM通信系统仿真';
app.UIFigure.Scrollable = 'on';
% Create SignalConfigPanel
app.SignalConfigPanel = uipanel(app.UIFigure);
app.SignalConfigPanel.Title = '信号配置';
app.SignalConfigPanel.Position = [20 620 360 200];
% 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.Editable = 'off'; % 设置为只读
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 = {};
% Create StrategyPanel
app.StrategyPanel = uipanel(app.UIFigure);
app.StrategyPanel.Title = '时隙分配策略';
app.StrategyPanel.Position = [400 620 250 200];
% 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 620 250 200];
% 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 580];
% 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 300 530 250];
app.OriginalAxes.Toolbar = [];
% Create TDMAxes
app.TDMAxes = uiaxes(app.SignalsTab);
title(app.TDMAxes, 'TDM复用信号')
xlabel(app.TDMAxes, '时间 (s)')
ylabel(app.TDMAxes, '幅度')
app.TDMAxes.Position = [20 20 530 250];
app.TDMAxes.Toolbar = [];
% Create DemuxAxes
app.DemuxAxes = uiaxes(app.SignalsTab);
title(app.DemuxAxes, '解复用信号')
xlabel(app.DemuxAxes, '时间 (s)')
ylabel(app.DemuxAxes, '幅度')
app.DemuxAxes.Position = [580 300 530 250];
app.DemuxAxes.Toolbar = [];
% Create SyncedAxes
app.SyncedAxes = uiaxes(app.SignalsTab);
title(app.SyncedAxes, '同步后信号')
xlabel(app.SyncedAxes, '时间 (s)')
ylabel(app.SyncedAxes, '幅度')
app.SyncedAxes.Position = [580 20 530 250];
app.SyncedAxes.Toolbar = [];
% Create PerformanceTab
app.PerformanceTab = uitab(app.ResultsTabGroup);
app.PerformanceTab.Title = '性能分析';
% Create BERAxes
app.BERAxes = uiaxes(app.PerformanceTab);
title(app.BERAxes, '均方误差 (MSE)')
xlabel(app.BERAxes, '信号编号')
ylabel(app.BERAxes, 'MSE')
app.BERAxes.Position = [50 150 1000 400];
app.BERAxes.Toolbar = [];
% Create ParametersTab
app.ParametersTab = uitab(app.ResultsTabGroup);
app.ParametersTab.Title = '系统参数';
% Create ParametersTextArea
app.ParametersTextArea = uitextarea(app.ParametersTab);
app.ParametersTextArea.Position = [20 50 1100 500];
app.ParametersTextArea.Value = {'系统参数将在此显示'};
% Create StatusLabel
app.StatusLabel = uilabel(app.UIFigure);
app.StatusLabel.HorizontalAlignment = 'right';
app.StatusLabel.Position = [100 830 800 22];
app.StatusLabel.Text = '准备就绪';
% Create ProgressBar
app.ProgressBar = uilamp(app.UIFigure);
app.ProgressBar.Position = [930 830 20 20];
app.ProgressBar.Color = [0.47 0.67 0.19];
% Create SNRLabel
app.SNRLabel = uilabel(app.UIFigure);
app.SNRLabel.Position = [950 620 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 620 60 22];
app.SNREditField.Value = 20;
% Create IterationsLabel
app.IterationsLabel = uilabel(app.UIFigure);
app.IterationsLabel.Position = [950 590 80 22];
app.IterationsLabel.Text = '迭代次数:';
% Create IterationsEditField
app.IterationsEditField = uieditfield(app.UIFigure, 'numeric');
app.IterationsEditField.ValueChangedFcn = createCallbackFcn(app, @IterationsEditFieldValueChanged, true);
app.IterationsEditField.Position = [1040 590 60 22];
app.IterationsEditField.Value = 5;
% Create DurationLabel
app.DurationLabel = uilabel(app.UIFigure);
app.DurationLabel.Position = [950 560 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 560 60 22];
app.DurationEditField.Value = 1;
% Create SamplingRateLabel
app.SamplingRateLabel = uilabel(app.UIFigure);
app.SamplingRateLabel.Position = [950 530 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 530 60 22];
app.SamplingRateEditField.Value = 1000;
% Create PriorityWeightsLabel
app.PriorityWeightsLabel = uilabel(app.UIFigure);
app.PriorityWeightsLabel.Position = [950 500 100 22];
app.PriorityWeightsLabel.Text = '优先级权重:';
% Create PriorityWeightsEditField
app.PriorityWeightsEditField = uieditfield(app.UIFigure, 'text');
app.PriorityWeightsEditField.ValueChangedFcn = createCallbackFcn(app, @PriorityWeightsEditFieldValueChanged, true);
app.PriorityWeightsEditField.Position = [1040 500 120 22];
app.PriorityWeightsEditField.Value = '';
app.PriorityWeightsEditField.Tooltip = '输入权重向量,如: [0.4, 0.3, 0.3]';
end
end
methods (Access = public)
% Construct app
function app = TDMApp222
% 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
最新发布