优化代码,使结果用单独一个窗口显示,解决窗口不能显示的问题,给我优化后完整的代码,代码:classdef TDMPerformanceAnalyzer < TDMSystem
% TDMPERFORMANCEANALYZER TDM系统性能分析工具
% 继承自TDMSystem基类,提供全面的性能分析功能
properties
snrRange % SNR测试范围 (dB)
performanceCurves % 性能曲线数据结构
detailedMetrics % 详细性能指标
convergenceAnalysis % 收敛性分析结果
modulationAnalysis % 调制方式对比分析
end
properties (Access = private)
originalParams % 原始参数备份
end
methods
function obj = TDMPerformanceAnalyzer(params)
% 构造函数
% 输入: params - 系统参数结构体
% 调用父类构造函数
obj = obj@TDMSystem(params);
% 备份原始参数
obj.originalParams = params;
% 设置默认SNR范围
obj.snrRange = 0:2:20; % 0dB到20dB,步长2dB
end
function obj = runPerformanceAnalysis(obj, customSNR)
% 主性能分析方法
% 输入: customSNR - (可选)自定义SNR范围
% 处理可选参数
if nargin > 1 && ~isempty(customSNR)
validateattributes(customSNR, {'numeric'}, {'vector', 'nonempty'}, ...
'runPerformanceAnalysis', 'customSNR');
obj.snrRange = customSNR;
end
try
% 初始化性能数据结构
numSignals = obj.params.numSignals;
numSNR = length(obj.snrRange);
% 预分配内存
obj.performanceCurves = struct(...
'ber', zeros(numSNR, numSignals), ...
'snr', zeros(numSNR, numSignals), ...
'mse', zeros(numSNR, numSignals), ...
'throughput', zeros(numSNR, numSignals));
% 保存原始SNR设置
originalSNR = obj.params.snrDb;
% 进度条显示
hWaitbar = waitbar(0, '正在执行性能分析...', ...
'Name', 'TDM性能分析', ...
'CreateCancelBtn', 'setappdata(gcbf,''canceling'',1)');
setappdata(hWaitbar, 'canceling', 0);
% 遍历不同SNR值
for snrIdx = 1:numSNR
% 检查取消操作
if getappdata(hWaitbar, 'canceling')
break;
end
% 更新SNR参数
obj.params.snrDb = obj.snrRange(snrIdx);
% 调用超类方法
obj = runSimulation(obj);
% 存储性能指标
obj.performanceCurves.ber(snrIdx, :) = obj.performance.ber;
obj.performanceCurves.snr(snrIdx, :) = obj.performance.snr;
obj.performanceCurves.mse(snrIdx, :) = obj.performance.mse;
% 计算吞吐量 (1 - BER)
obj.performanceCurves.throughput(snrIdx, :) = 1 - obj.performance.ber;
% 更新进度条
waitbar(snrIdx/numSNR, hWaitbar, ...
sprintf('正在分析 SNR=%.1f dB (%.0f%%)', ...
obj.snrRange(snrIdx), snrIdx/numSNR*100));
end
% 关闭进度条
delete(hWaitbar);
% 恢复原始SNR
obj.params.snrDb = originalSNR;
% 执行详细分析 - 确保方法名完全匹配
obj = performDetailedAnalysis(obj);
obj = performConvergenceAnalysis(obj);
obj = analyzeModulationImpact(obj);
catch ME
% 错误处理
if exist('hWaitbar', 'var') && ishandle(hWaitbar)
delete(hWaitbar);
end
rethrow(ME);
end
end
function obj = performDetailedAnalysis(obj)
% 详细性能指标计算
numSignals = obj.params.numSignals;
numSNR = length(obj.snrRange);
% 初始化结构体
obj.detailedMetrics = struct(...
'avgBER', zeros(1, numSignals), ...
'avgSNR', zeros(1, numSignals), ...
'minBER', zeros(1, numSignals), ...
'maxThroughput', zeros(1, numSignals), ...
'snrSensitivity', zeros(1, numSignals), ...
'berAt10dB', zeros(1, numSignals), ...
'berAt20dB', zeros(1, numSignals));
for i = 1:numSignals
% 提取当前信号的性能数据
berData = obj.performanceCurves.ber(:, i);
snrData = obj.performanceCurves.snr(:, i);
throughputData = obj.performanceCurves.throughput(:, i);
% 平均BER和SNR
obj.detailedMetrics.avgBER(i) = mean(berData);
obj.detailedMetrics.avgSNR(i) = mean(snrData);
% 最低BER
obj.detailedMetrics.minBER(i) = min(berData);
% 最大吞吐量
obj.detailedMetrics.maxThroughput(i) = max(throughputData);
% SNR敏感性 (BER改善率)
berDiff = diff(berData);
snrDiff = diff(obj.snrRange');
obj.detailedMetrics.snrSensitivity(i) = mean(berDiff ./ snrDiff);
% 特定SNR点的BER值
idx10dB = find(obj.snrRange >= 10, 1, 'first');
idx20dB = find(obj.snrRange >= 20, 1, 'first');
if ~isempty(idx10dB)
obj.detailedMetrics.berAt10dB(i) = berData(idx10dB);
end
if ~isempty(idx20dB) && idx20dB <= numSNR
obj.detailedMetrics.berAt20dB(i) = berData(idx20dB);
end
end
end
function obj = performConvergenceAnalysis(obj, threshold)
% 收敛性分析
% 输入: threshold - (可选)收敛判断阈值
if nargin < 2 || isempty(threshold)
threshold = 1e-4; % 默认收敛判断阈值
end
numSignals = obj.params.numSignals;
obj.convergenceAnalysis = struct(...
'convergencePoint', zeros(1, numSignals), ...
'stableBER', zeros(1, numSignals), ...
'convergenceSNR', zeros(1, numSignals));
for i = 1:numSignals
berValues = obj.performanceCurves.ber(:, i);
% 找到BER变化小于阈值的点
berDiff = abs(diff(berValues));
convergenceIdx = find(berDiff < threshold, 1, 'first');
if isempty(convergenceIdx)
obj.convergenceAnalysis.convergencePoint(i) = length(obj.snrRange);
obj.convergenceAnalysis.stableBER(i) = berValues(end);
obj.convergenceAnalysis.convergenceSNR(i) = obj.snrRange(end);
else
obj.convergenceAnalysis.convergencePoint(i) = convergenceIdx;
obj.convergenceAnalysis.stableBER(i) = berValues(convergenceIdx);
obj.convergenceAnalysis.convergenceSNR(i) = obj.snrRange(convergenceIdx);
end
end
end
function obj = analyzeModulationImpact(obj)
% 调制方式影响分析
if isfield(obj.params, 'signalModulations') && ~isempty(obj.params.signalModulations)
modTypes = unique(obj.params.signalModulations);
else
% 如果没有指定调制方式,默认为所有信号相同
modTypes = {'Unknown'};
obj.params.signalModulations = repmat(modTypes, 1, obj.params.numSignals);
end
numModTypes = length(modTypes);
obj.modulationAnalysis = struct(...
'modulationTypes', {modTypes}, ...
'avgBER', zeros(1, numModTypes), ...
'avgSNR', zeros(1, numModTypes), ...
'sensitivity', zeros(1, numModTypes), ...
'minBER', zeros(1, numModTypes), ...
'maxThroughput', zeros(1, numModTypes));
for m = 1:numModTypes
modType = modTypes{m};
signalIndices = find(strcmp(obj.params.signalModulations, modType));
if isempty(signalIndices)
continue;
end
% 提取该调制方式的所有性能数据
berValues = obj.performanceCurves.ber(:, signalIndices);
snrValues = obj.performanceCurves.snr(:, signalIndices);
throughputValues = obj.performanceCurves.throughput(:, signalIndices);
% 计算平均性能
obj.modulationAnalysis.avgBER(m) = mean(berValues(:));
obj.modulationAnalysis.avgSNR(m) = mean(snrValues(:));
% 计算灵敏度 (BER随SNR的变化率)
meanBer = mean(berValues, 2);
berDiff = diff(meanBer);
snrDiff = diff(obj.snrRange');
obj.modulationAnalysis.sensitivity(m) = mean(berDiff ./ snrDiff);
% 最佳性能
obj.modulationAnalysis.minBER(m) = min(berValues(:));
obj.modulationAnalysis.maxThroughput(m) = max(throughputValues(:));
end
end
function figHandle = showAnalysisResults(obj, figHandle)
% 在独立窗口中显示分析结果
% 输入: figHandle - (可选)现有图形句柄
% 输出: figHandle - 图形句柄
% 创建独立结果窗口
if nargin < 2 || isempty(figHandle) || ~isvalid(figHandle)
figHandle = figure('Name', 'TDM系统性能综合分析', ...
'Position', [100, 100, 1400, 900], ...
'Color', 'w', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'ToolBar', 'figure');
else
figure(figHandle);
clf;
end
% 创建主布局
mainLayout = uix.VBox('Parent', figHandle, 'Padding', 5);
% 标题面板
titlePanel = uipanel('Parent', mainLayout, ...
'BorderType', 'none', ...
'BackgroundColor', [0.8 0.9 1]);
titleText = sprintf('TDM系统综合分析 (策略: %s, 总时隙: %d)', ...
obj.params.strategy, obj.params.totalSlots);
uicontrol('Parent', titlePanel, ...
'Style', 'text', ...
'String', titleText, ...
'FontSize', 16, ...
'FontWeight', 'bold', ...
'BackgroundColor', [0.8 0.9 1], ...
'Position', [10, 10, 1380, 40]);
% 选项卡组容器
tabContainer = uix.VBox('Parent', mainLayout);
% 创建选项卡组
tabGroup = uitabgroup('Parent', tabContainer);
% 选项卡1: 核心性能指标
tab1 = uitab(tabGroup, 'Title', '核心指标');
axesGrid = uix.Grid('Parent', tab1, 'Spacing', 10);
% 1. BER vs SNR曲线
ax1 = axes('Parent', uicontainer('Parent', axesGrid));
hold(ax1, 'on');
colors = lines(obj.params.numSignals);
for i = 1:obj.params.numSignals
% 处理可能的零值BER
logBER = log10(max(obj.performanceCurves.ber(:, i), 1e-20));
plot(ax1, obj.snrRange, logBER, ...
'Color', colors(i, :), 'LineWidth', 2, ...
'DisplayName', sprintf('信号 %d', i));
end
hold(ax1, 'off');
title(ax1, '误码率(BER) vs 信噪比(SNR)');
xlabel(ax1, 'SNR (dB)');
ylabel(ax1, 'log_{10}(BER)');
grid(ax1, 'on');
legend(ax1, 'show', 'Location', 'best');
% 2. 吞吐量 vs SNR曲线
ax2 = axes('Parent', uicontainer('Parent', axesGrid));
hold(ax2, 'on');
for i = 1:obj.params.numSignals
plot(ax2, obj.snrRange, obj.performanceCurves.throughput(:, i), ...
'Color', colors(i, :), 'LineWidth', 2, ...
'DisplayName', sprintf('信号 %d', i));
end
hold(ax2, 'off');
title(ax2, '吞吐量 vs 信噪比(SNR)');
xlabel(ax2, 'SNR (dB)');
ylabel(ax2, '吞吐量 (1 - BER)');
grid(ax2, 'on');
legend(ax2, 'Location', 'best');
% 3. 调制方式性能对比
ax3 = axes('Parent', uicontainer('Parent', axesGrid));
modTypes = obj.modulationAnalysis.modulationTypes;
numModTypes = length(modTypes);
barValues = [obj.modulationAnalysis.avgBER; ...
obj.modulationAnalysis.avgSNR];
bar(ax3, barValues');
set(ax3, 'XTickLabel', modTypes);
title(ax3, '调制方式性能对比');
ylabel(ax3, '性能指标');
legend(ax3, {'平均BER', '平均SNR'}, 'Location', 'best');
grid(ax3, 'on');
% 添加数值标签
for i = 1:numModTypes
if barValues(1, i) > 0
text(ax3, i, barValues(1, i), sprintf('%.2e', barValues(1, i)), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
end
text(ax3, i, barValues(2, i), sprintf('%.1f dB', barValues(2, i)), ...
'VerticalAlignment', 'top', 'HorizontalAlignment', 'center');
end
% 4. 收敛点分析
ax4 = axes('Parent', uicontainer('Parent', axesGrid));
convergencePoints = obj.convergenceAnalysis.convergencePoint;
stableBER = obj.convergenceAnalysis.stableBER;
yyaxis(ax4, 'left');
bar(ax4, convergencePoints, 'FaceColor', [0.2 0.6 0.8]);
ylabel(ax4, '收敛点 (SNR索引)');
yyaxis(ax4, 'right');
% 处理可能的零值BER
logStableBER = log10(max(stableBER, 1e-20));
plot(ax4, logStableBER, 'o-', 'LineWidth', 2, 'MarkerSize', 8);
ylabel(ax4, 'log_{10}(稳定BER)');
title(ax4, '信号收敛分析');
xlabel(ax4, '信号编号');
grid(ax4, 'on');
legend(ax4, {'收敛点', '稳定BER'}, 'Location', 'best');
% 5. SNR敏感性分析
ax5 = axes('Parent', uicontainer('Parent', axesGrid));
sensitivity = obj.detailedMetrics.snrSensitivity;
bar(ax5, sensitivity, 'FaceColor', [0.8 0.2 0.2]);
title(ax5, 'SNR敏感性分析');
xlabel(ax5, '信号编号');
ylabel(ax5, 'BER变化率 / dB');
grid(ax5, 'on');
% 添加数值标签
for i = 1:length(sensitivity)
text(ax5, i, sensitivity(i), sprintf('%.2e', sensitivity(i)), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
end
% 6. 综合性能评分
ax6 = axes('Parent', uicontainer('Parent', axesGrid));
% 性能评分公式: 权重分配
performanceScore = 0.4 * (1 - obj.detailedMetrics.avgBER) + ...
0.3 * (obj.detailedMetrics.avgSNR / 30) + ...
0.2 * obj.detailedMetrics.maxThroughput + ...
0.1 * (1 - abs(obj.detailedMetrics.snrSensitivity));
bar(ax6, performanceScore, 'FaceColor', [0.5 0.2 0.8]);
title(ax6, '信号综合性能评分');
xlabel(ax6, '信号编号');
ylabel(ax6, '性能评分 (0-1)');
ylim(ax6, [0 1]);
grid(ax6, 'on');
% 添加数值标签
for i = 1:length(performanceScore)
text(ax6, i, performanceScore(i), sprintf('%.3f', performanceScore(i)), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
end
% 设置网格布局
set(axesGrid, 'Widths', [-1 -1 -1], 'Heights', [-1 -1]);
% 选项卡2: 详细数据视图
tab2 = uitab(tabGroup, 'Title', '详细数据');
tablePanel = uipanel('Parent', tab2, 'BorderType', 'none');
tableData = obj.getPerformanceTableData();
uitable('Parent', tablePanel, ...
'Data', tableData, ...
'ColumnName', {'信号', '调制方式', '平均BER', '平均SNR(dB)', '最低BER', '最大吞吐量', 'SNR敏感性', '10dB BER', '20dB BER'}, ...
'Units', 'normalized', ...
'Position', [0.05, 0.05, 0.9, 0.9], ...
'FontSize', 10);
% 选项卡3: 收敛性分析
tab3 = uitab(tabGroup, 'Title', '收敛性');
convGrid = uix.HBox('Parent', tab3, 'Spacing', 10);
% 收敛点可视化
convPanel1 = uipanel('Parent', convGrid, 'Title', '收敛点可视化');
ax7 = axes('Parent', convPanel1);
hold(ax7, 'on');
for i = 1:obj.params.numSignals
berData = obj.performanceCurves.ber(:, i);
convergenceSNR = obj.convergenceAnalysis.convergenceSNR(i);
convergenceIdx = obj.convergenceAnalysis.convergencePoint(i);
% 处理可能的零值BER
logBER = log10(max(berData, 1e-20));
plot(ax7, obj.snrRange, logBER, ...
'Color', colors(i, :), 'LineWidth', 2, ...
'DisplayName', sprintf('信号 %d', i));
% 标记收敛点
plot(ax7, convergenceSNR, logBER(convergenceIdx), ...
'o', 'MarkerSize', 10, 'MarkerFaceColor', colors(i, :));
end
hold(ax7, 'off');
title(ax7, 'BER收敛点');
xlabel(ax7, 'SNR (dB)');
ylabel(ax7, 'log_{10}(BER)');
grid(ax7, 'on');
legend(ax7, 'show', 'Location', 'best');
% 收敛SNR值
convPanel2 = uipanel('Parent', convGrid, 'Title', '收敛SNR值');
ax8 = axes('Parent', convPanel2);
convergenceSNR = obj.convergenceAnalysis.convergenceSNR;
bar(ax8, convergenceSNR, 'FaceColor', [0.3 0.7 0.5]);
title(ax8, '各信号收敛所需SNR');
xlabel(ax8, '信号编号');
ylabel(ax8, '收敛SNR (dB)');
grid(ax8, 'on');
% 设置布局比例
set(convGrid, 'Widths', [-2 -1]);
% 添加导出按钮
buttonPanel = uix.HButtonBox('Parent', mainLayout, 'Padding', 10);
uicontrol('Parent', buttonPanel, ...
'Style', 'pushbutton', ...
'String', '导出到Excel', ...
'Callback', @(src,evt) obj.exportToExcel());
uicontrol('Parent', buttonPanel, ...
'Style', 'pushbutton', ...
'String', '关闭窗口', ...
'Callback', @(src,evt) close(figHandle));
% 设置主布局比例
set(mainLayout, 'Heights', [50 -1 40]);
% 确保图形更新
drawnow;
end
function tableData = getPerformanceTableData(obj)
% 生成性能数据表格
numSignals = obj.params.numSignals;
tableData = cell(numSignals, 9);
for i = 1:numSignals
tableData{i, 1} = i; % 信号编号
% 调制方式
if isfield(obj.params, 'signalModulations') && length(obj.params.signalModulations) >= i
tableData{i, 2} = obj.params.signalModulations{i};
else
tableData{i, 2} = 'N/A';
end
% 性能数据
tableData{i, 3} = sprintf('%.2e', obj.detailedMetrics.avgBER(i));
tableData{i, 4} = sprintf('%.2f', obj.detailedMetrics.avgSNR(i));
tableData{i, 5} = sprintf('%.2e', obj.detailedMetrics.minBER(i));
tableData{i, 6} = sprintf('%.4f', obj.detailedMetrics.maxThroughput(i));
tableData{i, 7} = sprintf('%.2e', obj.detailedMetrics.snrSensitivity(i));
tableData{i, 8} = sprintf('%.2e', obj.detailedMetrics.berAt10dB(i));
tableData{i, 9} = sprintf('%.2e', obj.detailedMetrics.berAt20dB(i));
end
end
function exportToExcel(obj, filename)
% 导出性能数据到Excel
% 输入: filename - 输出文件名
if nargin < 2
[file, path] = uiputfile('*.xlsx', '保存性能分析结果', ...
'TDM_Performance_Analysis.xlsx');
if isequal(file, 0)
disp('用户取消导出操作');
return;
end
filename = fullfile(path, file);
end
% 创建数据表
sheet1 = obj.getPerformanceTableData();
headers = {'信号', '调制方式', '平均BER', '平均SNR(dB)', '最低BER', '最大吞吐量', 'SNR敏感性', '10dB BER', '20dB BER'};
% 写入详细性能数据
writetable(cell2table([headers; sheet1]), filename, 'Sheet', '详细性能');
% 写入SNR扫描数据
snrHeaders = {'SNR(dB)'};
for i = 1:obj.params.numSignals
snrHeaders{end+1} = sprintf('信号%d_BER', i);
snrHeaders{end+1} = sprintf('信号%d_吞吐量', i);
end
snrData = num2cell([obj.snrRange', ...
obj.performanceCurves.ber, ...
obj.performanceCurves.throughput]);
writetable(cell2table([snrHeaders; snrData]), filename, 'Sheet', 'SNR扫描');
% 写入调制方式分析
modHeaders = {'调制方式', '平均BER', '平均SNR(dB)', '灵敏度', '最低BER', '最大吞吐量'};
modData = cell(length(obj.modulationAnalysis.modulationTypes), 6);
for m = 1:length(obj.modulationAnalysis.modulationTypes)
modData{m, 1} = obj.modulationAnalysis.modulationTypes{m};
modData{m, 2} = obj.modulationAnalysis.avgBER(m);
modData{m, 3} = obj.modulationAnalysis.avgSNR(m);
modData{m, 4} = obj.modulationAnalysis.sensitivity(m);
modData{m, 5} = obj.modulationAnalysis.minBER(m);
modData{m, 6} = obj.modulationAnalysis.maxThroughput(m);
end
writetable(cell2table([modHeaders; modData]), filename, 'Sheet', '调制分析');
disp(['性能数据已导出到: ' filename]);
% 显示导出成功消息
msgbox(sprintf('性能分析结果已成功导出到:\n%s', filename), ...
'导出完成', 'help');
end
end
methods (Static)
function analyzer = analyzeSystem(params, customSNR)
% 静态方法: 完整分析工作流
% 输入: params - 系统参数
% customSNR - (可选)自定义SNR范围
analyzer = TDMPerformanceAnalyzer(params);
if nargin > 1
analyzer = runPerformanceAnalysis(analyzer, customSNR);
else
analyzer = runPerformanceAnalysis(analyzer);
end
% 在新窗口中显示结果
figure = showAnalysisResults(analyzer);
% 等待窗口关闭
uiwait(figure);
% 提示用户导出
choice = questdlg('是否导出分析结果?', '导出选项', ...
'是', '否', '是');
if strcmp(choice, '是')
exportToExcel(analyzer);
end
end
end
end