Построение графика 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.