PDSCH5g NR传输路径的仿真
物理下行共享信道(pdsch)是5G下行链路NR中的主要数据传输信道,其性能对网络带宽和延迟至关重要。 由于需要OFDM的编码、调制、空间处理(MIMO)和资源分配过程的协调工作,PDSCH的设计是困难的。
本文提出了一个PDSCH发射机模型,该模型根据****3gpp**的基本原理实现了完整的信号处理路径。 该模型包括传输块生成、信道编码(DL-SCH)、QPSK调制、用于MIMO8x5配置的空间预编码、资源网格生成和OFDM调制。 模型配置使用实际参数:51个资源块和30kHz的子载波间距。
using LinearAlgebra, Statistics, Dates, EngeeDSP
# 启用辅助模型启动功能。
function run_model( name_model)
Path = (@__DIR__) * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # 检查将模型加载到内核的条件
model = engee.open( name_model ) # 打开模型
model_output = engee.run( model, verbose=true ); # 启动模型
else
model = engee.load( Path, force=true ) # 上传模型
model_output = engee.run( model, verbose=true ); # 启动模型
engee.close( name_model, force=true ); # 关闭模型
end
sleep(0.1)
return model_output
end
模型和功能块的描述
该模型是PDSCH5G NR发射机的端到端仿真链,实现了从数据比特到多信道OFDM信号的信号处理。 该架构是模块化的,每个块根据3GPP规范对应一个处理级。 该模型详细实现了5G NR标准,作为分析、训练和验证物理层算法的工具。
数据生成和处理
*TrBlocks,TrBlocks-1:生成测试传输块(368和552位)。
*DL-SCH编码:执行信道编码:CRC加法,LDPC编码,加扰。
信号生成和空间处理
*PDSCH调制:通过将比特转换为复数符号来执行QPSK调制。
*预编码矩阵:为MIMO5x8配置计算预编码矩阵,提供空间复用。
使用资源网格
*创建资源网格:为一个插槽创建一个空的三维资源网格(612×14×8)。
*网格中的PDSCH映射:将调制的PDSCH符号放置在指定的网格单元中。
参考信号的形成
*PDSCH DM-RS配置:根据预编码生成和放置解调参考信号(DM-RS)。
*PDSCH PT-RS-1:相位噪声补偿参考信号块(在模型中禁用)。
最终信号生成
*OFDM调制:执行IFFT并添加循环前缀,形成多信道时间信号进行传输。
*配置块(常数):主要参数设置:载波大小,字符数,天线数。
运行模型并提取结果以供进一步分析。
-
simout = run_model("NR_PDSCH_Throughput")-开始模拟。 -
关键输出信号的提取:
-
precoding_matrix-MIMO预编码矩阵。 -
encoded_tr1,encoded_tr2-编码的传输块。 -
ofdm_waveform-多信道OFDM信号。 -
pdsch_grid,dmrs_grid,final_grid-不同阶段的资源网格。
-
simout = run_model("NR_PDSCH_Throughput")
precoding_matrix = collect(simout["Precoding Matrix.WTX"]).value[end]
encoded_tr1 = collect(simout["DL-SCH Encode.EncoderTR1"]).value[end]
encoded_tr2 = collect(simout["DL-SCH Encode.EncoderTR2"]).value[end]
ofdm_waveform = collect(simout["OFDM Modulation.txWaveform"]).value[end]
pdsch_grid = collect(simout["PDSCH mapping in grid associated with PDSCH transmission period.1"]).value[end]
dmrs_grid = collect(simout["PDSCH DM-RS Configuration.PRGGrid"]).value[end]
final_grid = collect(simout["PDSCH PT-RS-1.1"]).value[end];
所呈现的代码对模型的输出数据进行全面分析。 配置参数的来源 num_layers=5, num_antennas=8, n_size_grid=51, scs=30 直接取自模型块的设置(例如,"DL-Sch编码","预编码矩阵")。
正在进行的分析的简要说明:
- **系统配置:**输出模型的主要参数。
- **信号尺寸:**检查输出数据格式的正确性。
- 性能指标:
*计算传输的数据总量。
*评估资源网格的使用效率(占用元素与总数的比率)。 - MIMO预编码分析:
*计算每层的预编码矩阵规范。
*估计矩阵与正交性/单位性的偏差。 - OFDM信号的特性:
*计算每个天线的峰值因数系数(PAPR)和平均功率。 - **资源网格的比较:**确定服务信号(DM-RS)在最终网格中的份额。
num_layers = 5 # 空间MIMO层数
num_antennas = 8 # 发射天线数目
n_size_grid = 51 # 以资源块为单位的载波大小(RB)
scs = 30 # 副载波间距(kHz)
println("\n1. 系统配置:")
println(" *MIMO:$num_layers of layers×$num_antennas of antennas")
println(" *载波:$n_size_grid RB,子载波间距$scs kHz")
println(" *调制:QPSK")
println(" *传输块:$(length(encoded_tr1))和$(length(encoded_tr2))位")
println("2. 信号尺寸:")
println(" *预编码矩阵:ψ(size(precoding_matrix))(层×天线×子载波)")
println(" *OFDM信号:△(size(ofdm_waveform))(计数×天线)")
println(" *PDSCH资源网格:$(size(pdsch_grid))(子载波×OFDM符号×天线)")
println(" *最终资源网格:$(size(final_grid))(子载波×OFDM符号×天线)")
println("3. 性能指标:")
println(" " * "-"^45)
total_bits = length(encoded_tr1) + length(encoded_tr2)
println(" *数据总量:$total_bits bits($(round(total_bits/8,digits=2))bytes)")
K, L, P = size(final_grid)
total_resource_elements = K * L * P
occupied_elements = count(!iszero, final_grid)
resource_utilization = occupied_elements / total_resource_elements * 100
println(" *总资源元素:tot total_resource_elements")
println(" *资源元素被占用:$occupied_elements")
println(" *资源效率:$(round(resource_utilization,digits=2))%")
println("4. MIMO预编码分析:")
precoding_norms = [norm(precoding_matrix[layer, :, :]) for layer in 1:num_layers]
println(" *按层预编码标准:")
for (i, norm_val) in enumerate(precoding_norms)
println(" 层$i:$(round(norm_val,digits=4))")
end
if size(precoding_matrix, 1) <= size(precoding_matrix, 2)
W = precoding_matrix[:, :, 1]
if size(W, 1) < size(W, 2)
deviation = norm(W' * W - Diagonal(diag(W' * W)))
println(" *与列正交性的偏差:$(round(偏差,数字=6))")
else
deviation = norm(W' * W - I)
println(" *与单位性的偏差:$(圆(偏差,数字=6))")
end
end
println("5. OFDM信号的特性:")
peak_to_average_ratios = Float64[]
average_powers = Float64[]
for ant in 1:num_antennas
signal = ofdm_waveform[:, ant]
papr = 10 * log10(maximum(abs2.(signal)) / mean(abs2.(signal)))
avg_power = 10 * log10(mean(abs2.(signal)))
push!(peak_to_average_ratios, papr)
push!(average_powers, avg_power)
end
println(" *天线的平均PAPR:$(round(mean(peak_to_average_ratios),digits=2))dB")
println(" •平均天线功率:∞(round(mean(average_powers),digits=2))dB")
println(" *功率范围:$(round(minimum(average_powers),digits=2))-$(round(maximum(average_powers),digits=2))dB")
println("6. 资源网格的比较:")
if size(pdsch_grid) == size(final_grid)
data_only_elements = count(!iszero, pdsch_grid)
final_elements = count(!iszero, final_grid)
added_elements = final_elements - data_only_elements
println(" •仅包含PDSCH数据的项目:$data_only_elements")
println(" *最终网格中的总项目:fin final_elements")
end
该分析证实了PDSCH发射机的基本模型的正确操作。 该模型成功地处理了两个总体积为7680位的传输块。 资源网格的使用效率为12.32%,与部分填充资源块的测试场景的具体情况相对应。
预编码矩阵在五个空间层上显示了功率的均匀分布,具有与正交性的适度偏差(0.27),这对于基本MIMO方案是可接受的。
OFDM信号的特性对应于预期:~11.1dB的峰值因子对于OFDM系统是典型的,信号功率均匀地分布在天线上。 当前模型配置形成仅包含PDSCH数据的资源网格。
该模型成功地实现了主传输路径,并作为扩展功能的基础,包括添加开销信号和分析复杂场景。
下面的代码创建了一个图表,显示信息量在PDSCH发射机的不同处理阶段是如何变化的。 对数标度示出了从OFDM信号的初始比特(920)到最终采样(122,880)的元素数量的增加。 该图表清楚地表明了在编码和调制阶段的数据增加,以及离散字符转换为模拟时间信号。
stages = ["输入TBs", "编码TBs", "调制符号", "资源网格", "OFDM信号"]
tb1_bits = 368
tb2_bits = 552
total_input_bits = tb1_bits + tb2_bits
encoded_bits = length(encoded_tr1) + length(encoded_tr2)
modulated_symbols = encoded_bits ÷ 2
grid_symbols = occupied_elements
ofdm_samples = size(ofdm_waveform, 1) * size(ofdm_waveform, 2)
sizes = [total_input_bits, encoded_bits, modulated_symbols, grid_symbols, ofdm_samples]
plot1 = plot(stages, sizes, seriestype=:scatter, markersize=8, linewidth=2, marker=:circle,
title="数据量的演变", xlabel="处理阶段", ylabel="元素数量",
legend=false, yscale=:log10, grid=true)
plot!(stages, sizes, linewidth=1.5, color=:blue, alpha=0.5)
for i in 1:length(stages)
annotate!(plot1, i, sizes[i]*1.1, text("$sizes[i]", 8, :bottom))
end
display(plot1)
下面的代码创建了一个热图,用于可视化预编码矩阵的相位角,其中Y轴对应于MIMO层(1-5),X轴对应于发射天线(1-8)。
W = precoding_matrix[:, :, 1]
plot2 = heatmap(angle.(W),
title="预编码矩阵的相位",
xlabel="天线", ylabel="层数",
color=:hsv, clim=(-π, π),
size=(600, 400),
aspect_ratio=:auto)
display(plot2)
相位图案的分析显示了用于MIMO5x8系统中的基本预编码矩阵的典型结构。 相位范围几乎涵盖了从-177.8°到180°的整圈,这是预期的,因为矩阵的元素是具有任意相位的复数。 然而,13.6°的平均相位值表示分布中的轻微偏移。 一个关键的观察结果是,对于每个层,第一天线(第1列)具有0°的固定相位(对于第4层为180°),这是一种标准的归一化技术,可用作整个系统的相位参考。
此外,每层的天线相位在很宽的范围内变化,形成独特的图案:例如,在第2层中有从负相位到正相位的急剧转变(~100°),而在第3层中有几乎相反的相位(-177.8°和
层之间的这样的多种相位轮廓证实矩阵实现了空间复用,将具有不同相位加权的每个数据流(层)引导到天线阵列。 在天线上没有明显的线性相位进展(这对于简单波束成形来说是典型的)与同时传输几个独立流的目标是一致的。 因此,可视化确认预编码矩阵正确地形成五个空间间隔的信道。
下面的代码绘制了MIMO预编码操作后8个发射天线的信号功率分布。 图上列的均匀高度证实了天线阵列的均衡使用,这是高效空间复用的先决条件。
antenna_power = [norm(W[:,j]) for j in 1:size(W,2)]
plot3 = bar(antenna_power,
title="天线功率",
xlabel="天线", ylabel="权力",
color=:red, alpha=0.7,
legend=false,
size=(600, 400))
display(plot3)
下面的代码对前两个天线的OFDM信号进行频谱分析。 使用频谱分析仪,他绘制了功率(以dBm为单位)对频段频率的依赖性。 光谱显示生成信号的形状和带宽。
fs_hz = 30.72e6
n_antennas = size(ofdm_waveform, 2)
antennas_to_plot = 2
plot4 = plot(title="OFDM信号频谱",
xlabel="频率(兆赫)",
ylabel="功率(dBm)",
grid=true,
legend=true,
size=(800, 500))
colors = [:blue, :red, :green, :orange, :purple, :brown, :pink, :gray]
for ant in 1:min(antennas_to_plot, n_antennas)
iq_data = ofdm_waveform[:, ant]
RBW = fs_hz / 4096
scope = EngeeDSP.spectrumAnalyzer()
scope.SampleRate = fs_hz
scope.Method = "filter-bank"
scope.FrequencySpan = "full"
scope.RBWSource = "property"
scope.RBW = RBW
scope.SpectrumType = "power"
scope.SpectrumUnits = "dBm"
scope.Window = "Kaiser"
scope(iq_data)
spectrumdata = EngeeDSP.getSpectrumData(scope)
frequencies_mhz = spectrumdata["frequencies"] / 1e6
plot!(plot4, frequencies_mhz, spectrumdata["spectrum"],
linewidth=1.5, label="天线/蚂蚁", color=colors[mod1(ant, length(colors))])
end
display(plot4)
结论
本文开发、实现和分析了5G NR标准PDSCH信道传输路径的模型。 该模型根据3gpp规范正确再现了完整的信号处理周期,以实现具有51RB载波和30kHz子载波间距的逼真MIMO8X5配置。
仿真结果证实了所有关键阶段的可操作性:从LDPC信道编码和QPSK调制到空间预编码和OFDM调制。 所有信号度量(峰值因子、功率和相位分布、资源效率)都在预期的限度内并且符合物理层的操作原则。