AnyMath 文档
Notebook

PDSCH5g NR传输路径的仿真

物理下行共享信道(pdsch)是5G下行链路NR中的主要数据传输信道,其性能对网络带宽和延迟至关重要。 由于需要OFDM的编码、调制、空间处理(MIMO)和资源分配过程的协调工作,PDSCH的设计是困难的。

本文提出了一个PDSCH发射机模型,该模型根据****3gpp**的基本原理实现了完整的信号处理路径。 该模型包括传输块生成、信道编码(DL-SCH)、QPSK调制、用于MIMO8x5配置的空间预编码、资源网格生成和OFDM调制。 模型配置使用实际参数:51个资源块和30kHz的子载波间距。

In [ ]:
using LinearAlgebra, Statistics, Dates, EngeeDSP
In [ ]:
# 启用辅助模型启动功能。
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
Out[0]:
run_model (generic function with 1 method)

模型和功能块的描述

该模型是PDSCH5G NR发射机的端到端仿真链,实现了从数据比特到多信道OFDM信号的信号处理。 该架构是模块化的,每个块根据3GPP规范对应一个处理级。 该模型详细实现了5G NR标准,作为分析、训练和验证物理层算法的工具。

image.png

数据生成和处理

*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并添加循环前缀,形成多信道时间信号进行传输。
*配置块(常数):主要参数设置:载波大小,字符数,天线数。

运行模型并提取结果以供进一步分析。

  1. simout = run_model("NR_PDSCH_Throughput") -开始模拟。

  2. 关键输出信号的提取:

    • precoding_matrix -MIMO预编码矩阵。

    • encoded_tr1, encoded_tr2 -编码的传输块。

    • ofdm_waveform -多信道OFDM信号。

    • pdsch_grid, dmrs_grid, final_grid -不同阶段的资源网格。

In [ ]:
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];
Building...
Progress 0%
Progress 100%

所呈现的代码对模型的输出数据进行全面分析。 配置参数的来源 num_layers=5, num_antennas=8, n_size_grid=51, scs=30 直接取自模型块的设置(例如,"DL-Sch编码","预编码矩阵")。

正在进行的分析的简要说明:

  1. **系统配置:**输出模型的主要参数。
  2. **信号尺寸:**检查输出数据格式的正确性。
  3. 性能指标:
    *计算传输的数据总量。
    *评估资源网格的使用效率(占用元素与总数的比率)。
  4. MIMO预编码分析:
    *计算每层的预编码矩阵规范。
    *估计矩阵与正交性/单位性的偏差。
  5. OFDM信号的特性:
    *计算每个天线的峰值因数系数(PAPR)和平均功率。
  6. **资源网格的比较:**确定服务信号(DM-RS)在最终网格中的份额。
In [ ]:
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
1. КОНФИГУРАЦИЯ СИСТЕМЫ:
   • MIMO: 5 слоев × 8 антенн
   • Несущая: 51 RB, шаг поднесущей 30 кГц
   • Модуляция: QPSK
   • Транспортные блоки: 3072 и 4608 бит

2. РАЗМЕРНОСТИ СИГНАЛОВ:
   • Матрица прекодирования: (5, 8, 1) (слои×антенны×поднесущие)
   • OFDM сигнал: (15360, 8) (отсчеты×антенны)
   • Ресурсная сетка PDSCH: (612, 14, 8) (поднесущие×OFDM-символы×антенны)
   • Финальная ресурсная сетка: (612, 14, 8) (поднесущие×OFDM-символы×антенны)

3. МЕТРИКИ ПРОИЗВОДИТЕЛЬНОСТИ:
   ---------------------------------------------
   • Общий объем данных: 7680 бит (960.0 байт)
   • Всего ресурсных элементов: 68544
   • Занято ресурсных элементов: 8448
   • Эффективность использования ресурсов: 12.32%

4. АНАЛИЗ ПРЕКОДИРОВАНИЯ MIMO:
   • Нормы прекодирования по слоям:
     Слой 1: 0.4472
     Слой 2: 0.4472
     Слой 3: 0.4472
     Слой 4: 0.4472
     Слой 5: 0.4472
   • Отклонение от ортогональности столбцов: 0.269838

5. ХАРАКТЕРИСТИКИ OFDM СИГНАЛА:
   • Средний PAPR по антеннам: 10.96 dB
   • Средняя мощность по антеннам: -51.19 dB
   • Диапазон мощностей: -52.05 - -50.51 dB

6. СРАВНЕНИЕ РЕСУРСНЫХ СЕТОК:
   • Элементы только с данными PDSCH: 8448
   • Всего элементов в финальной сетке: 8448

该分析证实了PDSCH发射机的基本模型的正确操作。 该模型成功地处理了两个总体积为7680位的传输块。 资源网格的使用效率为12.32%,与部分填充资源块的测试场景的具体情况相对应。

预编码矩阵在五个空间层上显示了功率的均匀分布,具有与正交性的适度偏差(0.27),这对于基本MIMO方案是可接受的。

OFDM信号的特性对应于预期:~11.1dB的峰值因子对于OFDM系统是典型的,信号功率均匀地分布在天线上。 当前模型配置形成仅包含PDSCH数据的资源网格。

该模型成功地实现了主传输路径,并作为扩展功能的基础,包括添加开销信号和分析复杂场景。

下面的代码创建了一个图表,显示信息量在PDSCH发射机的不同处理阶段是如何变化的。 对数标度示出了从OFDM信号的初始比特(920)到最终采样(122,880)的元素数量的增加。 该图表清楚地表明了在编码和调制阶段的数据增加,以及离散字符转换为模拟时间信号。

In [ ]:
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)。

In [ ]:
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个发射天线的信号功率分布。 图上列的均匀高度证实了天线阵列的均衡使用,这是高效空间复用的先决条件。

In [ ]:
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为单位)对频段频率的依赖性。 光谱显示生成信号的形状和带宽。

In [ ]:
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调制。 所有信号度量(峰值因子、功率和相位分布、资源效率)都在预期的限度内并且符合物理层的操作原则。