Сообщество Engee

Моделирование передающего тракта PDSCH 5G NR

作者
avatar-yurevyurev
Notebook

Моделирование передающего тракта PDSCH 5G NR

Physical Downlink Shared Channel (PDSCH) — основной канал передачи данных в нисходящей линии связи 5G NR. Его производительность критически важна для пропускной способности и задержки сети. Проектирование PDSCH сложно из-за необходимости согласованной работы процессов кодирования, модуляции, пространственной обработки (MIMO) и распределения ресурсов OFDM.

В статье представлена модель передатчика PDSCH, реализующая полный тракт обработки сигнала в соответствии с базовыми принципами 3GPP. Модель включает генерацию транспортных блоков, канальное кодирование (DL-SCH), модуляцию QPSK, пространственное прекодирование для конфигурации MIMO 8x5, формирование ресурсной сетки и OFDM-модуляцию. Конфигурация модели использует реалистичные параметры: 51 ресурсный блок и шаг поднесущей 30 кГц.

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)

Описание модели и функциональных блоков

Модель представляет собой сквозную симуляционную цепочку передатчика PDSCH 5G NR, реализующую обработку сигнала от битов данных до многоканального OFDM-сигнала. Архитектура модульная, каждый блок соответствует этапу обработки по спецификациям 3GPP. Модель детально реализует стандарт 5G NR, служа инструментом для анализа, обучения и верификации алгоритмов физического уровня.

image.png

Генерация и обработка данных

  • TrBlocks, TrBlocks-1: Генерируют тестовые транспортные блоки (368 и 552 бита).
  • DL-SCH Encode: Выполняет канальное кодирование: добавление CRC, LDPC-кодирование, скремблирование.

Формирование и пространственная обработка сигнала

  • PDSCH Modulation: Осуществляет модуляцию QPSK, преобразуя биты в комплексные символы.
  • Precoding Matrix: Вычисляет матрицу прекодирования для конфигурации MIMO 5x8, обеспечивая пространственное мультиплексирование.

Работа с ресурсной сеткой

  • Create resource grid: Создаёт пустую трёхмерную ресурсную сетку (612×14×8) для одного слота.
  • PDSCH mapping in grid: Размещает модулированные символы PDSCH в назначенные ячейки сетки.

Формирование опорных сигналов

  • PDSCH DM-RS Configuration: Генерирует и размещает демодуляционные опорные сигналы (DM-RS) с учётом прекодирования.
  • PDSCH PT-RS-1: Блок для опорных сигналов компенсации фазового шума (в модели отключён).

Финальное формирование сигнала

  • OFDM Modulation: Выполняет IFFT и добавляет циклический префикс, формируя многоканальный временной сигнал для передачи.
  • Конфигурационные блоки (Constant): Задают основные параметры: размер несущей, число символов, количество антенн.

Модель запускается и результаты извлекаются для последующего анализа.

  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 Encode", "Precoding Matrix").

Краткое описание выполняемого анализа:

  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 слоев × $num_antennas антенн")
println("   • Несущая: $n_size_grid RB, шаг поднесущей $scs кГц")
println("   • Модуляция: QPSK")
println("   • Транспортные блоки: $(length(encoded_tr1)) и $(length(encoded_tr2)) бит")

println("\n2. РАЗМЕРНОСТИ СИГНАЛОВ:")
println("   • Матрица прекодирования: $(size(precoding_matrix)) (слои×антенны×поднесущие)")
println("   • OFDM сигнал: $(size(ofdm_waveform)) (отсчеты×антенны)")
println("   • Ресурсная сетка PDSCH: $(size(pdsch_grid)) (поднесущие×OFDM-символы×антенны)")
println("   • Финальная ресурсная сетка: $(size(final_grid)) (поднесущие×OFDM-символы×антенны)")

println("\n3. МЕТРИКИ ПРОИЗВОДИТЕЛЬНОСТИ:")
println("   " * "-"^45)

total_bits = length(encoded_tr1) + length(encoded_tr2)
println("   • Общий объем данных: $total_bits бит ($(round(total_bits/8, digits=2)) байт)")

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("   • Всего ресурсных элементов: $total_resource_elements")
println("   • Занято ресурсных элементов: $occupied_elements")
println("   • Эффективность использования ресурсов: $(round(resource_utilization, digits=2))%")

println("\n4. АНАЛИЗ ПРЕКОДИРОВАНИЯ 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(deviation, digits=6))")
    else
        deviation = norm(W' * W - I)
        println("   • Отклонение от унитарности: $(round(deviation, digits=6))")
    end
end

println("\n5. ХАРАКТЕРИСТИКИ 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("\n6. СРАВНЕНИЕ РЕСУРСНЫХ СЕТОК:")
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("   • Всего элементов в финальной сетке: $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.1 дБ типичен для систем OFDM, мощности сигнала распределены равномерно по антеннам. Текущая конфигурация модели формирует ресурсную сетку, содержащую только данные PDSCH.

Модель успешно реализует основной передающий тракт и служит основой для расширения функциональности, включая добавление служебных сигналов и анализ сложных сценариев.

Код представленный ниже создаёт график, показывающий, как меняется объем информации на различных этапах обработки в передатчике PDSCH. На логарифмической шкале отображается рост количества элементов от исходных битов (920) до итоговых отсчетов OFDM-сигнала (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)

Анализ фазовой картины показывает типичную структуру для базовой матрицы прекодирования в системе MIMO 5×8. Диапазон фаз охватывает почти полный круг от -177.8° до 180°, что является ожидаемым, поскольку элементы матрицы являются комплексными числами с произвольными фазами. Однако среднее значение фазы 13.6° указывает на некоторое смещение распределения. Критически важным наблюдением является то, что для каждого слоя первая антенна (столбец 1) имеет фиксированную фазу 0° (или 180° для слоя 4), что является стандартным приёмом нормировки — это служит фазовым ориентиром для всей системы.

Далее фазы по антеннам для каждого слоя изменяются в широком диапазоне, формируя уникальные паттерны: например, в слое 2 наблюдается резкий переход от отрицательных фаз к положительным (~100°), а в слое 3 присутствуют почти противоположные фазы (-177.8° и 176.8°).

Такое разнообразие фазовых профилей между слоями подтверждает, что матрица реализует пространственное мультиплексирование, направляя каждый поток данных (слой) с различным фазовым взвешиванием на антенную решётку. Отсутствие явной линейной прогрессии фаз по антеннам (что характерно для простого beamforming'а) согласуется с целью одновременной передачи нескольких независимых потоков. Таким образом, визуализация подтверждает, что матрица прекодирования корректно формирует пять пространственно разнесённых каналов.

Код ниже строит диаграмму распределения мощности сигнала по 8 передающим антеннам после операции прекодирования MIMO. Равномерная высота столбцов на графике подтверждает сбалансированное использование антенного массива, что является необходимым условием для эффективной работы пространственного мультиплексирования.

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-сигнала для первых двух антенн. Используя анализатор спектра, он строит графики зависимости мощности (в дБм) от частоты в полосе. Спектры показывают форму и ширину полосы сгенерированного сигнала.

In [ ]:
fs_hz = 30.72e6
n_antennas = size(ofdm_waveform, 2)
antennas_to_plot = 2

plot4 = plot(title="Спектр OFDM сигнала", 
             xlabel="Частота (МГц)", 
             ylabel="Мощность (дБм)", 
             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="Антенна $ant", color=colors[mod1(ant, length(colors))])
end

display(plot4)

Вывод

В работе разработана, реализована и проанализирована модель передающего тракта канала PDSCH стандарта 5G NR. Модель корректно воспроизводит полный цикл обработки сигнала в соответствии со спецификациями 3GPP для реалистичной конфигурации MIMO 8x5, несущей 51 RB и шага поднесущей 30 кГц.

Результаты симуляции подтверждают работоспособность всех ключевых этапов: от канального кодирования LDPC и модуляции QPSK до пространственного прекодирования и OFDM-модуляции. Все метрики сигнала (пик-фактор, распределение мощности и фазы, эффективность использования ресурсов) находятся в ожидаемых пределах и соответствуют принципам работы физического уровня.