% -------------------------------------------------------------------------
% 1. 模型基础配置(根据实际路径调整)
% -------------------------------------------------------------------------
model_names = {'commdvbt_no_codec_1','commdvbt_no_codec_64qam'}; % 两个模型名称
model_dir = fullfile('E:', 'fangzhen'); % 模型所在目录
% 检查模型文件路径
model_paths = cell(1, 2);
for k = 1:2
model_paths{k} = fullfile(model_dir, [model_names{k} '.slx']);
if ~exist(model_paths{k}, 'file')
error('模型文件不存在,请检查路径:%s', model_paths{k});
end
end
% -------------------------------------------------------------------------
% 2. 加载模型(加载两个模型)
% -------------------------------------------------------------------------
for k = 1:2
try
load_system(model_names{k});
disp(['模型加载成功:' model_names{k}]);
catch err
error('模型加载失败:%s', err.message);
end
end
% -------------------------------------------------------------------------
% 3. 定义Eb/No遍历范围(根据需求调整)
% -------------------------------------------------------------------------
ebno_start = -10;
ebno_end = 10;
ebno_step = 1;
ebno_values = ebno_start:ebno_step:ebno_end;
num_runs = length(ebno_values);
% -------------------------------------------------------------------------
% 4. 初始化结果数组(两个模型的结果)
% -------------------------------------------------------------------------
ber_results1 = zeros(1, num_runs); % 模型1的结果
ber_results2 = zeros(1, num_runs); % 模型2的结果
% -------------------------------------------------------------------------
% 5. 循环遍历每个Eb/No值,运行两个仿真并提取BER
% -------------------------------------------------------------------------
disp('------------------- 开始遍历Eb/No值 -------------------');
for i = 1:num_runs
current_ebno = ebno_values(i);
% ========================= 运行第一个模型 =========================
% 设置模型1的AWGN Channel
awgn_block_path1 = [model_names{1} '/AWGN Channel'];
set_param(awgn_block_path1, 'EbNo', num2str(current_ebno));
% 运行模型1
sim(model_names{1});
% 提取模型1的BER数据(假设输出变量名为BER_data1)
if ~exist('BER_data1', 'var')
error('基础工作区中不存在BER_data1变量');
end
ber_data1 = evalin('base', 'BER_data1');
if isa(ber_data1, 'timeseries')
ber_data1 = ber_data1.Data;
end
% 提取稳态BER(取最后一行第一列)
steady_ber1 = ber_data1(end, 1);
ber_results1(i) = steady_ber1;
fprintf('[模型1] Eb/No = %.1f dB -> BER = %.6f\n', current_ebno, steady_ber1);
% ========================= 运行第二个模型 =========================
% 设置模型2的AWGN Channel
awgn_block_path2 = [model_names{2} '/AWGN Channel'];
set_param(awgn_block_path2, 'EbNo', num2str(current_ebno));
% 运行模型2
sim(model_names{2});
% 提取模型2的BER数据(假设输出变量名为BER_data2)
if ~exist('BER_data2', 'var')
error('基础工作区中不存在BER_data2变量');
end
ber_data2 = evalin('base', 'BER_data2');
if isa(ber_data2, 'timeseries')
ber_data2 = ber_data2.Data;
end
% 提取稳态BER(取最后一行第一列)
steady_ber2 = ber_data2(end, 1);
ber_results2(i) = steady_ber2;
fprintf('[模型2] Eb/No = %.1f dB -> BER = %.6f\n\n', current_ebno, steady_ber2);
end
% -------------------------------------------------------------------------
% 6. 绘制两条BER曲线(同一张图)
% -------------------------------------------------------------------------
disp('------------------- 绘制性能对比曲线 -------------------');
figure('Name', 'BER性能对比', 'Position', [100 100 900 600]);
semilogy(ebno_values, ber_results1, 'bo-', 'LineWidth', 1.5, 'MarkerSize', 8, 'MarkerFaceColor', 'b');
hold on; % 保持图形
semilogy(ebno_values, ber_results2, 'rs--', 'LineWidth', 1.5, 'MarkerSize', 8, 'MarkerFaceColor', 'r');
% 图形标注
xlabel('Eb/No (dB)', 'FontSize', 12);
ylabel('Bit Error Rate (BER)', 'FontSize', 12);
title('QPSK-OFDM和64QAM-OFDM系统BER性能对比', 'FontSize', 14, 'FontWeight', 'bold');
grid on;
legend('QPSK-OFDM','64QAM-OFDM', 'Location', 'best', 'FontSize', 10);
set(gca, 'FontSize', 10, 'YMinorGrid', 'on');
% 添加备注说明
hold off; % 释放图形
% -------------------------------------------------------------------------
% 7. 关闭模型(可选)
% -------------------------------------------------------------------------
for k = 1:2
close_system(model_names{k}, 0); % 不保存更改
end
disp('所有模型已关闭');
现在我需要你在上述代码的基础上修改代码,我现在使用的模块为Rician SISO信道,我需要改变的值不再是EB/No而是Maximun Doppler shift的值,请提供修改好的代码
最新发布