{ "cells": [ { "cell_type": "markdown", "id": "3767d8fa", "metadata": {}, "source": [ "## Calculating bit error rate of PDSCH communication\n", "This notebook shows how to calculate the bit error rate of PDSCH communication when there is no channel coding." ] }, { "cell_type": "code", "execution_count": 1, "id": "2415601e", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import scipy.io\n", "import time\n", "import matplotlib.pyplot as plt\n", "\n", "from neoradium import Carrier, PDSCH, CdlChannel, AntennaPanel, Grid\n", "from neoradium.utils import random" ] }, { "cell_type": "code", "execution_count": 2, "id": "64a5cf3a", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Simulating end-to-end for \"16QAM\", with \"Perfect\" channel estimation, in time domain.\n", "SNR(dB) Total Bits Bit Errors BER(%) time(Sec.)\n", "------- ---------- ---------- ------ ----------\n", " 5 2545920 758389 29.79 5.71\n", " 10 2545920 478555 18.80 5.77\n", " 15 2545920 208018 8.17 5.82\n", " 20 2545920 42283 1.66 5.81\n", " 25 2545920 2789 0.11 5.78\n", " 30 2545920 27 0.00 5.81\n", "\n", "Simulating end-to-end for \"16QAM\", with \"LS\" channel estimation, in time domain.\n", "SNR(dB) Total Bits Bit Errors BER(%) time(Sec.)\n", "------- ---------- ---------- ------ ----------\n", " 5 2545920 884330 34.74 6.27\n", " 10 2545920 588715 23.12 6.13\n", " 15 2545920 300615 11.81 6.10\n", " 20 2545920 91421 3.59 6.01\n", " 25 2545920 11869 0.47 6.44\n", " 30 2545920 708 0.03 6.01\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "numFrames = 2 # Number of time-domain frames\n", "snrDbs = [5,10,15,20,25,30] # SNR values (in dB) for which we want to evaluate the model\n", "freqDomain = False # Set this to True to apply channel in frequency domain\n", "\n", "modulation = \"16QAM\" # Modulation Scheme\n", "carrier = Carrier(numRbs=51, spacing=30) # Create a carrier with 51 RBs and 30KHz subcarrier spacing\n", "bwp = carrier.curBwp # The only bandwidth part in the carrier\n", "\n", "# Create a PDSCH object\n", "pdsch = PDSCH(bwp, interleavingBundleSize=0, numLayers=2, nID=carrier.cellId, modulation=modulation)\n", "pdsch.setDMRS(prgSize=0, configType=2, additionalPos=2) # Specify the DMRS configuration\n", "\n", "numSlots = bwp.slotsPerFrame*numFrames # Total number of slots\n", "results = {} # Dictionary to save the results\n", "\n", "minMse, maxMse = 100, 0\n", "for chanEstMethod in [\"Perfect\", \"LS\"]: # Two different channel estimation methods\n", " results[chanEstMethod] = {}\n", " print(\"\\nSimulating end-to-end for \\\"%s\\\", with \\\"%s\\\" channel estimation, in %s domain.\"%\n", " (modulation, chanEstMethod, \"frequency\" if freqDomain else \"time\"))\n", " print(\"SNR(dB) Total Bits Bit Errors BER(%) time(Sec.)\")\n", " print(\"------- ---------- ---------- ------ ----------\")\n", " for snrDb in snrDbs:\n", " random.setSeed(123) # Making the results reproducible.\n", " t0 = time.time()\n", " carrier.slotNo = 0\n", "\n", " # Creating a CdlChannel object:\n", " channel = CdlChannel('C', delaySpread=300, carrierFreq=4e9, dopplerShift=5,\n", " txAntenna = AntennaPanel([2,4]), # 8 TX antenna\n", " rxAntenna = AntennaPanel([1,2]), # 2 RX antenna\n", " seed = 123,\n", " timing = \"nearest\") \n", "\n", " bitErrors = 0\n", " totalBits = 0\n", "\n", " for slotNo in range(numSlots):\n", " grid = pdsch.getGrid() # Create a resource grid already populated with DMRS \n", " numBits = pdsch.getBitSizes(grid)[0] # Actual number of bits available in the resource grid\n", " txBits = random.bits(numBits) # Create random binary data\n", "\n", " # Now populate the resource grid with coded data. This includes QAM modulation and resource mapping.\n", " pdsch.populateGrid(grid, txBits)\n", "\n", " # Store the indexes of the PDSCH data in pdschIndexes to be used later.\n", " pdschIndexes = pdsch.getReIndexes(grid, \"PDSCH\") \n", "\n", " # Getting the Precoding Matrix, and precoding the resource grid\n", " channelMatrix = channel.getChannelMatrix(bwp) # Get the channel matrix\n", " precoder = pdsch.getPrecodingMatrix(channelMatrix) # Get the precoder matrix from PDSCH object\n", " precodedGrid = grid.precode(precoder) # Perform the precoding\n", "\n", " if freqDomain:\n", " rxGrid = precodedGrid.applyChannel(channelMatrix) # Apply the channel in frequency domain\n", " rxGrid = rxGrid.addNoise(snrDb=snrDb) # Add noise\n", " else:\n", " txWaveform = precodedGrid.ofdmModulate() # OFDM Modulation\n", " maxDelay = channel.getMaxDelay() # Get the max. channel delay\n", " txWaveform = txWaveform.pad(maxDelay) # Pad with zeros\n", " rxWaveform = channel.applyToSignal(txWaveform) # Apply channel in time domain\n", " noisyRxWaveform = rxWaveform.addNoise(snrDb=snrDb, nFFT=bwp.nFFT) # Add noise\n", " offset = channel.getTimingOffset() # Get timing info for synchronization\n", " syncedWaveform = noisyRxWaveform.sync(offset) # Synchronization\n", " rxGrid = syncedWaveform.ofdmDemodulate(bwp) # OFDM demodulation\n", "\n", " if chanEstMethod == \"Perfect\": # Perfect Channel Estimation\n", " estChannelMatrix = channelMatrix @ precoder[None,...]\n", " else: # LS + Interpolation Channel Estimation\n", " estChannelMatrix, noiseEst = rxGrid.estimateChannelLS(pdsch.dmrs, polarInt=False, \n", " kernel='linear')\n", " act = channelMatrix @ precoder[None,...]\n", " mse1 = np.square(np.abs(estChannelMatrix - act)).mean()\n", " fEst = np.stack([estChannelMatrix.real, estChannelMatrix.imag], axis=4)\n", " fAct = np.stack([act.real, act.imag], axis=4)\n", " mse2 = np.square(fEst - fAct).mean()\n", " if minMse>mse2: minMse=mse2\n", " if maxMse