{ "cells": [ { "cell_type": "markdown", "id": "9bf615c6", "metadata": {}, "source": [ "# Studying Bit Error Rate changes while moving along a trajectory" ] }, { "cell_type": "code", "execution_count": 1, "id": "ff9c84c5", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import os, time\n", "import scipy\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "from IPython.display import HTML\n", "\n", "from neoradium import DeepMimoData, TrjChannel, Carrier, Grid, AntennaPanel, random, PDSCH\n", "from neoradium.utils import toDb, toLinear\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "bb2a83ef", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "DeepMimoData Properties:\n", " Scenario: asu_campus_3p5\n", " Version: 4.0.0a3\n", " UE Grid: rx_grid\n", " Grid Size: 411 x 321\n", " Base Station: BS (at [166. 104. 22.])\n", " Total Grid Points: 131,931\n", " UE Spacing: [1. 1.]\n", " UE bounds (xyMin, xyMax) [-225.55 -160.17], [184.45 159.83]\n", " UE Height: 1.50\n", " Carrier Frequency: 3.5 GHz\n", " Num. paths (Min, Avg, Max): 0, 6.21, 10\n", " Num. total blockage: 46774\n", " LOS percentage: 19.71%\n", "\n" ] } ], "source": [ "# Replace this with the folder on your computer where you store DeepMIMO scenarios\n", "dataFolder = \"/data/RayTracing/DeepMIMO/Scenarios/V4/\"\n", "DeepMimoData.setScenariosPath(dataFolder)\n", "\n", "# Create a DeepMimoData object\n", "deepMimoData = DeepMimoData(\"asu_campus_3p5\")\n", "deepMimoData.print()" ] }, { "cell_type": "code", "execution_count": 3, "id": "acb51829", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Trajectory Properties:\n", " start (x,y,z): (-164.55, 39.83, 1.50)\n", " No. of points: 8227\n", " curIdx: 0 (0.00%)\n", " curSpeed: [10.64 10.64 0. ]\n", " Total distance: 123.44 meters\n", " Total time: 8.226 seconds\n", " Average Speed: 15.006 m/s\n", " Carrier Frequency: 3.5 GHz\n", " Paths (Min, Avg, Max): 6, 8.99, 10\n", " Totally blocked: 0\n", " LOS percentage: 26.43%\n", "\n" ] }, { "data": { "text/plain": [ "(
,\n", " )" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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BAAAAMdRCQUAAIDjCKEAAABwHCEUAAAAjiOEAgAAwHGEUBfbunWrdO/eXSpWrCi5c+eWiy66yIyGPHXqVKLtVq9eLY0bN5ZcuXKZFTTGjBmT7L4+/vhjueSSS8w2l112mcyaNUsi7dlnn5VGjRpJnjx5pFChQgG30VWpkp4+/PDDRNssWrRIrrjiCjNKtHLlyjJ16lTxwrFt375dbrrpJrNNiRIl5LHHHpMzZ864/tgCqVChQrLXafTo0el+n7rVK6+8Yo5R971+/fqybNky8ZJhw4Yle33074Ht5MmT0rt3bylatKjky5dPbrvtNtmzZ4+40XfffSe33HKLWXlHj2PGjBmJrtextkOGDJELLrjA/N1s0aKF/P7774m2+eeff6Rjx45mknf9/dS/s0ePHhUvHF+XLl2SvZatWrXyzPEB/gihLrZhwwazTOjrr78u69atkxdffFEmTZokjz/+eKKl266//nopX768LF++XJ5//nnzgfPGG2/4tlm8eLF06NDB/CFasWKFtGnTxpzWrl0rkaRhun379vLAAw+kut2UKVNk165dvpPuu23Lli0myDVt2lRWrlwpffv2lXvvvVfmzJkjbj62s2fPmv3W7fT1mTZtmgmY+uHp9mNLyYgRIxK9Tg899FC63qduNX36dOnXr5/5AvjLL79IzZo1pWXLlrJ3717xkho1aiR6fb7//nvfdY888oh8+eWX5svqt99+a5YmbteunbjRsWPHzGugXwwC0S83L7/8svlbuXTpUsmbN695vTRo2zSg6d/UefPmycyZM03wu++++8QLx6c0dPq/lh988EGi6918fEAiOkUTvGPMmDFWxYoVfedfffVVq3DhwlZ8fLzvsoEDB1pVq1b1nb/jjjusm266KdH91K9f37r//vstN5gyZYpVsGDBgNfpW/Szzz5L8bYDBgywatSokeiyO++802rZsqXl5mObNWuWlSVLFmv37t2+y1577TWrQIECvtfS7cfmr3z58taLL76Y4vXBvE/dql69elbv3r1958+ePWuVLl3aGjVqlOUVQ4cOtWrWrBnwuoMHD1rZs2e3Pv74Y99l69evN797S5Yssdws6d+Hc+fOWaVKlbKef/75RMeXM2dO64MPPjDnf/31V3O7n376ybfN119/bcXFxVl//fWX5SaB/v517tzZat26dYq38dLxAVRCPebQ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "random.setSeed(123) # Make results reproducible\n", "\n", "# Create the carrier:\n", "carrier = Carrier(startRb=0, numRbs=25, spacing=15) # Carrier with 25 Resource Blocks, 15KHz subcarrier spacing\n", "bwp = carrier.curBwp # The only bandwidth part in the carrier\n", "\n", "# Create a random trajectory at waking speed.\n", "trajectory = deepMimoData.getRandomTrajectory(xyBounds=np.array([[-210, 40], [-120, 100]]), # Traj. bounds\n", " segLen=5, # Num grid points on shortest segment\n", " bwp=bwp, # The bandwidth part\n", " trajLen=100, # Number of grid points on trajectory\n", " speedMps=15) # Speed in mps\n", "\n", "trajectory.print() # Print the trajectory information\n", "deepMimoData.drawMap(\"LOS-NLOS\", trajectory) # Draw the Map with the trajectory" ] }, { "cell_type": "code", "execution_count": 4, "id": "3f8aedbe-a990-4870-b7a3-17f0c843e008", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "TrjChannel Properties:\n", " carrierFreq: 3.5 GHz\n", " normalizeGains: True\n", " normalizeOutput: True\n", " normalizeDelays: True\n", " xPolPower: 10.00 (dB)\n", " filterLen: 16 samples\n", " delayQuantSize: 64\n", " stopBandAtten: 80 dB\n", " dopplerShift: 175.6448069011776 Hz\n", " coherenceTime: 0.0024090788399960396 sec\n", " TX Antenna:\n", " Total Elements: 8\n", " spacing: 0.5𝜆, 0.5𝜆\n", " shape: 2 rows x 4 columns\n", " polarization: |\n", " Orientation (𝛼,𝛃,𝛄): 180° 0° 0°\n", " RX Antenna:\n", " Total Elements: 2\n", " spacing: 0.5𝜆, 0.5𝜆\n", " shape: 1 rows x 2 columns\n", " polarization: |\n", " Trajectory:\n", " start (x,y,z): (-164.55, 39.83, 1.50)\n", " No. of points: 8227\n", " curIdx: 0 (0.00%)\n", " curSpeed: [10.64 10.64 0. ]\n", " Total distance: 123.44 meters\n", " Total time: 8.226 seconds\n", " Average Speed: 15.006 m/s\n", " Carrier Frequency: 3.5 GHz\n", " Paths (Min, Avg, Max): 6, 8.99, 10\n", " Totally blocked: 0\n", " LOS percentage: 26.43%\n", "\n" ] } ], "source": [ "# Create a PDSCH object\n", "pdsch = PDSCH(bwp, interleavingBundleSize=0, numLayers=1, nID=carrier.cellId, modulation=\"64QAM\")\n", "pdsch.setDMRS(prgSize=0, configType=2, additionalPos=2) # Specify the DMRS configuration\n", "\n", "channel = TrjChannel(bwp, trajectory,\n", " txAntenna = AntennaPanel([2,4]), # 8 TX antenna\n", " txOrientation = [180,0,0], # TX antenna pointing to the left\n", " rxAntenna = AntennaPanel([1,2]), # 2 RX antenna\n", " seed = 123)\n", "print(channel)\n", "\n", "snrDbs = [-20,0]\n", "chanEstMethods = [\"Perfect\", \"LS\"]\n", "prevBer = {f\"{chanEstMethod}{snrDb}\": 0 for chanEstMethod in chanEstMethods for snrDb in snrDbs}\n", "def getBER(channel, snrDbs, end):\n", " berInfo = {f\"{chanEstMethod}{snrDb}\": np.int32([0,0]) for chanEstMethod in chanEstMethods for snrDb in snrDbs}\n", " while channel.trajectory.curIdx < end:\n", " channelMatrix = channel.getChannelMatrix() # Get the channel matrix\n", " precoder = pdsch.getPrecodingMatrix(channelMatrix) # Get the precoder matrix from PDSCH object\n", " for snrDb in snrDbs:\n", " for chanEstMethod in chanEstMethods:\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", " precodedGrid = grid.precode(precoder) # Perform the precoding\n", " rxGrid = precodedGrid.applyChannel(channelMatrix) # Apply the channel in frequency domain\n", " rxGrid = rxGrid.addNoise(snrDb=snrDb) # Add noise\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, kernel='linear')\n", " \n", " eqGrid, llrScales = rxGrid.equalize(estChannelMatrix) # Equalization\n", " rxBits = pdsch.getHardBitsFromGrid(eqGrid, pdschIndexes)[0] # Demodulation\n", " bitErrors = np.abs(rxBits-txBits).sum() # Calculating number of bit errors\n", " berInfo[f\"{chanEstMethod}{snrDb}\"] += [bitErrors, numBits]\n", " channel.goNext()\n", " for chanEstMethod in chanEstMethods:\n", " for snrDb in snrDbs:\n", " k = f\"{chanEstMethod}{snrDb}\"\n", " berInfo[k] = berInfo[k][0]/berInfo[k][1]\n", " return berInfo\n", "\n", "# A call back function that is called to draw up to three graphs below the animated trajectory\n", "def handleGraph(request, ax, trajectory, points=None):\n", " if request==\"Config\":\n", " # Configure all graphs\n", " if len(ax)>0:\n", " ax[0].set_xlim(0,trajectory.numPoints)\n", " ax[0].set_ylim(0,.5)\n", " ax[0].set_title(\"BER (LS)\")\n", " ax[0].grid()\n", " if len(ax)>1:\n", " ax[1].set_xlim(0,trajectory.numPoints)\n", " ax[1].set_ylim(0,.5)\n", " ax[1].set_title(\"BER (Perfect)\")\n", " ax[1].grid()\n", "\n", " elif request==\"Draw\":\n", " # For Draw: ax is an array of `numGraphs` elements\n", " p0, p1 = points\n", " berInfo = getBER(channel, snrDbs, p1)\n", " if len(ax)>0:\n", " for i, snrDb in enumerate(snrDbs):\n", " k = f\"LS{snrDb}\"\n", " ax[0].plot([p0,p1], [prevBer[k], berInfo[k]], ['orange','red'][i], markersize=1, label=f\"SNR: {snrDb} dB\")\n", " prevBer[k] = berInfo[k]\n", " if p0==0: ax[0].legend(fontsize=8)\n", "\n", " if len(ax)>1:\n", " for i, snrDb in enumerate(snrDbs):\n", " k = f\"Perfect{snrDb}\"\n", " ax[1].plot([p0,p1], [prevBer[k], berInfo[k]], ['blue','black'][i], markersize=1, label=f\"SNR: {snrDb} dB\")\n", " prevBer[k] = berInfo[k]\n", " if p0==0: ax[1].legend(fontsize=8)\n", "\n", " print(\"\\r Current Trajectory Point: %d (%d%%) \"%(trajectory.curIdx, \n", " trajectory.curIdx*100//trajectory.numPoints), end=\"\")\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "e3acda25-0efc-4a9e-8608-35eeb67103ce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Current Trajectory Point: 8200 (99%) " ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Increase the animation memory limit to 100 MB\n", "matplotlib.rcParams['animation.embed_limit'] = 100000000\n", "\n", "# Now create the animation and display it in the following cell. This can take a while...\n", "channel.restart()\n", "anim = deepMimoData.animateTrajectory(trajectory, numGraphs=2, pointsPerFrame=20, graphCallback=handleGraph)\n", "HTML(anim.to_jshtml())\n" ] }, { "cell_type": "code", "execution_count": null, "id": "4d4b71a2-cf3c-4ab0-b23e-25154f08fbe7", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.6" } }, "nbformat": 4, "nbformat_minor": 5 }