Main Content

SNR Definition Used in Link Simulations

This example shows how 5G Toolbox™ link-level simulations define the signal-to-noise ratio (SNR).

SNR Definition

5G Toolbox™ link examples (NR PDSCH Throughput and NR PUSCH Throughput) introduce AWGN to the received signal in the time domain, after the fading channel and before OFDM demodulation.


The examples define the SNR as the average SNR per resource element (RE) per receive antenna. REs are defined in the resource grid (that is, in the frequency domain). To achieve the desired SNR, the examples introduce an equivalent noise level in the time domain.

The SNR is defined as


SRE and NRE are the average signal power per RE per receive antenna and the average noise power per RE per receive antenna, respectively. NRE models the AWGN that is added to the signal.

For a signal x with discrete Fourier transform (DFT) X, Parseval's theorem states


NFFT is the FFT length. Divide the equation by NFFT to get the average signal power


In 5G, the signal of interest does not use all FFT bins (or REs) because of guard bands or zero padding. Additionally, the signal allocation can occupy only a part of the available grid. If the signal uses only KS bins (or REs) of the FFT, the signal power is


KS is the number of nonzero power REs per OFDM symbol.

The signal power per RE is


The noise power per RE is


Because the noise is added in the time domain, the noise occupies all bins, not just the allocated REs. Therefore, the noise power, N, is divided by NFFT and not KS.

Considering these definitions, the SNR becomes


The 5G Toolbox link examples assume that XRMS2=1NRx, where NRx is the number of receive antennas. This assumption means that the overall received power over all antennas is one.


The noise power at the input of the OFDM demodulator is


To generate noise with power N, scale the complex random samples by N0.


The factor of 2 in this equation accounts for the complex nature of the noise samples.

Most 5G Toolbox examples that model a link use this scaling factor. This scaling factor assumes that the root mean squared of the signal RE values is XRMS2=1/NRx. This assumption does not always apply when using a propagation channel.

The propagation channel introduces a number of effects, such as correlation, antenna polarization, and antenna element gain. These channel effects can impact the signal power at the receiver. These effects make estimating the SNR at the receiver and setting up a simulation to model a specific SNR difficult. To overcome this difficulty, the SNR definition in the link examples does not consider any of the channel effects. The SNR definition matches the SNR that is measured without a fading channel and when XRMS2=1/NRx.

When you use a propagation channel (nrTDLChannel or nrCDLChannel object), take into account these considerations.

  • Setting the NormalizeChannelOutputs property of the channel objects to true normalizes the channel outputs by the number of receive antennas such that XRMS2=1/NRx, as assumed in the derivation.

  • Setting the NormalizePathGains property of the channel objects to true sets the total power of the average path gains to 0 dB.

  • The SNR definition does not consider any of the channel effects.

SNR Verification

This section verifies the equation that is derived in the previous section. Because the introduced SNR definition does not take into account any of the channel effects, this verification does not include a propagation channel.

This figure shows the setup to measure the SNR per RE per antenna.


This setup implements these steps.

  • Generate a resource grid with physical downlink shared channel (PDSCH) symbols.

  • OFDM-modulate the grid.

  • Generate AWGN.

  • OFDM-demodulate the received signal and the noise separately.

  • Measure the power of the signal and the noise per RE per antenna.

  • Calculate and display the SNR.

Specify the desired SNR in dB.

SNRdB = 0;
rng("default") % Set default random number generator for repeatability

Set the number of transmit and receive antennas. Because no channel exists, assume that the number of transmit and receive antennas is the same.

nTxAnts = 2;
nRxAnts = nTxAnts;

Specify the carrier parameters.

carrier = nrCarrierConfig;
carrier.NSizeGrid = 52;          % Grid size in resource blocks
carrier.SubcarrierSpacing = 15;  % Subcarrier spacing

waveformInfo = nrOFDMInfo(carrier); % Waveform information

pdsch = nrPDSCHConfig;
pdsch.Modulation = "16QAM";
pdsch.PRBSet = 0:(carrier.NSizeGrid-1); % PDSCH allocation

Create a norm-one precoding vector that is normalized by the number of layers.

w = (1/sqrt(pdsch.NumLayers))*ones(pdsch.NumLayers,nTxAnts);

To achieve the desired SNR, calculate the noise scaling factor: N0=12NRxNFFTSNR.

SNR = 10^(SNRdB/10);
N0 = 1/sqrt(2.0*nRxAnts*double(waveformInfo.Nfft)*SNR);

Generate precoded PDSCH symbols.

[pdschIndices,pdschInfo] = nrPDSCHIndices(carrier,pdsch);
pdschBits = randi([0 1],pdschInfo.G,1);
pdschSymbols = nrPDSCH(carrier,pdsch,pdschBits);
pdschSymbolsPrecoded = pdschSymbols*w;

Create a resource grid and map the precoded PDSCH symbols to the resource grid.

pdschGrid = nrResourceGrid(carrier,nTxAnts);
[~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid);
pdschGrid(pdschAntIndices) = pdschSymbolsPrecoded;


txWaveform = nrOFDMModulate(carrier,pdschGrid);

Assume no channel exists. Because the SNR definition assumes that XRMS2=1/NRx, normalize the received signal by the number of receive antennas.

rxWaveform = txWaveform/sqrt(nRxAnts);

Generate AWGN.

rxNoise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));

OFDM-demodulate the received signal (without noise), and extract the PDSCH symbols from the received grid to calculate SRE.

% OFDM demodulation
rxSignalGrid = nrOFDMDemodulate(carrier,rxWaveform);

% PDSCH symbols extraction
rxPDSCHSymbols = rxSignalGrid(pdschAntIndices);

Measure the received signal power per RE, SRE, and the noise power per RE, NRE.



Verify that the measured SNR values approximate the specified SNR parameter.

Sre = (1/waveformInfo.Nfft.^2)*rms(rxPDSCHSymbols).^2;
Nre = (1/waveformInfo.Nfft)*rms(rxNoise).^2;
for n=1:nRxAnts
    disp("Received signal power per RE antenna " + string(n) + " = " + string(pow2db(Sre(n))+30) + " dBm");
    disp("Received noise power per RE antenna " + string(n) + " = " + string(pow2db(Nre(n))+30) + " dBm");
    disp("SNR (antenna " + string(n) + ") = " + string(pow2db(Sre(n)/Nre(n))) + " dB");
Received signal power per RE antenna 1 = -33.186 dBm
Received noise power per RE antenna 1 = -33.2432 dBm
SNR (antenna 1) = 0.057195 dB
Received signal power per RE antenna 2 = -33.186 dBm
Received noise power per RE antenna 2 = -33.2371 dBm
SNR (antenna 2) = 0.051146 dB

Related Topics