Моделирование передающего тракта PDSCH 5G NR
Моделирование передающего тракта PDSCH 5G NR
Physical Downlink Shared Channel (PDSCH) — основной канал передачи данных в нисходящей линии связи 5G NR. Его производительность критически важна для пропускной способности и задержки сети. Проектирование PDSCH сложно из-за необходимости согласованной работы процессов кодирования, модуляции, пространственной обработки (MIMO) и распределения ресурсов OFDM.
В статье представлена модель передатчика PDSCH, реализующая полный тракт обработки сигнала в соответствии с базовыми принципами 3GPP. Модель включает генерацию транспортных блоков, канальное кодирование (DL-SCH), модуляцию QPSK, пространственное прекодирование для конфигурации MIMO 8x5, формирование ресурсной сетки и OFDM-модуляцию. Конфигурация модели использует реалистичные параметры: 51 ресурсный блок и шаг поднесущей 30 кГц.
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
Описание модели и функциональных блоков
Модель представляет собой сквозную симуляционную цепочку передатчика PDSCH 5G NR, реализующую обработку сигнала от битов данных до многоканального OFDM-сигнала. Архитектура модульная, каждый блок соответствует этапу обработки по спецификациям 3GPP. Модель детально реализует стандарт 5G NR, служа инструментом для анализа, обучения и верификации алгоритмов физического уровня.
Генерация и обработка данных
- 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): Задают основные параметры: размер несущей, число символов, количество антенн.
Модель запускается и результаты извлекаются для последующего анализа.
-
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 Encode", "Precoding Matrix").
Краткое описание выполняемого анализа:
- Конфигурация системы: Вывод основных параметров модели.
- Размерности сигналов: Проверка корректности форматов выходных данных.
- Метрики производительности:
- Расчёт общего объёма переданных данных.
- Оценка эффективности использования ресурсной сетки (отношение занятых элементов к общему числу).
- Анализ прекодирования 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 слоев × $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
Анализ подтверждает корректную работу базовой модели передатчика PDSCH. Модель успешно обрабатывает два транспортных блока общим объёмом 7680 бит. Эффективность использования ресурсной сетки составила 12.32%, что соответствует специфике тестового сценария с частичным заполнением ресурсных блоков.
Матрица прекодирования демонстрирует равномерное распределение мощности по пяти пространственным слоям при умеренном отклонении от ортогональности (0.27), что является приемлемым для базовой схемы MIMO.
Характеристики OFDM-сигнала соответствуют ожиданиям: пик-фактор ~11.1 дБ типичен для систем OFDM, мощности сигнала распределены равномерно по антеннам. Текущая конфигурация модели формирует ресурсную сетку, содержащую только данные PDSCH.
Модель успешно реализует основной передающий тракт и служит основой для расширения функциональности, включая добавление служебных сигналов и анализ сложных сценариев.
Код представленный ниже создаёт график, показывающий, как меняется объем информации на различных этапах обработки в передатчике PDSCH. На логарифмической шкале отображается рост количества элементов от исходных битов (920) до итоговых отсчетов OFDM-сигнала (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)
Анализ фазовой картины показывает типичную структуру для базовой матрицы прекодирования в системе MIMO 5×8. Диапазон фаз охватывает почти полный круг от -177.8° до 180°, что является ожидаемым, поскольку элементы матрицы являются комплексными числами с произвольными фазами. Однако среднее значение фазы 13.6° указывает на некоторое смещение распределения. Критически важным наблюдением является то, что для каждого слоя первая антенна (столбец 1) имеет фиксированную фазу 0° (или 180° для слоя 4), что является стандартным приёмом нормировки — это служит фазовым ориентиром для всей системы.
Далее фазы по антеннам для каждого слоя изменяются в широком диапазоне, формируя уникальные паттерны: например, в слое 2 наблюдается резкий переход от отрицательных фаз к положительным (~100°), а в слое 3 присутствуют почти противоположные фазы (-177.8° и 176.8°).
Такое разнообразие фазовых профилей между слоями подтверждает, что матрица реализует пространственное мультиплексирование, направляя каждый поток данных (слой) с различным фазовым взвешиванием на антенную решётку. Отсутствие явной линейной прогрессии фаз по антеннам (что характерно для простого beamforming'а) согласуется с целью одновременной передачи нескольких независимых потоков. Таким образом, визуализация подтверждает, что матрица прекодирования корректно формирует пять пространственно разнесённых каналов.
Код ниже строит диаграмму распределения мощности сигнала по 8 передающим антеннам после операции прекодирования MIMO. Равномерная высота столбцов на графике подтверждает сбалансированное использование антенного массива, что является необходимым условием для эффективной работы пространственного мультиплексирования.
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-сигнала для первых двух антенн. Используя анализатор спектра, он строит графики зависимости мощности (в дБм) от частоты в полосе. Спектры показывают форму и ширину полосы сгенерированного сигнала.
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-модуляции. Все метрики сигнала (пик-фактор, распределение мощности и фазы, эффективность использования ресурсов) находятся в ожидаемых пределах и соответствуют принципам работы физического уровня.