Doppler Shift

当移动台以恒定的速率沿某一方向移动时,由于传播路程差的原因,会造成相位和频率的变化,通常将这种变化称为多普勒频移。
多普勒效应造成的发射和接收的频率之差称为多普勒频移。它揭示了波的属性在运动中发生变化的规律。
主要内容为:物体辐射的 波长 因为波源和观测者的相对运动而产生变化。在运动的波源前面,波被压缩,波长变得较短, 频率 变得较高 ( 蓝移  blue shift)。多普勒频移,当
% ------------------------------------------------------------------------- % 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的值,请提供修改好的代码
最新发布
08-26
你当前的代码是基于 `AWGN Channel` 模块设置 `Eb/No` 参数,现在你要改为使用 **Rician SISO 信道**,并控制其 **Maximum Doppler Shift** 参数。Simulink 中的 `Rician SISO Channel` 模块支持动态设置 `Maximum Doppler shift`。 --- ### ✅ 修改说明: 1. **模块名称和路径**: - 原来的 `AWGN Channel` 改为 `Rician SISO Channel`。 - 确保模块名称在模型中是准确的,例如:`Rician SISO Channel`。 2. **参数名称**: - `EbNo` 改为 `'Maximum Doppler shift'`。 - 设置值为 `Hz` 单位(如 0~200 Hz)。 3. **BER 数据提取方式保持不变**,前提是模型中 BER 数据仍输出到基础工作区。 --- ### ✅ 修改后的完整代码如下: ```matlab % ------------------------------------------------------------------------- % 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. 定义 Maximum Doppler Shift 遍历范围(单位:Hz) % ------------------------------------------------------------------------- doppler_start = 0; % 起始 Doppler 频移 doppler_end = 200; % 终止 Doppler 频移 doppler_step = 20; % 步长 doppler_values = doppler_start:doppler_step:doppler_end; num_runs = length(doppler_values); % ------------------------------------------------------------------------- % 4. 初始化结果数组(两个模型的结果) % ------------------------------------------------------------------------- ber_results1 = zeros(1, num_runs); % 模型1的结果 ber_results2 = zeros(1, num_runs); % 模型2的结果 % ------------------------------------------------------------------------- % 5. 循环遍历每个 Doppler Shift 值,运行两个仿真并提取 BER % ------------------------------------------------------------------------- disp('------------------- 开始遍历 Doppler Shift 值 -------------------'); for i = 1:num_runs current_doppler = doppler_values(i); % ========================= 运行第一个模型 ========================= % 设置模型1的 Rician SISO Channel rician_block_path1 = [model_names{1} '/Rician SISO Channel']; set_param(rician_block_path1, 'Maximum Doppler shift', num2str(current_doppler)); % 运行模型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] Max Doppler = %.1f Hz -> BER = %.6f\n', current_doppler, steady_ber1); % ========================= 运行第二个模型 ========================= % 设置模型2的 Rician SISO Channel rician_block_path2 = [model_names{2} '/Rician SISO Channel']; set_param(rician_block_path2, 'Maximum Doppler shift', num2str(current_doppler)); % 运行模型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] Max Doppler = %.1f Hz -> BER = %.6f\n\n', current_doppler, steady_ber2); end % ------------------------------------------------------------------------- % 6. 绘制两条BER曲线(同一张图) % ------------------------------------------------------------------------- disp('------------------- 绘制性能对比曲线 -------------------'); figure('Name', 'BER性能对比', 'Position', [100 100 900 600]); semilogy(doppler_values, ber_results1, 'bo-', 'LineWidth', 1.5, 'MarkerSize', 8, 'MarkerFaceColor', 'b'); hold on; % 保持图形 semilogy(doppler_values, ber_results2, 'rs--', 'LineWidth', 1.5, 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % 图形标注 xlabel('Maximum Doppler Shift (Hz)', 'FontSize', 12); ylabel('Bit Error Rate (BER)', 'FontSize', 12); title('QPSK-OFDM和64QAM-OFDM系统在Rician信道下的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 Channel` 的模块,路径拼接正确。 - 如果模块在子系统中,路径应写为 `'模型名/子系统名/Rician SISO Channel'`。 - 可以加入 `get_param(...)` 来验证是否设置成功,例如: ```matlab actual_doppler = get_param(rician_block_path1, 'Maximum Doppler shift'); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值