[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/IQ_Analyzer/src/IQ_Plots.py b/mcu/tools/IQ_Analyzer/src/IQ_Plots.py
new file mode 100644
index 0000000..575aa74
--- /dev/null
+++ b/mcu/tools/IQ_Analyzer/src/IQ_Plots.py
@@ -0,0 +1,672 @@
+import numpy as np
+import matplotlib.pyplot as plt
+from mpl_toolkits.axes_grid1 import make_axes_locatable
+from matplotlib.ticker import MultipleLocator
+
+from pylab import *
+
+######################################################################################
+# ----------------------------------- NR PLOTTING (B) -------------------------------#
+######################################################################################
+class NR_Plot:
+ def __init__(self, params):
+ self.rows = 2
+ self.cols = 3
+ self.fig = plt.figure(figsize=(20,10),dpi=80)
+ self.fig.set_facecolor('black')
+
+ self.params = params
+ self.ssb_idx = 0
+
+ def timedomain_plot(self, timedomain_IQ):
+ time_vec = (1/self.params.sample_rate)*np.arange(len(timedomain_IQ))
+ ax = plt.subplot(self.rows, self.cols, 1)
+ ax.set_facecolor('black')
+ ax.set_title("Time domain IQ", fontsize=16, color='white')
+ ax.plot(time_vec,np.real(timedomain_IQ), 'cyan', ms=0.)
+ ax.plot(time_vec,np.imag(timedomain_IQ), 'purple', ms=0.)
+ ax.yaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ ax.xaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ ax.spines['bottom'].set_color('white')
+ ax.spines['top'].set_color('white')
+ ax.spines['right'].set_color('white')
+ ax.spines['left'].set_color('white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+ ax.set_xlim(time_vec[0], time_vec[-1])
+ ymin, ymax = ax.get_ylim()
+ ax.set_xlabel('Time progression (ms)', color='white')
+ ax.set_ylabel('Amplitude', color='white')
+
+ legend = ax.legend(('I-component','Q-component'), loc='upper center', bbox_to_anchor=(0.5, 1.0),ncol='2')
+ frame = legend.get_frame()
+ frame.set_facecolor('black')
+ frame.set_edgecolor('white')
+ for text in legend.get_texts():
+ plt.setp(text, color = 'white')
+ plt.setp(text, fontsize='12')
+
+ def freqdomain_plot(self, timedomain_IQ):
+ Accum_freqSpectrum_IQ_shifted_main = [0]* len(timedomain_IQ)
+
+ # Frequency Span vector
+ Fs = self.params.sample_rate
+ N = len(timedomain_IQ)
+ dF = Fs/N
+ Accum_slidingWinMat_freqSpectrum_IQ_shifted_main = np.zeros((len(timedomain_IQ), self.params.num_avg_frames))
+
+ f_vec = np.arange(-Fs/2,Fs/2,dF)
+
+ ax = plt.subplot(self.rows, self.cols, 4)
+ ax.set_facecolor('black')
+ ax.yaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ ax.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ ax.spines['bottom'].set_color('white')
+ ax.spines['top'].set_color('white')
+ ax.spines['right'].set_color('white')
+ ax.spines['left'].set_color('white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+ ax.set_title('Frequency Spectrum',fontsize=14, color='white')
+ ax.set_xlabel('Frequency (MHz)',fontsize=11, color='white')
+ ax.set_ylabel('Power (dB)',fontsize=11, color='white')
+
+ # Compute FFT - Freq. Spectrum
+ freqSpectrum_IQ_main = (1.0 / self.params.analysis_frame_len) * np.fft.fft(timedomain_IQ)
+
+ # Center Freq. Spectrum at 0 Hz
+ freqSpectrum_IQ_shifted_main = np.fft.fftshift(freqSpectrum_IQ_main)
+
+ if (self.params.is_averagedFrames): # Reduce variance of a signal
+ if (self.params.is_avgSlidingWindow):
+ # MAIN
+ Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,1:] = Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,:-1]
+ Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,0] = np.absolute(freqSpectrum_IQ_shifted_main)
+ Accum_slidingWinVec_freqSpectrum_IQ_shifted_main = (1.0 / self.params.num_avg_frames) * Accum_slidingWinMat_freqSpectrum_IQ_shifted_main.sum(axis=1)
+
+ ax.plot(f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'red',
+ f_vec, 20.0*np.log10(Accum_slidingWinVec_freqSpectrum_IQ_shifted_main), 'orange')
+ legendNames = ['Shifted at center freq', 'Avg sliding window']
+ else:
+ # MAIN/DIV
+ Accum_freqSpectrum_IQ_shifted_main = self.Accum_freqSpectrum_IQ_shifted_main + np.absolute(freqSpectrum_IQ_shifted_main)
+
+ ax.plot(self.f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'red',
+ self.f_vec, 20.0*np.log10(Accum_freqSpectrum_IQ_shifted_main/frame_counter), 'orange')
+
+ legendNames = ['Main', 'Avg']
+ else:
+ ax.plot(self.f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'y')
+ legendNames = ['Main']
+
+ legend = ax.legend((legendNames), loc=1, bbox_to_anchor=(0.5, 1.0), borderaxespad=0.)
+ frame = legend.get_frame()
+ frame.set_facecolor('black')
+ frame.set_edgecolor('white')
+ for text in legend.get_texts():
+ plt.setp(text, color = 'w')
+ plt.setp(text, fontsize='small')
+
+ ylimit = np.max(np.ceil(np.absolute(20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)))))
+ ax.set_ylim([-150, ylimit+10])
+ ax.set_xlim(self.params.interp_freqSpectrum_lowLimit, self.params.interp_freqSpectrum_upperLimit)
+ ax.yaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ ax.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ ax.set_title('Frequency Spectrum',fontsize=14, color='white')
+ ax.set_xlabel('Frequency (Hz)',fontsize=11, color='white')
+ ax.set_ylabel('Power (dB)',fontsize=11, color='white')
+
+ def ss_plot(self, ss_results):
+
+ # ------------------ PSS PLOT PROCESSING INIT (B) ------------------
+ PSS_corr_magSQR_output_frame_main = ss_results.PSS_corr_magSQR_output_frame_main # Correlation result
+ pss_time = len(PSS_corr_magSQR_output_frame_main)
+ PSS_time_vec_tot = (1/self.params.sample_rate)*np.arange(pss_time)
+ # ------------------ PSS PLOT PROCESSING INIT (E) ------------------
+
+ # ------------------ SSS PLOT PROCESSING INIT (B) ------------------
+ SSS_corr_magSQR_output_frame_main = ss_results.SSS_corr_magSQR_output_frame_main
+ sss_time = len(SSS_corr_magSQR_output_frame_main)
+ SSS_time_vec_tot = (1/self.params.sample_rate)*np.arange(sss_time)
+ # ------------------ SSS PLOT PROCESSING INIT (E) ------------------
+
+ ax = plt.subplot(self.rows, self.cols, 2)
+ ax.set_facecolor('black')
+ ax.yaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ ax.xaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ ax.spines['bottom'].set_color('white')
+ ax.spines['top'].set_color('white')
+ ax.spines['right'].set_color('white')
+ ax.spines['left'].set_color('white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+
+ ax.plot(PSS_time_vec_tot, PSS_corr_magSQR_output_frame_main,'-', ms=3.0)
+ ax.plot(SSS_time_vec_tot, SSS_corr_magSQR_output_frame_main,'.-', color='orangered', ms=2.0)
+
+ ax.set_xlim([PSS_time_vec_tot[0], PSS_time_vec_tot[-1]])
+ ax.set_ylim([0.0, 1.0])
+ ax.xaxis.grid(True, linestyle=':', which='major', color='black',alpha=0.5)
+
+ legend = ax.legend(('PSS', 'SSS'), loc='upper center', bbox_to_anchor=(0.5, 1.0),ncol='2', fontsize = 'large')
+ frame = legend.get_frame()
+ frame.set_facecolor('white')
+ frame.set_edgecolor('black')
+ for text in legend.get_texts():
+ plt.setp(text, color = 'black')
+ plt.setp(text, fontsize='large')
+
+ ax.set_xlim([PSS_time_vec_tot[0], PSS_time_vec_tot[-1]])
+ ax.set_ylim([0.0, 1.0])
+ ax.xaxis.grid(True, linestyle=':', which='major', color='black',alpha=0.5)
+
+ ax.set_title('PSS/SSS Correlation Outputs',fontsize=14, color='white')
+ ax.set_xlabel('Time progression (sec.)',fontsize=14, color='white')
+ ax.set_ylabel('Amplitude',fontsize=14, color='white')
+
+ def resourceGrid_plot(self, half_frame2D_FD_occupiedRB):
+ sizeRB = 12
+ Y = np.arange(0, sizeRB*self.params.numRB)
+ X = np.arange(0, self.params.symAmount*5)
+ X, Y = np.meshgrid(X, Y)
+
+ symAmount = self.params.symAmount
+ symAmount_5ms = 5*symAmount
+
+ ax = plt.subplot(self.rows, self.cols, 3)
+ ax.set_facecolor('black')
+ ax.spines['bottom'].set_color('white')
+ ax.spines['top'].set_color('white')
+ ax.spines['right'].set_color('white')
+ ax.spines['left'].set_color('white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+ colorbar_divider = make_axes_locatable(ax)
+ cb_axes = colorbar_divider.append_axes("right", size="5%", pad=1.0)
+ ax.set_title('Five Subframes Resource Grid (Amplitude)',fontsize=14, color='white')
+ ax.set_xlabel('OFDM symbol index',fontsize=12, color='white')
+ ax.set_ylabel('Subcarrier index',fontsize=12, color='white')
+ startSym = 0
+
+ ax.cla()
+ Z = np.absolute(half_frame2D_FD_occupiedRB)
+ im = ax.imshow(Z,
+ interpolation='nearest',
+ cmap="nipy_spectral",
+ aspect='auto',
+ origin="lower",
+ vmin=0.0, vmax=20.0)
+
+ major_ticks = np.arange(-0.5, symAmount_5ms+1, symAmount)
+ minor_ticks = np.arange(-0.5, symAmount_5ms+1, 1)
+ ax.set_xticks(major_ticks)
+ ax.set_xticks(minor_ticks, minor=True)
+ ax.set_xticklabels(np.arange(startSym, symAmount_5ms+startSym+1, symAmount), fontsize=12)
+
+ ax.xaxis.grid(b=True, linestyle='-', which='major', color='black',alpha=1.0)
+ ax.xaxis.grid(b=True, linestyle=':', which='minor', color='black',alpha=0.5)
+ ax.set_xlim([-0.5, symAmount_5ms-0.5])
+ ax.set_ylim([-0.5, 240-0.5])
+
+ ax.set_title('Five Subframes Resource Grid (Amplitude)',fontsize=14, color='white')
+ ax.set_xlabel('OFDM symbol index', fontsize=12, color='white')
+ ax.set_ylabel('Subcarrier index', fontsize=12, color='white')
+
+ grid_colorbar = plt.colorbar(im, cax=cb_axes, ticks=MultipleLocator(1.0), format="%.1f")
+ grid_colorbar_obj = plt.getp(grid_colorbar.ax.axes, 'yticklabels')
+ plt.setp(grid_colorbar_obj, color='white')
+
+
+ def constellation(self, pbchSymbols, detected_PBCH, place):
+
+ ax = plt.subplot(self.rows, self.cols, place)
+
+ ax.set_facecolor('black')
+ ax.spines['bottom'].set_color('white')
+ ax.spines['top'].set_color('white')
+ ax.spines['right'].set_color('white')
+ ax.spines['left'].set_color('white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+ ax.set_xlabel('In-phase',fontsize=10, color='white')
+ ax.set_ylabel('Quadrature-phase',fontsize=10, color='white')
+ colors = ['red', 'green', 'blue', 'white', 'magenta','orange','cyan','pink', 'red', 'green', 'blue', 'white', 'magenta','orange','cyan','pink']
+
+ idx_first_PBCHsym = 0
+ idx_last_PBCHsym = 432
+ for i in xrange(detected_PBCH):
+ line1 = ax.scatter(np.real(pbchSymbols[idx_first_PBCHsym:idx_last_PBCHsym]),np.imag(pbchSymbols[idx_first_PBCHsym:idx_last_PBCHsym]),
+ color=colors[i],label='PBCH-QPSK'+str(self.ssb_idx),s=10,facecolors='none')
+ idx_first_PBCHsym = idx_last_PBCHsym
+ idx_last_PBCHsym = idx_first_PBCHsym + 432
+ self.ssb_idx = self.ssb_idx + 1
+
+ if len(pbchSymbols) == 0:
+ return 0
+ else:
+ limit = np.max(np.ceil(np.absolute(pbchSymbols)))
+ ax.set_xlim([-limit, limit])
+ ax.set_ylim([-limit, limit])
+
+ leg = ax.legend(loc='upper left', fancybox=True, shadow=True)
+ leg.get_frame().set_alpha(0.4)
+
+ lines = [line1]
+ lined = dict()
+ for legline, origline in zip(leg.get_lines(), lines):
+ legline.set_picker(True) # 5 pts tolerance
+ lined[legline] = origline
+
+
+ def pbchDMRS_plot(self, pbchDMRS_results, amount_of_pbchDMRS):
+
+ p = plt.figure(figsize=(10,6), facecolor='black')
+ p.suptitle("PBCH DM-RS correlations (frequency domain)", fontsize = 'large', color='white')
+
+ if amount_of_pbchDMRS > 8:
+ plotting_count = 8
+ else:
+ plotting_count = amount_of_pbchDMRS
+
+ max_ssb_candidates = 8
+ corr_result_length = 144
+ # init
+ start = 0
+ end = 144
+ for j in xrange(1, plotting_count+1):
+ s = plt.subplot(2, 4, j, facecolor='black')
+ plt.subplots_adjust(hspace=0.5)
+
+ maxVal = [] # Max values of correlation results
+ for i in xrange(max_ssb_candidates):
+ dmrsCorr = pbchDMRS_results[start:end]
+ dmrsMaxIdx = np.argmax(dmrsCorr)
+ peakVal = dmrsCorr[dmrsMaxIdx]
+ maxVal.append(peakVal)
+
+ s.set_xlabel('SS block index', fontsize=14, color='white')
+ s.set_ylabel('Amplitude', fontsize=14, color='white')
+ s.set_ylim(0.0, 0.8)
+ s.tick_params(axis='x', colors='white')
+ s.tick_params(axis='y', colors='white')
+ s.spines['bottom'].set_color('white')
+ s.spines['top'].set_color('white')
+ s.spines['right'].set_color('white')
+ s.spines['left'].set_color('white')
+
+ start = end
+ end = start + corr_result_length
+
+ x = [0, 1, 2, 3, 4, 5, 6, 7]
+ markerline, stemlines, baseline = stem(x, [maxVal[0], maxVal[1], maxVal[2], maxVal[3], maxVal[4], maxVal[5], maxVal[6], maxVal[7]], '-')
+ setp(markerline, 'markerfacecolor', 'b')
+ p.show()
+
+
+######################################################################################
+# ----------------------------------- NR PLOTTING (B) -------------------------------#
+######################################################################################
+
+######################################################################################
+# --------------------------------- LTE PLOTTING (B) --------------------------------#
+######################################################################################
+
+class FreqDomainPlots:
+ def __init__ (self, params, pos):
+
+ self.Accum_freqSpectrum_IQ_shifted_main = [0] * params.analysis_frame_len
+
+ # Frequency Span vector
+ Fs = params.sample_rate
+ N = params.analysis_frame_len
+ dF = Fs/N
+ self.Accum_slidingWinMat_freqSpectrum_IQ_shifted_main = np.zeros( (params.analysis_frame_len,params.num_avg_frames) )
+
+ self.f_vec = np.arange(-Fs/2,Fs/2,dF)
+
+ self.params = params
+ self.ax_m = plt.subplot(pos)
+ self.ax_m.set_facecolor('black')
+ self.ax_m.yaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_m.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_m.spines['bottom'].set_color('white')
+ self.ax_m.spines['top'].set_color('white')
+ self.ax_m.spines['right'].set_color('white')
+ self.ax_m.spines['left'].set_color('white')
+ self.ax_m.tick_params(axis='x', colors='white')
+ self.ax_m.tick_params(axis='y', colors='white')
+ self.ax_m.set_title('Frequency Spectrum',fontsize=14, color='white')
+ self.ax_m.set_xlabel('Frequency (MHz)',fontsize=11, color='white')
+ self.ax_m.set_ylabel('Power (dB)',fontsize=11, color='white')
+
+ def process(self, IQ_frame_main_norm):
+
+ # Compute FFT - Freq. Spectrum
+ freqSpectrum_IQ_main = (1.0 / self.params.analysis_frame_len) * np.fft.fft(IQ_frame_main_norm)
+
+ # Center Freq. Spectrum at 0 Hz
+ freqSpectrum_IQ_shifted_main = np.fft.fftshift(freqSpectrum_IQ_main)
+
+ self.ax_m.cla()
+ if (self.params.is_averagedFrames): # Reduce variance of a signal
+ if (self.params.is_avgSlidingWindow):
+ # MAIN
+ self.Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,1:] = self.Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,:-1]
+ self.Accum_slidingWinMat_freqSpectrum_IQ_shifted_main[:,0] = np.absolute(freqSpectrum_IQ_shifted_main)
+ self.Accum_slidingWinVec_freqSpectrum_IQ_shifted_main = (1.0 / self.params.num_avg_frames) * self.Accum_slidingWinMat_freqSpectrum_IQ_shifted_main.sum(axis=1)
+
+ self.ax_m.plot(self.f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'red',
+ self.f_vec, 20.0*np.log10(self.Accum_slidingWinVec_freqSpectrum_IQ_shifted_main), 'orange')
+ legendNames = ['Shifted at center freq', 'Avg sliding window']
+ else:
+ # MAIN/DIV
+ self.Accum_freqSpectrum_IQ_shifted_main = self.Accum_freqSpectrum_IQ_shifted_main + np.absolute(freqSpectrum_IQ_shifted_main)
+
+ self.ax_m.plot(self.f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'red',
+ self.f_vec, 20.0*np.log10(self.Accum_freqSpectrum_IQ_shifted_main/frame_counter), 'orange')
+
+ legendNames = ['Main', 'Avg']
+ else:
+ self.ax_m.plot(self.f_vec, 20.0*np.log10(np.absolute(freqSpectrum_IQ_shifted_main)), 'y')
+ legendNames = ['Main']
+
+ legend = self.ax_m.legend((legendNames), loc=1, bbox_to_anchor=(0.5, 1.0), borderaxespad=0.)
+ frame = legend.get_frame()
+ frame.set_facecolor('black')
+ frame.set_edgecolor('white')
+ for text in legend.get_texts():
+ plt.setp(text, color = 'w')
+ plt.setp(text, fontsize='small')
+
+ self.ax_m.set_ylim([-150, 0])
+ self.ax_m.set_xlim(self.params.interp_freqSpectrum_lowLimit, self.params.interp_freqSpectrum_upperLimit)
+ self.ax_m.yaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_m.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_m.set_title('Frequency Spectrum',fontsize=14, color='white')
+ self.ax_m.set_xlabel('Frequency (Hz)',fontsize=11, color='white')
+ self.ax_m.set_ylabel('Power (dB)',fontsize=11, color='white')
+
+ def reset(self):
+ self.Accum_freqSpectrum_IQ_shifted_main = [0] * self.params.analysis_frame_len
+
+class TimeDomainPlots:
+ def __init__ (self, params, pos):
+ self.time_vec_10subframes = (1/params.sample_rate)*np.arange(10*params.analysis_frame_len)
+ self.ax_t_i_main = plt.subplot(pos)
+ self.ax_t_i_main.set_facecolor('black')
+ self.ax_t_i_main.yaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ self.ax_t_i_main.xaxis.grid(True, linestyle=':', which='major', color='black',alpha=1.0)
+ self.ax_t_i_main.spines['bottom'].set_color('white')
+ self.ax_t_i_main.spines['top'].set_color('white')
+ self.ax_t_i_main.spines['right'].set_color('white')
+ self.ax_t_i_main.spines['left'].set_color('white')
+ self.ax_t_i_main.tick_params(axis='x', colors='white')
+ self.ax_t_i_main.tick_params(axis='y', colors='white')
+ self.ax_t_i_main.set_title('Time-Domain IQ Plot',fontsize=14, color='white')
+ self.ax_t_i_main.set_xlabel('Time progression (millisec.)',fontsize=14, color='white')
+ self.ax_t_i_main.set_ylabel('Amplitude',fontsize=14, color='white')
+
+ def process(self, IQ_full_frame_main):
+
+ self.ax_t_i_main.cla()
+ i_frame = np.real(IQ_full_frame_main)
+ q_frame = np.imag(IQ_full_frame_main)
+
+ maxValueIdx = np.argmax(i_frame)
+ maxValue = i_frame[maxValueIdx]
+ self.ax_t_i_main.plot(1000*self.time_vec_10subframes, i_frame,'cyan', ms=0.5)
+ self.ax_t_i_main.plot(1000*self.time_vec_10subframes, q_frame,'purple', ms=0.5)
+ self.ax_t_i_main.set_xlim([self.time_vec_10subframes[0], self.time_vec_10subframes[-1]])
+ self.ax_t_i_main.set_ylim([-maxValue, maxValue])
+ self.ax_t_i_main.set_xticks(np.arange(0, 11))
+ self.ax_t_i_main.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=0.5)
+ self.ax_t_i_main.set_title('Time-Domain IQ Plot', fontsize=14, color='white')
+ self.ax_t_i_main.set_xlabel('Time progression (millisec.)',fontsize=14, color='white')
+ self.ax_t_i_main.set_ylabel('Amplitude', fontsize=14, color='white')
+
+ legend = self.ax_t_i_main.legend(('I-component','Q-component'), loc='upper center', bbox_to_anchor=(0.5, 1.0),ncol='2')
+ frame = legend.get_frame()
+ frame.set_facecolor('black')
+ frame.set_edgecolor('white')
+ for text in legend.get_texts():
+ plt.setp(text, color = 'white')
+ plt.setp(text, fontsize='12')
+
+class PssCorrPlots:
+ def __init__ (self, params, pos):
+ self.params = params
+ self.frame_len = params.analysis_frame_len
+ self.ax_pss_main = plt.subplot(pos)
+ self.ax_pss_main.set_facecolor('black')
+ self.ax_pss_main.yaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_pss_main.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=1.0)
+ self.ax_pss_main.spines['bottom'].set_color('white')
+ self.ax_pss_main.spines['top'].set_color('white')
+ self.ax_pss_main.spines['right'].set_color('white')
+ self.ax_pss_main.spines['left'].set_color('white')
+ self.ax_pss_main.tick_params(axis='x', colors='white')
+ self.ax_pss_main.tick_params(axis='y', colors='white')
+ self.ax_pss_main.set_title('PSS/SSS Correlation Outputs',fontsize=14, color='white')
+ self.ax_pss_main.set_xlabel('Time progression (millisec.)',fontsize=14, color='white')
+ self.ax_pss_main.set_ylabel('Amplitude',fontsize=14, color='white')
+ self.params = params
+
+ # LTE
+ def process(self, pss):
+
+ PSS_time_vec_tot = (1/self.params.sample_rate)*np.arange(self.params.analysis_frame_len*10)
+ PSS_corr_magSQR_output_frame_main = pss.PSS_corr_magSQR_output_frame_main
+ PSS_peak_detected = pss.PSS_peak_detected
+ PSS_Subframe_max_idx = pss.PSS_Subframe_max_idx
+ PSS_Subframe_max_val = pss.PSS_Subframe_max_val
+
+ SSS_corr_magSQR_output_frame_main = pss.SSS_corr_magSQR_output_frame_main
+ SSS_peak_detected = pss.SSS_peak_detected
+ SSS_Subframe_max_idx = pss.SSS_Subframe_max_idx
+ SSS_Subframe_max_val = pss.SSS_Subframe_max_val
+
+ self.ax_pss_main.cla()
+ self.ax_pss_main.plot(1000*PSS_time_vec_tot,PSS_corr_magSQR_output_frame_main,'.-', color='green', ms=2.0)
+ self.ax_pss_main.plot(1000*PSS_time_vec_tot,SSS_corr_magSQR_output_frame_main,'.-', color='lightgreen', ms=2.0)
+
+ if (PSS_peak_detected == 1):
+ peak_idx = (1/self.params.sample_rate)*(9*self.params.analysis_frame_len+PSS_Subframe_max_idx)
+ self.ax_pss_main.plot(1000*peak_idx,PSS_Subframe_max_val,marker="o", color='red', ms=10.0)
+ if (SSS_peak_detected == 1):
+ peak_idx = (1/self.params.sample_rate)*(9*self.params.analysis_frame_len+SSS_Subframe_max_idx)
+ self.ax_pss_main.plot(1000*peak_idx,SSS_Subframe_max_val,marker="o", color='pink', ms=10.0)
+
+ self.ax_pss_main.set_xlim([PSS_time_vec_tot[0], PSS_time_vec_tot[-1]])
+ self.ax_pss_main.set_yticklabels(fontsize=20)
+
+ self.ax_pss_main.set_ylim([0.0,0.5])
+ self.ax_pss_main.set_xticks([0.0,0.0010666,0.0021332,0.0031998,0.00426641,0.00533301,0.00639961,0.00746621,0.00853281,0.00959941,0.01066602])
+
+ self.ax_pss_main.xaxis.grid(True, linestyle=':', which='major', color='white',alpha=0.5)
+
+ self.ax_pss_main.set_title('PSS/SSS Correlation Outputs',fontsize=14, color='white')
+ self.ax_pss_main.set_xlabel('Time progression (millisec.)',fontsize=20, color='white')
+ self.ax_pss_main.set_ylabel('Amplitude',fontsize=20, color='white')
+
+class ResourceGrid:
+ def __init__ (self, params, pos):
+ sizeRB = 12
+ Y = np.arange(0, sizeRB*params.numRB)
+ X = np.arange(0, params.symAmount*5)
+ X, Y = np.meshgrid(X, Y)
+
+ self.symAmount = params.symAmount
+ self.symAmount_5ms = 5*self.symAmount
+
+ self.ax_5msFD_grid_main = plt.subplot(pos)
+ self.ax_5msFD_grid_main.set_facecolor('black')
+ self.ax_5msFD_grid_main.spines['bottom'].set_color('white')
+ self.ax_5msFD_grid_main.spines['top'].set_color('white')
+ self.ax_5msFD_grid_main.spines['right'].set_color('white')
+ self.ax_5msFD_grid_main.spines['left'].set_color('white')
+ self.ax_5msFD_grid_main.tick_params(axis='x', colors='white')
+ self.ax_5msFD_grid_main.tick_params(axis='y', colors='white')
+ self.colorbar_divider = make_axes_locatable(self.ax_5msFD_grid_main)
+ self.cb_axes = self.colorbar_divider.append_axes("right", size="5%", pad=1.0)
+ self.ax_5msFD_grid_main.set_title('Five Subframes Resource Grid (Amplitude)',fontsize=14, color='white')
+ self.ax_5msFD_grid_main.set_xlabel('OFDM symbol index',fontsize=12, color='white')
+ self.ax_5msFD_grid_main.set_ylabel('Subcarrier index',fontsize=12, color='white')
+ self.startSym = 0
+
+ def process(self, half_frame2D_FD_occupiedRB):
+ self.ax_5msFD_grid_main.cla()
+ Z = np.absolute(half_frame2D_FD_occupiedRB)
+ im = self.ax_5msFD_grid_main.imshow(Z,
+ interpolation='nearest',
+ cmap="nipy_spectral",
+ aspect='auto',
+ origin="lower",
+ vmin=0.0, vmax=20.0)
+
+ self.startSym = 0
+
+ major_ticks = np.arange(-0.5, self.symAmount_5ms+1, self.symAmount)
+ minor_ticks = np.arange(-0.5, self.symAmount_5ms+1, 1)
+ self.ax_5msFD_grid_main.set_xticks(major_ticks)
+ self.ax_5msFD_grid_main.set_xticks(minor_ticks, minor=True)
+ self.ax_5msFD_grid_main.set_xticklabels(np.arange(self.startSym, self.symAmount_5ms+self.startSym+1, self.symAmount), fontsize=12)
+
+ self.ax_5msFD_grid_main.xaxis.grid(b=True, linestyle='-', which='major', color='black',alpha=1.0)
+ self.ax_5msFD_grid_main.xaxis.grid(b=True, linestyle=':', which='minor', color='black',alpha=0.5)
+ self.ax_5msFD_grid_main.set_xlim([-0.5, self.symAmount_5ms-0.5])
+ self.ax_5msFD_grid_main.set_ylim([-0.5, 240-0.5])
+
+ self.ax_5msFD_grid_main.set_title('Five Subframes Resource Grid (Amplitude)',fontsize=14, color='white')
+ self.ax_5msFD_grid_main.set_xlabel('OFDM symbol index', fontsize=12, color='white')
+ self.ax_5msFD_grid_main.set_ylabel('Subcarrier index', fontsize=12, color='white')
+
+ self.grid_colorbar = plt.colorbar(im, cax=self.cb_axes, ticks=MultipleLocator(1.0), format="%.1f")
+ self.grid_colorbar_obj = plt.getp(self.grid_colorbar.ax.axes, 'yticklabels')
+ plt.setp(self.grid_colorbar_obj, color='white')
+
+class PilotsPlots:
+ def __init__ (self, params, pos, idx):
+ self.idx = idx
+ self.ax_pilots_sf0_main = plt.subplot(pos)
+ self.ax_pilots_sf0_main.set_facecolor('black')
+ self.ax_pilots_sf0_main.spines['bottom'].set_color('white')
+ self.ax_pilots_sf0_main.spines['top'].set_color('white')
+ self.ax_pilots_sf0_main.spines['right'].set_color('white')
+ self.ax_pilots_sf0_main.spines['left'].set_color('white')
+ self.ax_pilots_sf0_main.tick_params(axis='x', colors='white')
+ self.ax_pilots_sf0_main.tick_params(axis='y', colors='white')
+
+ self.ax_pilots_sf0_main.set_title('IQ Raw Pilots (S'+ str(self.idx) + ')',fontsize=12, color='white')
+ self.ax_pilots_sf0_main.set_xlabel('In-phase',fontsize=10, color='white')
+ self.ax_pilots_sf0_main.set_ylabel('Quadrature',fontsize=10, color='white')
+
+ def process(self,Pilots_5subFrames_RAW):
+ lim_vec = [-10.0,10.0]
+ colors_ = ['blue','green','red','cyan','yellow']
+ add_idx = self.idx * 4
+
+ self.ax_pilots_sf0_main.cla()
+
+ for kk in xrange(4):
+ self.ax_pilots_sf0_main.scatter(np.real(Pilots_5subFrames_RAW[:,add_idx+kk]),np.imag(Pilots_5subFrames_RAW[:,add_idx+kk]),color=colors_[kk], s=1.0)
+
+ self.ax_pilots_sf0_main.set_aspect('equal')
+ self.ax_pilots_sf0_main.set_xlim(lim_vec)
+ self.ax_pilots_sf0_main.set_ylim(lim_vec)
+ self.ax_pilots_sf0_main.set_title('IQ Raw Pilots (S'+ str(self.idx) + ')',fontsize=12, color='white')
+ self.ax_pilots_sf0_main.set_xlabel('In-phase',fontsize=10, color='white')
+ self.ax_pilots_sf0_main.set_ylabel('Quadrature',fontsize=10, color='white')
+
+class PilotsPhasePlots:
+ def __init__ (self, params, pos, idx):
+ self.idx = idx
+ self.ax_pilots_phase_sf0_main = plt.subplot(pos)
+ self.ax_pilots_phase_sf0_main.set_facecolor('black')
+ self.ax_pilots_phase_sf0_main.spines['bottom'].set_color('white')
+ self.ax_pilots_phase_sf0_main.spines['top'].set_color('white')
+ self.ax_pilots_phase_sf0_main.spines['right'].set_color('white')
+ self.ax_pilots_phase_sf0_main.spines['left'].set_color('white')
+ self.ax_pilots_phase_sf0_main.tick_params(axis='x', colors='white')
+ self.ax_pilots_phase_sf0_main.tick_params(axis='y', colors='white')
+
+ self.ax_pilots_phase_sf0_main.set_title('Mag/Phase Pilots (S'+ str(self.idx) + ')',fontsize=12, color='white')
+ self.ax_pilots_phase_sf0_main.set_xlabel('In-phase',fontsize=10, color='white')
+ self.ax_pilots_phase_sf0_main.set_ylabel('Quadrature',fontsize=10, color='white')
+
+ def process(self,CSRS_ChannelEst_RAW):
+ lim_vec = [-10.0,10.0]
+ colors_ = ['blue','green','red','cyan','yellow']
+ add_idx = self.idx * 4
+
+ self.ax_pilots_phase_sf0_main.cla()
+
+ for kk in xrange(0,4):
+ self.ax_pilots_phase_sf0_main.scatter(np.real(CSRS_ChannelEst_RAW[:,add_idx+kk]),np.imag(CSRS_ChannelEst_RAW[:,add_idx+kk]),color=colors_[kk], s=1.0)
+
+ self.ax_pilots_phase_sf0_main.set_aspect('equal')
+ self.ax_pilots_phase_sf0_main.set_xlim(lim_vec)
+ self.ax_pilots_phase_sf0_main.set_ylim(lim_vec)
+ self.ax_pilots_phase_sf0_main.set_title('Mag/Phase Pilots (S'+ str(self.idx) + ')',fontsize=12, color='white')
+ self.ax_pilots_phase_sf0_main.set_xlabel('In-phase',fontsize=10, color='white')
+ self.ax_pilots_phase_sf0_main.set_ylabel('Quadrature',fontsize=10, color='white')
+
+class CompensatedDataPlots:
+ def __init__ (self, params, pos, idx):
+ self.idx = idx
+ self.ax_data_sf0 = plt.subplot(pos)
+ self.ax_data_sf0.set_facecolor('black')
+ self.ax_data_sf0.spines['bottom'].set_color('white')
+ self.ax_data_sf0.spines['top'].set_color('white')
+ self.ax_data_sf0.spines['right'].set_color('white')
+ self.ax_data_sf0.spines['left'].set_color('white')
+ self.ax_data_sf0.tick_params(axis='x', colors='white')
+ self.ax_data_sf0.tick_params(axis='y', colors='white')
+ if self.idx == 0:
+ self.ax_data_sf0.set_title('IQ Scatter (Subframe 0)',fontsize=14, color='white')
+ self.legend = self.ax_data_sf0.legend(('Slot 0','Slot 1'),loc='upper left', bbox_to_anchor=(1.0, 1.0))
+ self.frame = self.legend.get_frame()
+ self.frame.set_facecolor('black')
+ self.frame.set_edgecolor('white')
+ for text in self.legend.get_texts():
+ plt.setp(text, color = 'w')
+ else:
+ self.ax_data_sf0.set_title('IQ Scatter (Subframe ' + str(idx) +')',fontsize=14, color='white')
+ self.ax_data_sf0.set_xlabel('In-phase',fontsize=11, color='white')
+ self.ax_data_sf0.set_ylabel('Quadrature',fontsize=11, color='white')
+
+ def process (self, full_phaseComp_mat):
+ ofdm_sym = [1,2,3,5,6]
+ lim_vec = [-2.0,2.0]
+
+ self.ax_data_sf0.cla()
+ self.ax_data_sf0.cla()
+ self.ax_data_sf0.cla()
+
+ for kk in xrange(5):
+ _offset_ = self.idx * 14
+ self.ax_data_sf0.scatter(np.real(full_phaseComp_mat[:,ofdm_sym[kk]+_offset_]),np.imag(full_phaseComp_mat[:,ofdm_sym[kk]+_offset_]),color='magenta', s=1.0)
+ _offset_ = _offset_ + 7
+ self.ax_data_sf0.scatter(np.real(full_phaseComp_mat[:,ofdm_sym[kk]+_offset_]),np.imag(full_phaseComp_mat[:,ofdm_sym[kk]+_offset_]),color='yellow', s=1.0)
+
+ self.ax_data_sf0.set_aspect('equal')
+ self.ax_data_sf0.set_xlim(lim_vec)
+ self.ax_data_sf0.set_ylim(lim_vec)
+
+ self.ax_data_sf0.set_xlabel('In-phase',fontsize=11, color='white')
+ self.ax_data_sf0.set_ylabel('Quadrature',fontsize=11, color='white')
+
+ if self.idx == 0:
+ self.ax_data_sf0.set_title('IQ Scatter (Subframe 0)',fontsize=14, color='white')
+ self.legend = self.ax_data_sf0.legend(('Slot 0','Slot 1'),loc='upper left', bbox_to_anchor=(1.0, 1.0))
+ self.frame = self.legend.get_frame()
+ self.frame.set_facecolor('black')
+ self.frame.set_edgecolor('white')
+ for text in self.legend.get_texts():
+ plt.setp(text, color = 'w')
+ else:
+ self.ax_data_sf0.set_title('Subframe ' + str(self.idx) ,fontsize=14, color='white')
+
+
+######################################################################################
+# ---------------------------------- LTE PLOTTING (E) -------------------------------#
+######################################################################################
\ No newline at end of file