5G NR Waveform Acquisition and Analysis
This example shows how to generate a 5G NR test model (NR-TM) waveform using the 5G Waveform Generator (5G Toolbox) app and download the generated waveform to a Keysight™ vector signal generator for over-the-air transmission using the Instrument Control Toolbox™ software. The example then captures the transmitted over-the-air signal using a Keysight signal analyzer and analyzes the signal in MATLAB®.
Introduction
This example generates a 5G NR-TM waveform using the 5G Waveform Generator app, downloads and transmits the waveform onto a Keysight vector signal generator, and then receives the waveform using a Keysight signal analyzer for waveform analysis in MATLAB. This diagram shows the general workflow.
Requirements
To run this example, you need these instruments:
Keysight E4438C ESG vector signal generator
Keysight N9030A PXA signal analyzer
Generate Baseband Waveform Using 5G Waveform Generator App
In MATLAB, on the Apps tab, click the 5G Waveform Generator app.
In the Waveform Type section, click NR Test Models. In the left-most pane of the app, you can set the parameters for the selected waveform. For this example:
Set Frequency range as
FR1 (410 MHz - 7.125 GHz)
Set Test model as
NR-FR1-TM3.1 (Full band, uniform 64 QAM)
Set Channel bandwidth (MHz) as
10
Set Subcarrier spacing (kHz) as
30
Set Duplex mode as
FDD
Set Subframes as
10
On the app toolstrip, click Generate.
% Set the NR-TM parameters for the receiver nrtm = "NR-FR1-TM3.1"; % Reference channel bw = "10MHz"; % Channel bandwidth scs = "30kHz"; % Subcarrier spacing dm = "FDD"; % Duplexing mode
This figure shows a 10 MHz 5G NR waveform visible at baseband.
Transmit Over-the-Air Signal
Download the generated signal to the RF signal generator over one of the supported communication interfaces (requires Instrument Control Toolbox). The app automatically finds the signal generator that is connected over the TCP/IP interface. On the Transmitter tab of the app, select Agilent/Keysight Signal Generator SCPI
from the Driver list. Set the Center frequency (Hz) parameter to 3.4e9
and the Output power (dBm) parameter to -15
. The app automatically obtains the baseband sample rate from the generated waveform. To start the transmission, click Transmit in the toolstrip.
Read IQ Data from a Signal Analyzer over TCP/IP
To read the in-phase and quadrature (IQ) data into MATLAB for analysis, configure the Keysight N9030A signal analyzer using the Instrument Control Toolbox software.
Define the instrument configuration parameters based on the signal you are measuring.
% Set parameters for the spectrum analyzer centerFrequency = 3.4e9; sampleRate = 15.36e6; measurementTime = 20e-3; mechanicalAttenuation = 0; %dB startFrequency = 3.39e9; stopFrequency = 3.41e9; resolutionBandwidth = 220e3; videoBandwidth = 220000;
Perform these steps before connecting to the spectrum analyzer.
Find the resource ID of the Keysight N9030A signal analyzer.
Connect to the instrument using the virtual instrument software architecture (VISA) interface.
Adjust the input buffer size to hold the data that the instrument returns.
Set the timeout to allow sufficient time for the measurement and data transfer.
foundVISA = visadevlist; resourceID = foundVISA(foundVISA.Model == "N9030A",:).ResourceName; resourceID = resourceID(contains(resourceID,"N9030A")); % Extract resourceID which contains "N9030A" sigAnalyzerObj = visadev(resourceID); sigAnalyzerObj.ByteOrder = "big-endian"; sigAnalyzerObj.Timeout = 20;
Reset the instrument to a known state using the appropriate standard command for programmable instruments (SCPI). Query the instrument identity to ensure the correct instrument is connected.
writeline(sigAnalyzerObj,"*RST"); instrumentInfo = writeread(sigAnalyzerObj,"*IDN?"); fprintf("Instrument identification information: %s",instrumentInfo);
Instrument identification information: Agilent Technologies,N9030A,US00071181,A.14.16
The X-Series signal and spectrum analyzers perform IQ measurements as well as spectrum measurements. In this example, you acquire time domain IQ data, visualize the data using MATLAB, and perform signal analysis on the acquired data. The SCPI commands configure the instrument and define the format of the data transfer after the measurement is complete.
% Set up signal analyzer mode to basic IQ mode writeline(sigAnalyzerObj,":INSTrument:SELect BASIC"); % Set the center frequency writeline(sigAnalyzerObj,strcat(":SENSe:FREQuency:CENTer ",num2str(centerFrequency))); % Set the capture sample rate writeline(sigAnalyzerObj,strcat(":SENSe:WAVeform:SRATe ",num2str(sampleRate))); % Turn off averaging writeline(sigAnalyzerObj,":SENSe:WAVeform:AVER OFF"); % Set the spectrum analyzer to take one single measurement after the trigger line goes high writeline(sigAnalyzerObj,":INIT:CONT OFF"); % Set the trigger to external source 1 with positive slope triggering writeline(sigAnalyzerObj,":TRIGger:WAVeform:SOURce IMMediate"); writeline(sigAnalyzerObj,":TRIGger:LINE:SLOPe POSitive"); % Set the time for which measurement needs to be made writeline(sigAnalyzerObj,strcat(":WAVeform:SWE:TIME ",num2str(measurementTime))); % Turn off electrical attenuation writeline(sigAnalyzerObj,":SENSe:POWer:RF:EATTenuation:STATe OFF"); % Set the mechanical attenuation level writeline(sigAnalyzerObj,strcat(":SENSe:POWer:RF:ATTenuation ",num2str(mechanicalAttenuation))); % Turn IQ signal ranging to auto writeline(sigAnalyzerObj,":SENSe:VOLTage:IQ:RANGe:AUTO ON"); % Set the endianness of returned data writeline(sigAnalyzerObj,":FORMat:BORDer NORMal"); % Set the format of the returned data writeline(sigAnalyzerObj,":FORMat:DATA REAL,64");
Trigger the instrument to make the measurement. Wait for the measurement operation to complete, and then read-in the waveform. Before processing the data, separate the I and Q components from the interleaved data that is received from the instrument and create a complex vector in MATLAB.
% Trigger the instrument and initiate measurement writeline(sigAnalyzerObj,"*TRG"); writeline(sigAnalyzerObj,":INITiate:WAVeform"); % Wait until measure operation is complete measureComplete = writeread(sigAnalyzerObj,"*OPC?"); % Read the IQ data writeline(sigAnalyzerObj,":READ:WAV0?"); data = readbinblock(sigAnalyzerObj,"double"); % Separate the data and build the complex IQ vector inphase = data(1:2:end); quadrature = data(2:2:end); rxWaveform = inphase+1i*quadrature;
Capture and display the information about the most recently acquired data.
writeline(sigAnalyzerObj,":FETCH:WAV1?"); signalSpec = readbinblock(sigAnalyzerObj,"double"); % Display the measurement information captureSampleRate = 1/signalSpec(1); fprintf("Sample Rate (Hz) = %s",num2str(captureSampleRate));
Sample Rate (Hz) = 15360000
fprintf("Number of points read = %s",num2str(signalSpec(4)));
Number of points read = 307201
fprintf("Max value of signal (dBm) = %s",num2str(signalSpec(6)));
Max value of signal (dBm) = -29.4588
fprintf("Min value of signal (dBm) = %s",num2str(signalSpec(7)));
Min value of signal (dBm) = -91.9621
Plot the spectrum of the acquired waveform to confirm the bandwidth of the received signal.
% Ensure rxWaveform is a column vector if ~iscolumn(rxWaveform) rxWaveform = rxWaveform.'; end % Plot the power spectral density (PSD) of the acquired signal spectrumPlotRx = spectrumAnalyzer; spectrumPlotRx.SampleRate = captureSampleRate; spectrumPlotRx.SpectrumType = "Power density"; spectrumPlotRx.YLimits = [-135 -85]; spectrumPlotRx.YLabel = "PSD"; spectrumPlotRx.Title = "Received Signal Spectrum: 10 MHz 5G NR-TM Waveform"; spectrumPlotRx(rxWaveform);
Switch the instrument to spectrum analyzer mode and compare the spectrum view generated in MATLAB with the view on the signal analyzer. Use additional SCPI commands to configure the instrument measurement and display settings.
% Switch back to the spectrum analyzer view writeline(sigAnalyzerObj,":INSTrument:SELect SA"); % Set the mechanical attenuation level writeline(sigAnalyzerObj,strcat(":SENSe:POWer:RF:ATTenuation ",num2str(mechanicalAttenuation))); % Set the center frequency, RBW, and VBW writeline(sigAnalyzerObj,strcat(":SENSe:FREQuency:CENTer ",num2str(centerFrequency))); writeline(sigAnalyzerObj,strcat(":SENSe:FREQuency:STARt ",num2str(startFrequency))); writeline(sigAnalyzerObj,strcat(":SENSe:FREQuency:STOP ",num2str(stopFrequency))); writeline(sigAnalyzerObj,strcat(":SENSe:BANDwidth:RESolution ",num2str(resolutionBandwidth))); writeline(sigAnalyzerObj,strcat(":SENSe:BANDwidth:VIDeo ",num2str(videoBandwidth))); % Enable continuous measurement on the spectrum analyzer writeline(sigAnalyzerObj,":INIT:CONT ON"); % Begin receiving the over-the-air signal writeline(sigAnalyzerObj,"*TRG");
For instrument cleanup, clear the instrument connection:
clear sigAnalyzerObj;
To stop the 5G NR-TM waveform transmission, in the Instrument section on the app toolstrip, click Stop Transmission.
Perform Measurements of Received 5G Waveform
Generate and extract an nrDLCarrierConfig
(5G Toolbox) object for a specific TM by using the hNRReferenceWaveformGenerator
helper file.
tmwavegen = hNRReferenceWaveformGenerator(nrtm,bw,scs,dm); cfgDL = tmwavegen.Config;
EVM Measurements
Use the hNRDownlinkEVM
function to analyze the waveform. The function performs these steps:
Estimates and compensates for any frequency offset
Estimates and corrects I/Q imbalance
Synchronizes the DM-RS over one frame for frequency division duplexing (FDD) (two frames for time division duplexing (TDD))
Demodulates the received waveform
Punctures the DC subcarrier component
Estimates the channel
Equalizes the symbols
Estimates and compensates for common phase error (CPE)
Computes the physical downlink shared channel (PDSCH) EVM
Computes the physical downlink control channel (PDCCH) EVM
For more information on the hNRDownlinkEVM
function, see the EVM Measurement of 5G NR Downlink Waveforms with RF Impairments (5G Toolbox) example.
Define the configuration settings for the hNRDownlinkEVM
function.
cfg = struct(); cfg.PlotEVM = true; % Plot EVM statistics cfg.DisplayEVM = true; % Print EVM statistics cfg.Label = nrtm; % Set to TM name of captured waveform cfg.SampleRate = captureSampleRate; % Use sample rate during capture cfg.IQImbalance = true; cfg.CorrectCoarseFO = true; cfg.CorrectFineFO = true; cfg.ExcludeDC = true; [evmInfo,eqSym,refSym] = hNRDownlinkEVM(cfgDL,rxWaveform,cfg);
EVM stats for BWP idx : 1 PDSCH RMS EVM, Peak EVM, slot 0: 2.666 9.007% PDSCH RMS EVM, Peak EVM, slot 1: 2.653 8.812% PDSCH RMS EVM, Peak EVM, slot 2: 2.615 7.824% PDSCH RMS EVM, Peak EVM, slot 3: 2.661 8.099% PDSCH RMS EVM, Peak EVM, slot 4: 2.703 7.532% PDSCH RMS EVM, Peak EVM, slot 5: 2.715 8.699% PDSCH RMS EVM, Peak EVM, slot 6: 2.741 8.065% PDSCH RMS EVM, Peak EVM, slot 7: 2.677 8.297% PDSCH RMS EVM, Peak EVM, slot 8: 2.667 8.566% PDSCH RMS EVM, Peak EVM, slot 9: 2.672 9.212% PDSCH RMS EVM, Peak EVM, slot 10: 2.689 8.082% PDSCH RMS EVM, Peak EVM, slot 11: 2.711 9.935% PDSCH RMS EVM, Peak EVM, slot 12: 2.606 7.931% PDSCH RMS EVM, Peak EVM, slot 13: 2.641 7.583% PDSCH RMS EVM, Peak EVM, slot 14: 2.810 11.276% PDSCH RMS EVM, Peak EVM, slot 15: 2.710 8.925% PDSCH RMS EVM, Peak EVM, slot 16: 2.652 7.819% PDSCH RMS EVM, Peak EVM, slot 17: 2.615 9.181% PDSCH RMS EVM, Peak EVM, slot 18: 2.617 7.642% PDSCH RMS EVM, Peak EVM, slot 19: 2.675 7.504% PDSCH RMS EVM, Peak EVM, slot 20: 2.672 8.327% PDSCH RMS EVM, Peak EVM, slot 21: 2.550 7.932% PDSCH RMS EVM, Peak EVM, slot 22: 2.663 10.029% PDSCH RMS EVM, Peak EVM, slot 23: 2.710 9.863% PDSCH RMS EVM, Peak EVM, slot 24: 2.652 7.724% PDCCH RMS EVM, Peak EVM, slot 0: 4.091 7.352% PDCCH RMS EVM, Peak EVM, slot 1: 3.288 8.030% PDCCH RMS EVM, Peak EVM, slot 2: 3.315 5.373% PDCCH RMS EVM, Peak EVM, slot 3: 3.548 6.459% PDCCH RMS EVM, Peak EVM, slot 4: 3.178 7.353% PDCCH RMS EVM, Peak EVM, slot 5: 3.404 8.247% PDCCH RMS EVM, Peak EVM, slot 6: 2.877 5.912% PDCCH RMS EVM, Peak EVM, slot 7: 3.171 6.461% PDCCH RMS EVM, Peak EVM, slot 8: 3.578 8.686% PDCCH RMS EVM, Peak EVM, slot 9: 3.477 6.330% PDCCH RMS EVM, Peak EVM, slot 10: 3.628 7.232% PDCCH RMS EVM, Peak EVM, slot 11: 3.410 8.697% PDCCH RMS EVM, Peak EVM, slot 12: 3.333 6.797% PDCCH RMS EVM, Peak EVM, slot 13: 3.160 6.639% PDCCH RMS EVM, Peak EVM, slot 14: 3.157 6.172% PDCCH RMS EVM, Peak EVM, slot 15: 3.619 8.186% PDCCH RMS EVM, Peak EVM, slot 16: 2.911 5.377% PDCCH RMS EVM, Peak EVM, slot 17: 3.136 9.346% PDCCH RMS EVM, Peak EVM, slot 18: 3.348 9.101% PDCCH RMS EVM, Peak EVM, slot 19: 3.425 6.827% PDCCH RMS EVM, Peak EVM, slot 20: 3.321 6.858% PDCCH RMS EVM, Peak EVM, slot 21: 3.347 5.715% PDCCH RMS EVM, Peak EVM, slot 22: 3.254 8.079% PDCCH RMS EVM, Peak EVM, slot 23: 2.989 7.005% PDCCH RMS EVM, Peak EVM, slot 24: 3.299 6.602% Averaged RMS EVM frame 0: 2.675%
Averaged overall PDSCH RMS EVM: 2.675% Overall PDSCH Peak EVM = 11.2764% Averaged overall PDCCH RMS EVM: 3.363% Overall PDCCH Peak EVM = 9.3461%
The output of the hNRDownlinkEVM
function shows that the demodulation of the received waveform is successful.