Документация Engee

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

PSD