Plotting PSD of several multicarrier waveforms

The purpose is to compre the Power spectral density of several multicarrier waveform. The following module can be used:

module example_PSD_waveform 
# ---------------------------------------------------- 
# --- Modules  
# ---------------------------------------------------- 
using DigitalComm 
# --- External Modules
using Plots 
gr();
using Printf
using FFTW
# ---------------------------------------------------- 
# --- Core functions  
# ---------------------------------------------------- 
""" 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).
# --- Syntax 
( freq,psd )	= psdWaveform(waveform,nbSymb,allocatedSubcarriers);
# ---  Input parameters 
- waveform  : Structure associated to transmitted waveform 
- nbSymb	  : Number of symbol to be transmitted [Int]
- nbIt	  : Monte carlo parameter for PSD evaluation (should be > 1)
# --- Output parameters 
- freq	  : Vector of frequency evaluation (between -0.5 and 0.5). [Array{Float64,L}]
- psd		  : Spectrum evaluated on freq [Array{Complex{Float64}},L]
# --- Input parameters 
- 
# --- Output parameters 
- 
# --- 
# v 1.0 - Robin Gerzaguet.
"""
function  psdWaveform(waveform,nbSymb,nbIt)
	# ----------------------------------------------------
	# --- PSD calculation
	# ---------------------------------------------------- 
	# --- Getting frequency allocation 
	allocatedSubcarriers  = waveform.allocatedSubcarriers;
	# --- Getting number of bits 
	# First, frequency size 
	nbSubcarriers	      = length(allocatedSubcarriers);
	# Force a fiven mcs 
	mcs				      = 4;	  # QPSK.
	# Deduce number of required bits 
	nbBits			      = nbSymb * nbSubcarriers * Int(log2(mcs));
	# --- Init psd evaluator 
	psd = 0;
	# --- Iterative PSD calculation
	for iN = 1 : 1 : nbIt
		# --- Binary sequence
		bitSeq	      = genBitSequence(nbBits);
		# Mapping
		qamSeq		  = bitMappingQAM(mcs,bitSeq);
		# --- T/F matrix
		qamMat		  = reshape(qamSeq,nbSubcarriers,nbSymb);
		# --- Signal
		sigPSD		  = genSig(qamMat,waveform);
		# --- Mean PSD:
		psd		  	  = psd .+ 1/nbIt*1/length(sigPSD)*abs.(fftshift(fft(sigPSD))).^2;
	end
	# --- Calculating sampling frequency
	# Returns Nyquist frequency 
	fe		= 1;
	Basefe	= (0:(length(psd) .-1))./length(psd)*fe .-fe/2;
	return (Basefe,psd);
end
# ---------------------------------------------------- 
# --- Main routine  
# ---------------------------------------------------- 
function main()
	# ----------------------------------------------------
	# --- Overall parameters
	# ----------------------------------------------------
	# --- Overall PHY parameters
	nbIt			= 50;			  # --- Iteration number
	nbSymb 			= 14;			  # --- Number of symbols (one frame)
	nFFT 			= 1024;			  # --- Base FFT size
	samplingFreq	= 15.36;		  # --- Frequency value (MHz)
	# --- Frequency allocation
	#allocatedSubcarriers= getLTEAlloc(nFFT);
	#allocatedSubcarriers = (1:12*4);
	# 4 RB alloc. 1 RB space. 4 RB allocated
	allocatedSubcarriers = [1:12*4; 12*5 .+ (1:12*4)];
	# ----------------------------------------------------
	# --- Waveform contender
	# ----------------------------------------------------
	# --- Init OFDM structure
	ofdm  = initOFDM(
					 nFFT,						        # --- nFFT                 : FFT size
					 72,						        # --- nCP                  : CP size
					 allocatedSubcarriers		        # --- allocatedSubcarriers : Subcarrier allocation
					 );
	# --- Init SCFDMA structure
	scfdma  = initSCFDMA(
						 nFFT,						        # --- nFFT                 : FFT size
						 72,						        # --- nCP                  : CP size
						 allocatedSubcarriers,		        # --- allocatedSubcarriers : Subcarrier allocation
						 12;								# --- sizeDFT			   : DFT preprocessing size
						 );
	# --- Init UF-OFDM structure
	ufofdm  = initUFOFDM(
						 nFFT,					        # --- nFFT                 : FFT size
						 73,					        # --- L                    : Filter length (same size +1 due to conv)
						 allocatedSubcarriers,	        # --- allocatedSubcarriers : Subcarrier allocation
						 applyPD=1,				        # --- applyPD              : Do predistortion at Tx stage
						 attenuation=40,		        # --- attenuation          : Filter attenuation in dB
						 );
	# --- Init BF-OFDM structure
	bfofdm	= initBFOFDM(
						 32,				            # --- nFBMC                : PPN size (max number of carriers)
						 64,				            # --- nOFDM                : Precoder size (OFDM sizer)
						 3,				            	# --- K                    : Overlapping factor
						 9,					            # --- GI                   : CP size of precoder
						 0.5,				            # --- δ                    : compression factor
						 allocatedSubcarriers,          # --- allocatedSubcarriers : Subcarrier allocation
						 "gaussian",	            # --- filterName           : Pulse shape name
						 BT=0.36,				        # --- BT                   : Potential BT value for Gaussian
						 filterStopBand = 110,			# --- filterStopBand       : DC stopband value
						 fS=[],				            # --- fS                   : Potential frequency coefficient for FS filter
						 nFFT= 1024,		            # --- nFFT                 : associated FFT value in Rx
						 nCP= 72,			            # --- nCP                  : extended CP size
						 );
	# --- Init WOLA-OFDM structure
	wola  = initWOLA(
					 nFFT,						        # --- nFFT                 : FFT size
					 72,						        # --- nCP                  : CP size
					 allocatedSubcarriers,		        # --- allocatedSubcarriers : Subcarrier allocation
					 "triangle",						# --- Window type @Tx side
					 20,								# --- Window size @Tx side
					 "triangle",						# --- Window type @Rx side
					 20,								# --- Window size @Rx side
					 );
	fbmc  = initFBMC(
					 nFFT,						        # --- nFFT                 : FFT size
					 4,									# --- K					   : Overlapping factor
					 allocatedSubcarriers		        # --- allocatedSubcarriers : Subcarrier allocation
					 );
	# ----------------------------------------------------
	# --- Merging structures
	# ----------------------------------------------------
	# Create  a dictionnary to rule them all 
	waveforms 	= initWaveforms(ofdm,
								scfdma,
								ufofdm,
								bfofdm,
								wola,
								fbmc,
								);
	# ---------------------------------------------------- 
	# --- PSD main calculation  
	# ---------------------------------------------------- 
	# --- Init plot container 
	plt	  = plot(reuse=false);
	decim	= 1;	# decimation for light plots
	# --- Iterative PSD generation
	for (name,struc) in waveforms 
		# --- Calculate PSD for the configuration 
		(fe,psd)  = psdWaveform(struc,nbSymb,nbIt); 
		# Plot the result 
		plot!(plt,fe[1:decim:end].*samplingFreq,10 .* log10.(psd[1:decim:end]/maximum(psd)),label=name,legend=:topleft);
	end
	# --- Update plot and adding labels 
	# Purpose is to zoom out on allocated region.
	scsN 		= (1/1024)*samplingFreq; 		# Subscarrier spacing (normalized)
	rbV 		= (12*12); 		# See several RB for psd fall-off
	ylims!(-120,5);
	xlims!(-rbV*scsN,maximum(allocatedSubcarriers)*scsN+2*12*scsN);
	xlabel!("Frequency [MHz]");
	ylabel!("Spectrum");
	display(plt)
end
end

By running example_PSD_waveform.main(); a comparison plot between the different PSD can be obtained

PSD