Построение графика PSD нескольких форм волны с несколькими несущими
Цель заключается в расчете спектральной плотности мощности нескольких форм волны с несколькими несущими. Можно использовать следующие модули:
module example_PSD_waveform
# ----------------------------------------------------
# --- Модули
# ----------------------------------------------------
using DigitalComm
# --- Внешние модули
using Plots
gr();
using Printf
using FFTW
# ----------------------------------------------------
# --- Основные функции
# ----------------------------------------------------
""" psdWaveform.m
---
Compute the power spectral density (i.e the spectrum here) of the signal parametrized by the waveform structure waveform, for a number of symbol nbSymb.
The frequency allocation is the one inherited from the waveform structure (i.e waveform.allocatedSubcarriers).
# --- Синтаксис
( freq,psd ) = psdWaveform(waveform,nbSymb,allocatedSubcarriers);
# --- Входные параметры
- waveform : Structure associated to transmitted waveform
- nbSymb : Number of symbol to be transmitted [Int]
- nbIt : Monte carlo parameter for PSD evaluation (should be > 1)
# --- Выходные параметры
- freq : Vector of frequency evaluation (between -0.5 and 0.5). [Array{Float64,L}]
- psd : Spectrum evaluated on freq [Array{Complex{Float64}},L]
# --- Входные параметры
-
# --- Выходные параметры
-
# ---
# v 1.0 — Робин Герзаге (Robin Gerzaguet).
"""
function psdWaveform(waveform,nbSymb,nbIt)
# ----------------------------------------------------
# --- Расчет PSD
# ----------------------------------------------------
# --- Получение распределения частот
allocatedSubcarriers = waveform.allocatedSubcarriers;
# --- Получение количества битов
# Во-первых, размер частоты
nbSubcarriers = length(allocatedSubcarriers);
# Принудительный запуск fiven mcs
mcs = 4; # QPSK.
# Определение количества необходимых битов
nbBits = nbSymb * nbSubcarriers * Int(log2(mcs));
# --- Инициация средства оценки PSD
psd = 0;
# --- Итеративный расчет PSD
for iN = 1 : 1 : nbIt
# --- Двоичная последовательность
bitSeq = genBitSequence(nbBits);
# Сопоставление
qamSeq = bitMappingQAM(mcs,bitSeq);
# --- Частотно-временная матрица
qamMat = reshape(qamSeq,nbSubcarriers,nbSymb);
# --- Сигнал
sigPSD = genSig(qamMat,waveform);
# --- Средняя величина PSD:
psd = psd .+ 1/nbIt*1/length(sigPSD)*abs.(fftshift(fft(sigPSD))).^2;
end
# --- Вычисление частоты дискретизации
# Возвращает частоту Найквиста
fe = 1;
Basefe = (0:(length(psd) .-1))./length(psd)*fe .-fe/2;
return (Basefe,psd);
end
# ----------------------------------------------------
# --- Основная процедура
# ----------------------------------------------------
function main()
# ----------------------------------------------------
# --- Общие параметры
# ----------------------------------------------------
# --- Общие параметры PHY
nbIt = 50; # --- Количество итераций
nbSymb = 14; # --- Количество символов (один фрейм)
nFFT = 1024; # --- Базовый размер FFT
samplingFreq = 15.36; # --- Значение частоты (МГц)
# --- Распределение частот
#allocatedSubcarriers= getLTEAlloc(nFFT);
#allocatedSubcarriers = (1:12*4);
# 4 RB выделено 1 пространство RB 4 RB выделено
allocatedSubcarriers = [1:12*4; 12*5 .+ (1:12*4)];
# ----------------------------------------------------
# --- Претендент на форму волны
# ----------------------------------------------------
# --- Инициация структуры OFDM
ofdm = initOFDM(
nFFT, # --- nFFT : размер FFT
72, # --- nCP : размер CP
allocatedSubcarriers # --- allocatedSubcarriers : распределение поднесущих
);
# --- Инициация структуры SCFDMA
scfdma = initSCFDMA(
nFFT, # --- nFFT : размер FFT
72, # --- nCP : размер CP
allocatedSubcarriers, # --- allocatedSubcarriers : распределение поднесущих
12; # --- sizeDFT : размер предварительной обработки DFT
);
# --- Инициация структуры UF-OFDM
ufofdm = initUFOFDM(
nFFT, # --- nFFT : размер FFT
73, # --- L : Длина фильтра (тот же размер +1 за счет свертки)
allocatedSubcarriers, # --- allocatedSubcarriers : распределение поднесущих
applyPD=1, # --- applyPD : выполнение коррекции предыскажений на этапе Tx
attenuation=40, # --- attenuation : Затухание фильтра в дБ
);
# --- Инициация структуры BF-OFDM
bfofdm = initBFOFDM(
32, # --- nFBMC : размер PPN (максимальное количество несущих)
64, # --- nOFDM : размер прекодера (OFDM-селектор)
3, # --- K : коэффициент перекрытия
9, # --- GI : размер CP прекодера
0.5, # --- δ : коэффициент сжатия
allocatedSubcarriers, # --- allocatedSubcarriers : распределение поднесущих
"gaussian", # --- filterName : название формы импульса
BT=0.36, # --- BT : возможное значение BT для гессиана
filterStopBand = 110, # --- filterStopBand : значение полосы задержки DC
fS=[], # --- fS : возможный коэффициент частоты для фильтра FS
nFFT= 1024, # --- nFFT : связанное значение FFT в Rx
nCP= 72, # --- nCP : расширенный размер CP
);
# --- Инициация структуры WOLA-OFDM
wola = initWOLA(
nFFT, # --- nFFT : размер FFT
72, # --- nCP : размер CP
allocatedSubcarriers, # --- allocatedSubcarriers : распределение поднесущих
"triangle", # --- Тип окна на стороне Tx
20, # --- Размер окна на стороне Tx
"triangle", # --- Тип окна на стороне Rx
20, # --- Размер окна на стороне Rx
);
fbmc = initFBMC(
nFFT, # --- nFFT : размер FFT
4, # --- K : коэффициент перекрытия
allocatedSubcarriers # --- allocatedSubcarriers : распределение поднесущих
);
# ----------------------------------------------------
# --- Объединение структур
# ----------------------------------------------------
# Создание словаря для общего управления
waveforms = initWaveforms(ofdm,
scfdma,
ufofdm,
bfofdm,
wola,
fbmc,
);
# ----------------------------------------------------
# --- Основной расчет PSD
# ----------------------------------------------------
# --- Инициация контейнера графика
plt = plot(reuse=false);
decim = 1; # прореживание для световых графиков
# --- Итеративное создание PSD
for (name,struc) in waveforms
# --- Расчет PSD для конфигурации
(fe,psd) = psdWaveform(struc,nbSymb,nbIt);
# Построение графика результатов
plot!(plt,fe[1:decim:end].*samplingFreq,10 .* log10.(psd[1:decim:end]/maximum(psd)),label=name,legend=:topleft);
end
# --- Обновление графика и добавление меток
# Цель — увеличить масштаб выделенной области.
scsN = (1/1024)*samplingFreq; # Дистанцирование поднесущих (нормализованное)
rbV = (12*12); # См. несколько RB для снижения psd
ylims!(-120,5);
xlims!(-rbV*scsN,maximum(allocatedSubcarriers)*scsN+2*12*scsN);
xlabel!("Frequency [MHz]");
ylabel!("Spectrum");
display(plt)
end
end
Выполнив example_PSD_waveform.main();, можно получить сравнительный график между различными PSD.