告别理论:用Python复现5G NR PRACH/PUSCH功率控制,验证你的协议理解
用Python实战5G NR功率控制从协议公式到可视化仿真在5G NR系统中功率控制算法直接影响着上行链路的覆盖范围和终端功耗。许多开发者虽然熟悉协议文档中的公式却难以将这些抽象描述转化为可验证的代码实现。本文将带您用Python构建一个完整的功率控制仿真器涵盖PRACH和PUSCH两大核心场景。1. 环境搭建与基础模型1.1 协议参数建模我们需要先构建一个参数容器来模拟SIB1的配置。以下代码定义了一个参数类包含所有必要的配置项class NRPowerControlParams: def __init__(self): # PRACH相关参数 self.preambleReceivedTargetPower -100 # dBm self.powerRampingStep 2 # dB self.msg1_SubcarrierSpacing 15 # kHz self.ss_PBCH_BlockPower -6 # dBm self.msg3_DeltaPreamble 4 # 配置值(实际值配置值*2) # PUSCH相关参数 self.p0_NominalWithGrant -76 # dBm self.p0_NominalWithoutGrant -90 # dBm self.msg3_Alpha 1.0 # 比例因子 self.deltaMCS enabled # Ks1.25 # 路损测量 self.higher_layer_filtered_RSRP -116 # dBm1.2 前导格式判定逻辑PRACH功率控制的第一步是确定前导格式及其对应的DELTA_PREAMBLE值。我们需要实现一个前导格式判定器def determine_preamble_format(config_index): # 简化的前导格式判断逻辑 if config_index 64: return Format 0, 0 elif 64 config_index 128: return Format 1, 0 elif 128 config_index 192: return Format 2, 0 elif 192 config_index 256: return Format 3, 3 * get_mu(config_index) else: return Format 4, 3 * get_mu(config_index) def get_mu(config_index): # 根据配置索引确定μ值 if config_index % 4 0: return 0 # 15kHz elif config_index % 4 1: return 1 # 30kHz elif config_index % 4 2: return 2 # 60kHz else: return 3 # 120kHz2. PRACH功率控制实现2.1 核心计算公式实现PRACH发射功率的计算公式如下PRACH_Power (preambleReceivedTargetPower DELTA_PREAMBLE (PREAMBLE_POWER_RAMPING_COUNTER - 1) * powerRampingStep) (ss_PBCH_BlockPower - higher_layer_filtered_RSRP)对应的Python实现def calculate_prach_power(params, config_index, ramp_counter): format_name, delta_preamble determine_preamble_format(config_index) # 计算目标接收功率部分 target_part (params.preambleReceivedTargetPower delta_preamble (ramp_counter - 1) * params.powerRampingStep) # 计算路损补偿部分 path_loss params.ss_PBCH_BlockPower - params.higher_layer_filtered_RSRP total_power target_part path_loss return total_power, format_name2.2 重传场景模拟PRACH功率会随着重传次数增加而逐步提升。我们可以模拟这一过程import matplotlib.pyplot as plt def simulate_prach_retransmission(params, config_index, max_retries): powers [] for counter in range(1, max_retries 1): power, _ calculate_prach_power(params, config_index, counter) powers.append(power) plt.figure(figsize(10, 6)) plt.plot(range(1, max_retries 1), powers, markero) plt.xlabel(Transmission Attempt) plt.ylabel(Transmit Power (dBm)) plt.title(PRACH Power Ramping Simulation) plt.grid(True) plt.show() return powers提示实际系统中PREAMBLE_POWER_RAMPING_COUNTER会在每次重传时递增直到达到最大重传次数或收到响应。3. PUSCH功率控制实现3.1 三种配置场景处理PUSCH功率控制根据j值分为三种情况场景触发条件P0来源α来源j0Msg3或未配置P0-PUSCH-AlphaSetpreambleReceivedTargetPowermsg3-Alpha或1.0j1半静态调度p0-NominalWithoutGrantConfiguredGrantConfigj2动态调度p0-NominalWithGrantp0-AlphaSetsdef get_pusch_parameters(params, j_value): if j_value 0: p0 params.preambleReceivedTargetPower params.msg3_DeltaPreamble * 2 alpha params.msg3_Alpha if hasattr(params, msg3_Alpha) else 1.0 elif j_value 1: p0 params.p0_NominalWithoutGrant alpha 0.8 # 假设值 else: # j2 p0 params.p0_NominalWithGrant alpha 0.8 # 假设值 return p0, alpha3.2 完整PUSCH功率计算PUSCH功率计算公式包含多个分量def calculate_pusch_power(params, j_value, rb_count, mcs_index, tpc_command): p0, alpha get_pusch_parameters(params, j_value) # 路损补偿 path_loss params.ss_PBCH_BlockPower - params.higher_layer_filtered_RSRP # MCS调整量 delta_tf calculate_delta_tf(params, mcs_index, rb_count) # 功率调整状态 delta_power tpc_command # 简化处理 # 最终功率计算 power (p0 10 * math.log10(rb_count) alpha * path_loss delta_tf delta_power) return power4. 可视化分析与验证4.1 功率随路损变化曲线def plot_power_vs_pathloss(params, rb_count10): path_losses range(80, 151, 5) # 80-150dB pusch_powers [] for pl in path_losses: params.higher_layer_filtered_RSRP params.ss_PBCH_BlockPower - pl power calculate_pusch_power(params, 2, rb_count, 10, 0) pusch_powers.append(power) plt.figure(figsize(10, 6)) plt.plot(path_losses, pusch_powers) plt.xlabel(Path Loss (dB)) plt.ylabel(PUSCH Transmit Power (dBm)) plt.title(PUSCH Power vs Path Loss) plt.grid(True) plt.show()4.2 协议一致性验证我们可以将仿真结果与协议示例进行对比验证def verify_prach_example(): params NRPowerControlParams() params.preambleReceivedTargetPower -100 params.powerRampingStep 2 params.ss_PBCH_BlockPower -6 params.higher_layer_filtered_RSRP -116 # 示例配置 config_index 202 ramp_counter 1 power, fmt calculate_prach_power(params, config_index, ramp_counter) print(fCalculated PRACH power: {power:.1f} dBm (Format: {fmt})) # 预期结果10dBm (Format B4) 或 15dBm (Format C2)通过这样的代码实现和可视化分析开发者可以直观地理解5G NR功率控制机制验证自己对协议的理解是否正确并为实际系统调试提供参考依据。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2523516.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!