{ "cells": [ { "cell_type": "markdown", "id": "8136f6c4", "metadata": {}, "source": [ "# Beam Sweeping in a DeepMIMO Scenario\n", "This notebook demonstrates beam sweeping in a DeepMIMO scenario by transmitting a set of CSI-RS resources and using the corresponding CRI reports.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "0d0aaa42", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "from neoradium import DeepMimoData, BandwidthPart, AntennaPanel\n", "from neoradium import CsiRs, CsiRsSet, CsiRsConfig, CsiReport, CsiReportMan\n", "from neoradium.utils import toDb" ] }, { "cell_type": "code", "execution_count": 2, "id": "05aeedf9", "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: 46,774\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", "dmData = DeepMimoData(\"asu_campus_3p5\")\n", "dmData.print()" ] }, { "cell_type": "markdown", "id": "b889ba4a-3c2e-4d4a-8929-38727acb395c", "metadata": {}, "source": [ "In the following cell, we select an arbitrary UE position and use the ``channelForPoints`` method of the ``DeepMimoData`` class to obtain a channel model between the base station and the UE.\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "2a90e164-6a53-4d26-888c-3d182f9dc941", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqAAAAG/CAYAAACHVGUWAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAATONJREFUeJzt3QeYU2XaxvFn6L1JbyIiIMW2oqifBREbIioKgl1Q1y5gQ13FBthFFNu6gl1REMVOW8W2gAVQuoqgNEV6h3zX/eqJSSYzk2EmJznJ/3ddgZmTdzI5OZnkzvOWkxMKhUIGAAAA+KSEX78IAAAAIIACAADAd1RAAQAA4CsCKAAAAHxFAAUAAICvCKAAAADwFQEUAAAAviKAAgAAwFel/P11AIJi69at9uyzz9qMGTNsw4YN9q9//cv23HPPVN8t+OC+++6zjRs32m233cbjDSApcjgTElA8JkyYYM8//7z7+o477rDGjRvnajN06FD7+uuvrWrVqu7rdHbCCSfYggUL7JprrrGKFSta586drVatWnnu94033mgtW7bM9zZ/+OEHe+utt9zt6iRszZo1s65du1rTpk3jtlf4fe+99+znn392j1nr1q1d+0qVKsVt/84779i4cePs8ccft507d9qFF17otp9//vl21FFHRbX9/vvv7d5777VLLrnEDjnkELfN+5mDDz7YLr300nz3ZcuWLW5fpk6daqtXr3aPzRFHHGHHHnus5eTk5Gq/fv16e+WVV2zevHm2adMmF+aPP/74Ah+zZHn44Yftt99+s7vuuivXdcccc4zbp2nTpqXkvgHIfHTBA8Vk9uzZNnLkSHdR5TBeALn55pvd9a+++mpaP+6LFy+2999/34XKyy+/3AW4eOEzcr+XLVuW5+0p2Om2WrRoYZMmTbLmzZvb3nvvbR9//LHbpuvUxqNwevHFF9s//vEP++abb1wbBdDBgwdbgwYNXCiN55FHHrFffvkl/Du946F92LFjR1TbX3/91V23cOHCqPupbf/973/zfXymTJlie+21lw0YMMAqVKhgBx54oG3bts3OPvts9/WPP/4Y1f6jjz6y3Xff3R566CGrUqWK2/f//e9/1qZNG/czqTB+/Hh78803U/K7AYAueKCYqZqmEHPrrbdGVcJee+01F1IUUBTw0pkqjlKnTp1iub0bbrjBHnjgAXvxxRetZ8+e4e1XXHGFvfzyy9arVy8XENX1K6NHj7ann37aVSivu+66cPv+/fvbTTfdFL5/kdauXWuTJ0+24cOHR21XJVrVzmeeecaF2qKaOXOmHXfccXb44Ye7AFeuXLmo+3fkkUdahw4d7KuvvrIaNWq4/Tr33HOtbt26Nn369HD7yy67zAXj22+/vcj3CQCChgAKFDNVC9Wtq+qewohHVdEuXbq4SmhsAFXb//znP+5rhVZ1Me+zzz7Wo0cPVzHzqHL64YcfujClSuLYsWPddnWPd+rUKeGxnaNGjbIvv/zStm/fbq1atXJVuGrVqoW7ZlX99L5+/fXXXYjTsIJdoS7nBx980IXMyPDp0TZ1m6vNRRdd5Kqj6taWE088MaptqVKlXChdtWpVrttRVVT7o8c4kh6X+fPn28CBA+2ss85ywwmKom/fvq5C+9xzz0WFTy+wKzirK37QoEF2//33u2Ot6vDpp5+eq/1hhx3muuUTHZOpDzV6DnzyySdWuXJlO/PMM22//faLavvCCy+46qaUKFHCHdf27dvbqaeeaqVLl3bbb7nlFvv222/dc1HPVylZsqR7XsUaM2aMG2ahSq+ej6pKR9JjriCuY6axwjp+OqZ5VcwBwL0+8TAAxeuAAw5w4XHEiBHhbRrzqG7bCy64IO7P1KtXz41R1EWVNQUZhZd9993X/vjjj3A7vcmruvrYY4+57maNndSbvipy1157bYH3TWP+2rVr50JU9erVrUmTJvbEE0+4Lm51dUvbtm3DoUZf6z6parurFLDUte0FnXh0ndp4QxPUXS3qpo5HlcVYGo+poFW7du24AW7p0qWuClsUK1ascGFMwTje7xEdPx0XVXa9Y6vgp+pn5DCD/PYl1gcffGBvv/22G5c6ceJEd7y+++47FwYVhCNpaID3XDr00EOtbNmyduWVV7rniPf79RzYbbfdXBj32kZ+WPLoOaVg7z0/9PhGDk9QdVe3q+eTbktDCn766ScXrGfNmpXAIwoga2kSEoCiGzZsWEh/UlOnTg09+OCDoUqVKoXWr1/vrrvppptC9erVC23fvj103HHHherUqVPg7a1ZsyZUq1at0A033BDe1r9//1BOTk7o8ssvj2p77733ut89efLkfG/z7LPPDpUpUyY0f/788LZ169aFmjVrFtp7771DO3bscNsmTZrkbu/tt99OeL/1M/Gcfvrp7vrly5fneRtLly51bc4444zwfdL9KVmyZKhnz56hkSNHhr755pvQzp074/78tm3bQtWqVXOPQ+Q23Wbv3r3d9927d3fHZNmyZe77jz76yF3//PPP5/qZHj16xP0948ePd9fffvvt+T4mXbt2de1+//139/1dd93lvt9nn31CQ4YMcbej45uojh07hipWrBh65JFHorb36tUrVL58eff45ef77793v//ll18Ob+vcuXOodevW+f6+xx9/PLxNz43mzZuHOnToEN6m57pu94MPPoj6eR2/3377LeH9A5B9qIACSaAubc2SVve1qk6qUmmbujnzoiqpKnWqcqlSetVVV7nueK8yGfGh0f75z39GbdNYSlW6NMYyv6533Z/TTjvNzT73qLtfYxE1mUhVuuKmbl7Jr+vbm9XutdX3qvZqCIC62zUOVFVZVR01BlTd0ZFUldOsbc2Qz4smMOkxUFd8Mvcl3v5o8pmGTKiSrMq4Zr+rAqnqoWb6J8KbmBVJY041o15jZiPpsdPYUrVXdfmee+5xwxdin0v50XOvT58+4e/Vna8Z/hrb6vGezxp7q674yP3X/gFAXgigQBJo/JuWMVLY0Hi8JUuW5NsFrWWMNDNab+RankfduOoW1fg9BatYkQFSypcvbw0bNnTLHOVFs8M3b97sulNjeUsBRc4ILy5eEPn999/zbONdFxlaFPIUrDUedfny5e6+aRypgmTsUAaNhdU+aPxhXtQtruD+73//2+bOnZu0fYm8PrJ7XcdTYywV9HVM9aFE4VPHetGiRQX+bo3D1YeMSN7+Rh53rSigrndt07JV6lrX71YAjfdcyouGZ+hnYp/Xa9ascaFX9t9/f/eBScdEw0Y0zlXDQ3S8ACA/BFAgSRQ4VZnT5B2tK6nJPnlVtlTJUmDVOpYad6e1KL1xkfGokhdLFdfYwBDJm4AS72cVTCPbFCftu3zxxRd5tvGu89rmFSC1dqoClSZRrVu3Lmr8Z37VT48m8SjYalb+rlDg0mOU376oEqj1MxX+8lqvVPdBE3W0LJNm76syXRAd37y2ecddE540SUvLQ2ms8NVXX+3C+hlnnBE+xomKDbteFVQil7TSqgP6cHD33Xe7SVY6YYE+IOnDFADkhQAKJMlJJ53kKmaffvppvtVPdSevXLky10QfhQlN6IhHi9lH0ixrrWupSUt50fqZ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kdXaeGLbnHXWWa4ye/zxx9s+++xjZ599thUFk5AAAACKYMOGDfbDDz9YkyZNEmq/c+dOe/zxx+2CCy6ICp9Su3ZtV2X897//bZs2bXJtH3vsMdfVHhs+vaAY212viuwRRxzhuvNHjRoVFT6LQoG2Y8eO9vTTTxf5tqiAArtYBc2WqlyogEpktlR+ASDSgAED7P7777dt27a5amOnTp3s1ltvTehBWrRokf3+++/Wrl27uNera19d+LpdjQtV23/84x8J3baCsCqXGveZV1e5uthjK6D6/sYbbyzw9nWfNUQgqwKozhOrEvSrr77qBsvqwMeW0eOVvq+66io7+uijw9/r08SIESNc6VtjJlRS1tiNTOLHuMVMDx7xwla2hM54snnfASCWJh0pKGp8poLioEGDXFf3RRddVOCDtWnTJve/N3kolib9eO2805R62wqiaqguS5Yscbkp3mQmZajYsKnTZya62HxxDJEITADVJwyd1knjDlTqnj9/fq42ehKMHTvW7rnnnqgydbNmzaLa9enTxz744AP36UWz1E4++WQ3K+ziiy/2ZV8AAECwRY4B1bhIZZC+ffvaeeedV+B50OvVq+fOCqVKaDyaPOQFxerVq7u23raC7L777m4WuwprvXr1chOjSpWKjnuJjAHNyy+//GJ169a1rAmgSvBTpkxxM7muueYa93VeNO6hffv2ca/79ttv3UywyZMn25FHHum2aVaYPgnoSVNc4yQAAED2UFhUgUyFrTp16uTbtnr16nbIIYfYSy+95EJrLIXGli1bWtOmTd33hx56qKuuqm3k6UzzoolH48ePd2M2NXtePxsbQneFhgW88847bmxp1gRQhUSFz0RozIOCpAb2nn/++VEV0Pfee8+Np1BIjZxxpllkGrTrhdJMwPJBQHZhmET+cnxeIB7ZQ9XP119/3c2kLyh8RmaVDh062G233ebGjnpd5Zr5/v7777ug57nvvvvsqKOOcj23t99+e7hYpu754cOH2xVXXJHrvOsaHqChhhqbqpzz2muvxZ0tn6jly5fbpZde6n6n7kfWBNBEKXQedNBBrrytsNm2bVu3aKs3xlNrbCnIRn6C8JZe0HXxAqgSvy6etWvXWlAQQpEJWIoJxXXGIEIoinsSksLnvHnzrFKlSi7k5dUu0gMPPGCHHXaYyymaLPTUU0+5oYPqZlc+GTNm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QwAFkDarGMT7/UwIA4DMQwAFskyqQyYAAARQAACQVn5e87P9ttGfhehrVqhpjasmvhC9zsk+Z84ca9KkiVWqVCnftqtXr7YVK1bYbrvt5i552bhxoztdZ8OGDa1MmTKWDQigAAAgrcJni0db2Obt/pyKs1ypcjb3irkJh9DffvvN2rZta++9954df/zxcdt8/fXXds0119i0adOsQYMGtnTpUmvVqpU99NBDduihh4bbLV682C655BKbOHGia6fzvHfq1Mnuvvtua9mypWUylmECAABpQ5VPv8Kn6HcVZ7V1xowZdvjhh9vee+/tqp/z5s1zofWYY46xo48+2j777LNw27PPPts2bdrkAurChQvtjz/+sHPPPdf+97//WaajAoqsxeQWAEBx69+/vzVu3NiGDx9uJUr8WecrW7asq2pOmTLFrrzySps+fbrt2LHDhdHHH3/cqlev7tqVLFnSunbtmhUHhQooAABAMVi3bp3rTj///PPD4TNS79697auvvnJd7wqbe+yxh73wwgv2448/Zt3jTwAFAAAoBkuWLLGdO3da06ZN417vbV+0aJH7X+Fz+fLlbrsuZ511lo0ePTorjgUBFAAAoBh4M9g1qz2eDRs2RLU76KCDbPbs2TZz5ky78cYbbfPmzXb66afbZZddlvHHgwCKtBqTmewLAADJsvvuu1vlypXt22+/jXu9tpcqVcpNUIrUpk0bu/jii+2NN96wgQMH2hNPPGHr16/P6ANFAEVWIYwCAJJF4fKCCy6wp59+2q3rGTs+dOjQodazZ08XUkUVz1hajiknJ8dCocwumzALHkDan7kps1+GAQSRxnHOmjUrapsmFQ0aNMgto3TEEUe4aqaqnZpkdOedd1rNmjXt4YcfDrfXWp/nnXeetW/f3mrVquWWcLrllluse/fu4ZCaqQigGSreGzanYAQAoGhKly5trVu3tmHDhrlLpGeffdbatWtnkydPtmeeecaef/55N8lIZ0E655xz7J///KdVqFAh3H7q1Kn21FNPudvRIvT16tVzoVWz6DMdATRDpXPYpJoFAMjv1Jg6O5GfZ0LS70yUwmRs5TOW1v3URKKCJhPVqlXLbr75ZstGBFAA8FnOwKL9fKiIPw+kM50SU6fGTNdzwaN4EECRtfKrElOlRSYHWMDToZVZpXJ/Pa/S6GFRICQUZjZmwaNYMcsc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QDoigAJwQTVVFfJEfi9BGgAyC13wAAAA8BUBFAAA5Is5BChuBFAADt3cAAC/EEABAADgKyYhAUCWyK8blQp48h9rHmPgb1RAAYRxfnigeBA2gfxRAQUAoJgwWQdIDBVQAACSjLMNAdEIoAAAAPAVARQAAAC+YgwogECNq2NyR/IfYwBItowKoFu3brWbbrop1/YzzzzTDjzwwKhtH3/8sU2YMMHKlStnp556qrVs2dLHewqkJ0IIULwY+wlkQRe8AugDDzzg/q9bt274Ur58+ah2AwcOtJNOOsnWrFljc+bMsX333dfefvvtlN1vINFwmN8FAICgyKgKqKdXr17Wvn37uNctXLjQ7rrrLnv11VetW7dubluNGjXs0ksvtRNPPNFKlizp871FOlI3L6EOAIDkyKgKqOell16yf/3rXzZixAhbvXp11HWqdFaqVMm6du0a3nb++efbL7/8YtOmTUvBvQUAAMguGRdAq1atahs3bnRfDx8+3I3t/Oqrr8LXz5071xo3bmylSv1d/N1zzz3d//PmzYt7m1u2bLG1a9dGXYB0Q8UWABAUad0FryB566235tumTZs2roIpZcuWtVmzZlnDhg3d93fccYd17tzZ+vTpEw6hus0qVapE3YYqoup637BhQ9zfMXjwYLv99tuLaa+QyVJ5/mdmhwPphQlIQN7SOoDm5OS4SUT5qV69evjr0qVLh8On9/PnnXee9ezZ09avX++Cpi6x3fLr1q2zHTt2WOXKleP+jgEDBli/fv3C36sC2qhRoyLsGVC8Mj185mTo/lC1BpCt0jqAavb6tddeW6Tb2L59u4VCITczXlq1amXPPfec61ZXxVQ0E1723nvvuLehdl7bIAll4Rs7AABIfxk1BvTrr7+OGp+pkPnEE0/YAQcc4Ga6iyYfKYy++OKL4XZq06xZM9t///0tSHKK4QIAAOC3tK6AFtby5cvdEkxt27a1atWquYXm1S0/atSocBt10Wut0CuuuMI++ugjW7VqlX3++ec2btw412UPFAXPIADutWAgjwOQn5yQ+qcziBaXV/BcuXKlNW3a1Dp06BA1490ze/Zsmzx5suta1/qfBY01jaQqq2bb63fFTmgyH0MsYSe5Qml2TEJJ/t3p/EKQqc/1dH7MkV0BNDSweP8OY6NFvu+byEoZVQEVPcFPO+20AttpvGdeYz4BAACQPBk1BhQAAADpL+MqoACAzJITsOEMQet+B1KBCigAAAB8RQAFMkQ6VYCA4sBycUDmIoACyOiZ5gCA9MMYUABA4CXjAxS9CkDyEEABAEVGBf2vx4EJSEBC6IIHAACArwigQAYpapchkz4AAH4ggAIAAMBXjAEFkFKMHUSmYPwnkDgqoAAAAPAVARTIMCwdAwBIdwRQALnQLQ4ASCYCKAAAAHxFAAUAIMsnIAX9/iN4mAWfRWP9cjJsvUoAABBMBFAAwC7LyZJ9Y3IfULzogs8ivIBmj6Iea54rAHhdQDIRQAEAAOAruuABhFH5zD6Z3IXu6+OU1yQeJvcAcVEBBQAAgK+ogAIZXM0sTHWL6icAD5VxJBsVUAAAAPiKAIqU4NN1eqH6CQDwEwEUAAAAviKAAgAAwFcEUCDL0f0OAPAbARTIYIRL8BwBkI4IoEAWI6ACAFKBdUCzTLzAwYx0AEBO5FmbOIMTkowAimKtguWk6SLriP8YAgCQCgRQFCtCTfoeEwI7ACBdMAYUyEJ8UAAApBIVUABIIsI+AORGBRTIMgQiAECqEUABAADgKwIoAAAAfMUYUCBL0PXO4wb//2ZYfQKIjwCawXjhA5DMoMVrTAGPD4u5A3kigAJAASGL6nF8nBAic/GcR7IxBhQAAAC+IoACAADAV4Hrgp8/f7699tprVqNGDbv00kvjtvnyyy9t4sSJVq5cOevatas1bdp0l9oASD66cYH0HL8aYgwrkigwFdDt27dbp06drHPnzjZq1Ch75pln4rYbPHiwdezY0RYtWmRffPGFtW7d2t5///1CtwEAYFcxAQnIX04oFArEWOMdO3a4iuUxxxxjffv2tSlTpti0adOi2vz444/WvHlze+GFF6xHjx5u25VXXmlvvfWWu65EiRIJtSnI2rVrrWrVqrZmzRqrUqVK9JU56TMvNH3uSTCF0uwxD8QfaoY+VzP5sc/0Y5eq454JAbRIFdCYaJHv+yayUmAqoCVLlnQV0Jx8Ap5CZIUKFey0004Lb7vwwgvt559/DofVRNoAAAAgeQITQBMxd+5c23333a106dLhbXvttVf4ukTbxNqyZYv79BZ5AQAAQMAmIW3cuNEGDRqUb5tWrVpZr169Er7NDRs25CrtV6pUyVVPdV2ibWJpzOjtt9+e8P0AAABAGlZA1ZWuGej5XSKrlIlQkNT4kkjr1q1z40d1XaJtYg0YMMD9jHdZvHhxofcXAAAAKa6Ali9f3m655ZZivc2WLVva888/b1u3brUyZcq4bfPmzQtfl2ibWGXLlnUXAOmFyUFIR5kwAQlItowaA3ryySfb5s2b3Tqhnqefftr22GMPO+CAAxJuA8D/ILkrFyCZz0kAyROoheiHDRtmy5cvt88//9x+/fXXcAX11ltvddVMTS7SeM1LLrnEJkyYYKtWrbLx48e7me/e8kqJtAEApDaoFXZ5JwIjECyBCqDqBtfY0C5dukRtj1yaqX///m6R+UmTJrn2jz76qDVq1CiqfSJtAACpwxmygMwWmIXo0wkL0WcHFqIHUqswVdB0eiPLlDGgLESPZApUBRQAkD3SKVRmW/gEko1BjwAAAPAVARQAAAC+IoACAADAVwRQAAAA+IpJSECSJzywnAwAANEIoFkSqAq7qDOK/pgDyC7MgAcSRwDNEgQjAACQLhgDCgAAAF8RQAEAAOArAigAAAB8RQAFAACArwigAAAUETPggcJhFjzgA1YhAADgb1RAAQAA4CsCKAAAAHxFAAUAAICvCKAAAADwFQEUAIAiYAY8UHgEUAAAAPiKAAoAAABfEUABAADgKwIoAAAAfEUABQBgFzEBCdg1BFAAAAD4igAKAAAAXxFAAQAA4CsCKAAAAHxFAAUAAICvSvn76wCg8HLy2B7iwUQKMQMe2HUEUAAAst3AxD/4JYIPhygIXfAAAADwFQEUAAAAviKAAgAAwFcEUAAACokJSEDREEABAADgKwIoAAAAfEUABQAAgK8IoAAAAPAVARQAAAC+IoACAADAV5yKEwCABLH8ElA8CKDFLPbcuZwPF0iuopyvOtn4+weADAmgS5YssTfeeMOqVatm5513XtR127ZtswceeCDXz3Tu3Nnatm0btW3WrFk2adIkK1eunLu+fv36Sb/vAAAACNAY0B07dtipp55qhx12mD311FM2bNiwXG22bNliAwYMsO+//95Wr14dvmzdujWq3dChQ+2ggw6yL7/80t58801r3ry5TZ482ce9AZDp1U/4+zzI6wIgPQWmAhoKhezcc8+1UaNG2bXXXmtTpkzJs+1ll11m7du3j3vd4sWL7frrr3ch1qugXnTRRdanTx+bP3++5eQU70tWXrdG1xwAFP9ra37teN0F0kdgKqClSpVyFVD9X5B33nnHVTnHjRtnmzdvjrpu7NixVqZMGevZs2d42yWXXGILFy60r776Kin3Hci0qlKyL0BBz8ldfU4XBROQgCwMoIkqW7aszZw50+bMmWP9+vWzNm3auK89s2fPtiZNmrgQ6mnRokX4unjUtb927dqoC1KP8JK5j2M63Rekh+J6HvCcArK8C37Tpk2uSpkfjc087bTTEr5NhcpvvvnGWrZs6b7X2M9OnTpZ79697dNPP3Xb1q9fb1WrVo36ucqVK1vJkiXddfEMHjzYbr/9dsukF+RQGtwPusMAJPM1pqDb5DUIyMIKqMZ0Rk4UinfZsGFDoW5TAdQLn973F198sX3xxRe2ceNGt61ixYq5KpgKnprkpOvi0cSmNWvWhC8aRwoAAICAVUArVKhgQ4YMSfrvUWVz586dLoDqd6qq+uKLL9r27dvD40kXLFjg/td1eXXr6wIA8BdDMIDMlFFjQDXWU+M1PQqeI0aMsFatWlnNmjXdtpNPPtlVVseMGRNu9+yzz1rDhg2tXbt2FiR0HyUXE2aAzA6fhFsgdQKzDJM888wztnLlSps2bZotW7YsXEHt37+/lS5d2q3/efrpp9sRRxzhFqr/4IMPbOnSpW7hek/Tpk3ttttuswsvvNA+/vhjW7Vqlb3++us2evRoK1Eio/J4Vk8yAIDixAx4oHjlhDQYMyAefvhhFzxj3XHHHeFZ7b/++qtbfklBVWFTFc94Yzs1KWnixImua13LO+21114J3w+NIdVEJo0HrVKlStR1ia4jWlwPepDDViiD9iVR6fjHlg2Pe6qk4/EOipw0O055BlBtz+u6ICnmfYiNFvm9byI7BSqApgsCaPEggKYHAmjyZPuLa04RHodUPC9DhQ2giW4LAgIofBaoLngAQPpiGE1MkAtqGAV8QAAFACQ1dGbtmpuEUSBPzLoBABRaNp1RKOHu9/xQDQWiEEABAIWyK8EzW8IqgMTQBV/M/J7TlUndWpm0L0HC4450e86k23My7v25zTJLpu0P0h4VUAAAAPiKAAoAAABfEUABAADgKwIoAAAAfMUkpCJMNNIZkQAAQP6890tOvggPAXQXrFu3zv3fqFGjXflxAACy9v1T54QHOBf8Lti5c6f9+uuvVrlyZcvJyUnpJ0qF4MWLF1uVKlUsk7BvwcRxCyaOWzAF6bip8qnwWb9+fStRgtF/oAK6S/TH07Bhw7R5/uiFJ91ffHYV+xZMHLdg4rgFU1COG5VPROJjCAAAAHxFAAUAAICvCKABVrZsWbvtttvc/5mGfQsmjlswcdyCKZOPGzIfk5AAAADgKyqgAAAA8BUBFAAAAL4igAIAAMBXnAkpALSA75tvvmljxoxxC+A3a9bMrrzySmvdunVUuz/++MMGDx5sU6dOterVq1ufPn3sxBNPLHQbv/3+++82YsQIt4+HHnqo3XPPPVHXL1q0yHr06JHr54YNG2bt2rULf79mzRobMmSIffHFF269uQsuuMC6du1qqaTHe+TIkTZ69Gj7xz/+YQ899FCuNlqc+d5777VPP/3Undzg3HPPtW7duhW6Tao98MADNmrUqKhtTZo0sVdeeSVq25QpU+zRRx+1ZcuWWZs2bWzAgAHWoEEDS1ebN2+2Bx980CZMmGDlypVzz0U9/kHz5JNP2rPPPhu1bbfddrN33nknatu0adPs4Ycfdoubt2zZ0m688UbbY489LJ1s2rTJXn31VXvxxRetUqVK7rUx1vbt291rxLvvvmslS5Z0rwWXXHJJ1CLoibTx25YtW9zf0fPPP2+lSpXKdXykU6dO4TPyef75z3/a+eefH/5+x44dNnz4cBs3bpz7/qSTTrLLLrvM7SeQDgigAXDttdfaTz/9ZKeccoo7i8Qbb7xhBxxwgH388cd28MEHuzbbtm2zo48+2ipUqODeML7//nv3YvrSSy/ZGWeckXAbv+lNrn379u5NXUF77ty5cd9svvzyS3vrrbesVq1a4e0tWrSIerE99thj3dc333yzzZ8/304//XT3hnv22WdbKqxYscL2339/dz/0RjJ79uxcbbTP+gCwYcMGN5tVYbtXr1722GOPuQ8HibZJBz/++KObjRv5AaJ8+fJRbT755BPr2LGje04rxCmIHnbYYfbtt9+m7SLVZ555pjt2d999t/tAcfnll7sPgvobChL9rW3dutWFEk+ZMmWi2nz99dd2+OGHuxB21lln2TPPPGOHHHKIOz516tSxdNG2bVv3YVWvB5999lncNtqHDz/80O677z633/369bOFCxfa/fffX6g2ftNr+3777eceb923eFRAuOGGG6xDhw7hbbGnhr7qqqvcB1/ti87Y17dvX/f6qr85IC2EkPbWrVuXa9shhxwSOuecc8LfP/fcc6FSpUqFVqxYEd52+eWXh5o1a1aoNn7bsmVLaNOmTe7rbt26hbp27ZqrzezZs0N6qi5evDjP23nttddCJUqUCC1ZsiS8rX///qFGjRqFdu7cGUqFrVu3hjZu3Oi+Puuss0LHHXdcrjZvvfWW27cffvghvO3mm28O1alTJ7R9+/aE26QDPZfiHb9IRxxxhDvOHh37atWqhYYMGRJKR5999pl77KdOnRre9tBDD4UqVqwYWr9+fShI9Jw58sgj821z8sknhzp27Bj+ftu2baGGDRuGbrzxxlA6Wb16tfv/zjvvDO2+++65rp83b547bu+991542/PPP+9e/5YtW5Zwm1Tu23333ef+xuOpWrVqaNSoUXnexk8//eReD8eMGRPepvba9vPPPyfhXgOFxxjQAFAXU7xt+sTuUfegKomRFUJVNxcsWOAqZom28ZsqMOrWTMSFF17oqmfqRoqtJmrfVDmI7MrVvqnqM2/ePEuF0qVL56oAxtL9Vjd0ZBen7vfy5ctt1qxZCbdJF9OnT3dV9lNPPdV1yas7MbIrW0MIunTpEt6mY6/K9fjx4y0d6bGvW7euHXjggVGPvarRGuoRNHPmzLFjjjnGTj75ZBs0aJBt3LgxfJ0q7RMnTow6Pqrcq/qebsenoGq5N1xC+xp53NTlPnny5ITbpEKiPQGqbB511FF23nnn5aqUTpo0yQ0jOP7448Pb1AWvSqiOMZAOCKABpDc+vXiqS96jAKnu+Uje9164TKRNulKo0ZhOdd2qS37fffd1QxA8Qd23TDpuCtsa7qCuab2RP/HEE3bkkUe6N3T55Zdf3FCJePuSTvsRKd5j733ISdf7nN+HPXWr629IQ1409Oaggw5yHwxk1apVtn79+kAdn7zo/tauXdsFaI/GTuuDe+TfVUFt0pXG5ur1UMONGjdu7D5QRI4v1/2vUaNG1Id7fa1x/+m+b8gejAFNge+++8569+6dbxu9UWiiUSyNBdXkE41L08Wj8Z2xZ8Pwqm+6LtE2RaWxl+ecc06+bTTetH///gnfZtOmTV0FRp/e5YQTTnBj8a6//vpwFUr3X28eydy3vCZDRVLw0qSaRKXLcYtHk9XGjh2bbxtNBNl9993d13fddVfU/VT4bN68uZuEpGDq3dd4+5LM/SiKeI+9KtuqLqXrfc6LxgxG7ot6EzSh8d///rddccUVgTw+hTlusfuSSJt09d///jd83zUhqWLFinbTTTfZpZde6oJmkPcN2YMAmgJ6w9Ys0/zEViHk559/dpVATTzSzOpI+rSrCkbs7HJvpmuibYpK1aGC9k1dmoURO1FC1G123XXXhb/3Y980KaCgfVNFpTB0v3/44YcCj1tBbZJBYTtykkM8kRNTYt/wNGRgzz33dBNYFEC1HxLvOCVzP4oi3vNq9erVtnPnzrS9z3mJPT76O9TQDh0fqVatmgvWQTo+hTluGmKgbfm9Hsa2Ccqx1OuhPvhqkpF6h+LtW1CPJTIXATQF1MWjsZiFobGMCgP77LOPqzpFdhuJxj9qmRW9gHqVQs0c1ydeb7Z4Im2KSjPsC7tvu0JL+OhTv0f7pjFR6u71Hhvtm6pVsctV7SpVFop733S/tfyUxkp6byq631oqRTN9E22TDKo867Kr1N2+cuXK8HFSONcHFM3gjRw+on2JXE4rneix1zI9qrir+9K7v6IVDoJOf0fec1rP77333tsdn8jlfLS/QdtXHTeFLa3M4I2d1vhkPSe9fUmkTZCOo3h/a9o3jVPWWHkdU9F4cY35Ddq+IYPtwsQl+Ewzu/fcc8/QKaec4mZWx7NgwYJQ6dKlQ48//rj7ftWqVaHmzZuHevfuXag2qZTXLPgXXnghNGfOnPD306dPdzOnNevao5md5cqVczOUZc2aNaHWrVu72efpIK9Z8EuXLnUzqgcPHhxe8WC//faLmimeSJtU02z8QYMGhTZv3hz+/vrrr3czimfOnBlud+utt4bq1q0bnon75ptvhnJyctxs83S0du3aUM2aNd2KCt6qDZpJXtBs8nSk47Nhwwb3tVaGuOuuu3I99g8++GCoevXqoblz57rvJ0yY4GZOR84UTyd5zYLXcWrSpEno/PPPd9/v2LHDvba0bds2vCpGIm1SKa9Z8JMmTQqNHz8+/P0vv/ziXg8OPPDA8Db9/em1vWfPnm5fdOnevbvblk4rZyC7EUADQC8i+qxwwAEHhA4++ODwxXvh9LzyyiuhKlWqhJo2bRqqUKFCqFOnTi6IFbaN34455hi3PzVq1HBvfvpa2zx6g9S+N27c2L2Ali1bNnTVVVeFl2/yvPHGGy6Y7rHHHqFKlSqFjjrqKBeyU+nEE090+6MQo6VT9LWWIor09ttvu33Xm2HlypVDhx12WGjlypWFbpNqt912m9vPNm3ahHbbbTf3HBs3blxUG73pn3nmme7Dwl577RUqX7586JFHHgmls//+97+hevXqueWI9PzUm/2iRYtCQXPvvfeGateuHWrVqpX7X/uj5csiKZzoA6n+xry/tbvvvjuUbi699FL3t6R9KFOmTPg18ddff436oKq/F33gqVWrVqhFixZuSbdIibTx2zXXXOP2Ra93Khh4+6allUTPvZNOOsndX33I1jHq0qVLrmXqZsyY4ZbYU4jV8dbX2gakixz9k+oqLAqe2OON+YvtytcYrkiaIa5xQOou9CaHxEqkjZ905hVvprRH3eiRS994s6jXrl3rusvyWrpJM3q11IyWMkmHs7d89dVXUctlicbZafZxJHWv635rIlVe3d6JtEk1TXDQslcaT6hxzN5Qj1hayF3LSGkSTOzksXSk56e6MzUEQhOrgkr7odcTvXY0bNgwz+OjY6NjpL8hHct0o5No6LUglrqXI8dHaqyujpv+5jRzPN7+JtLGT/ob1zjjWFqcPvJ1T8NClixZ4l7Dq1SpEve2tG+6PdG+pfIMT0AsAigAAAB8xcchAAAA+IoACgAAAF8RQAEAAOArAigAAAB8RQAFAACArwigAAAA8BUBFAAAAL4igAIItE8++cQ++uijXNsXLVpkr7zyijsnNgAgvRBAAQSazvZywgkn2OTJk6POyHTqqafa2LFjrWLFiim9fwCA3DgTEoDA69u3rwubM2bMcKeZvPHGG+2ll15y36fjqSQBINsRQAEE3ubNm915wI844gg766yzrGPHjvbhhx9ahw4dUn3XAABxEEABZIT//e9/dthhh7mK5/nnn2/33Xdfqu8SACAPBFAAGUMV0M8++8yWLFlidevWTfXdAQDkgUlIADKCZryrCtqsWTPr379/qu8OACAfVEABBN7ixYttn332sdtuu82OPvpoa9eunZuE1K1bt1TfNQBAHARQAIEWCoXcpKOSJUu6iUc5OTk2aNAge/jhh23WrFlWu3btVN9FAEAMAiiAQNNkoyFDhtjMmTOtfv36btuOHTvs0EMPtQYNGtjo0aNTfRcBADEYAwogsNavX++qnM8991w4fIqqoSNHjrQyZcrY7NmzU3ofAQC5UQEFAACAr6iAAgAAwFcEUAAAAPiKAAoAAABfEUABAADgKwIoAAAAfEUABQAAgK8IoAAAAPAVARQAAAC+IoACAADAVwRQAAAA+IoACgAAAF8RQAEAAGB++n9c7/0exKkkwQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a bandwidth part\n", "bwp = BandwidthPart(numRbs=24, spacing=30)\n", "\n", "# Select a UE position\n", "uePosition = [-200,75] # Try other points such as [120,60] or [125,125]\n", "\n", "# Create a channel model between the base station and the specified UE\n", "bearingAngle = 180\n", "channel = dmData.channelForPoints(uePosition, bwp,\n", " txAntenna = AntennaPanel([1,4], polarization='x'),# 8 TX antennas\n", " txOrientation = [bearingAngle,0,0], \n", " rxAntenna = AntennaPanel([1,1], polarization='x', # 2 RX antennas\n", " beamWidth=[65,360]), # Omnidirectional\n", " normalizeGains=False) # Do not normalize gains\n", "# channel.print() # Uncomment to print the channel information\n", "\n", "# Draw the map to show the base station and the UE\n", "ax = dmData.drawMap(\"LOS-NLOS\") # Draw the scenario map\n", "dmData.drawBsPanel(ax, bearingAngle) # Draw the base station antenna panel\n", "ax.scatter(x=[uePosition[0]], y=[uePosition[1]], c=\"cyan\") # Draw the UE position\n", "ax.annotate(\"UE\", uePosition, textcoords=\"offset points\", # Annotate the UE position\n", " xytext=(0,-13), ha='center', color=\"cyan\");\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "ab74d9ae-ccc1-4018-bad6-7ab0a100acee", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "CSI Report Manager Properties:\n", " upDelay: 0\n", " Num Reports: 1\n", " CSI Report 11:\n", " reportId: 11\n", " reportType: periodic\n", " period: 5\n", " offset: 0\n", " quantity: Cri\n", "\n" ] } ], "source": [ "# Create a beam-sweeping CSI-RS configuration\n", "# For this beam-sweeping experiment, we use:\n", "# - 8 beams for sweeping\n", "# - 8 CSI-RS objects with resource IDs 1 to 8\n", "# - CSI-RS resources at symbol 4 and resource elements 2 to 9\n", "# - One NZP CSI-RS resource set containing all 8 sweeping resources\n", "numSweep = 8\n", "sweepResources = []\n", "for i in range(numSweep):\n", " sweepResources += [ CsiRs(resourceId=i+1, numPorts=1, symbols=[4],\n", " freqMap=\"\".join([str(int(x)) for x in np.eye(12)[i+2]])[::-1]) ] # REs 2 to 9\n", "\n", "sweepSet = CsiRsSet(\"NZP\", bwp, resourceType=\"periodic\", rsId=1, period=20*(bwp.u+1), csiRsList=sweepResources)\n", "sweepConfig = CsiRsConfig([sweepSet])\n", "# sweepConfig.print() # Uncomment to print the CSI-RS configuration\n", "\n", "# Create a CSI report object for CRI reporting\n", "sweepReport = CsiReport(sweepSet, reportId=sweepSet.rsId+10, quantity=\"Cri\")\n", "# Create a CSI report manager (upDelay=0 means no uplink delay and the report becomes available immediately)\n", "sweepReportMan = CsiReportMan([sweepReport], upDelay=0)\n", "sweepReportMan.print()\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "bdeb8d75-178e-4a00-a894-0e88d454c095", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Beam information:\n", " Beam Theta Phi Pol\n", " ---- ----- ----- ---\n", " 0 90.0 -60.0 x\n", " 1 90.0 -38.2 x\n", " 2 90.0 -21.8 x\n", " 3 90.0 -7.1 x\n", " 4 90.0 7.1 x\n", " 5 90.0 21.8 x\n", " 6 90.0 38.2 x\n", " 7 90.0 60.0 x\n", "\n", "Resource elements in 'txGrid':\n", " GridSize: 32256\n", " UNASSIGNED: 30720\n", " CSIRS_NZP(1): 192\n", " CSIRS_NZP(2): 192\n", " CSIRS_NZP(3): 192\n", " CSIRS_NZP(4): 192\n", " CSIRS_NZP(5): 192\n", " CSIRS_NZP(6): 192\n", " CSIRS_NZP(7): 192\n", " CSIRS_NZP(8): 192\n", "\n", "CRI Info:\n", " CRI: 5\n", " Best beam index: 4\n", " Best beam: 𝛳=90.00°, 𝝋=7.11°\n", " RSRP: -60.84 dB\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApUAAAJjCAYAAABdmuqjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZ/xJREFUeJzt3Qd0VNXWwPEdWpAWpAgJBGkWwEaTpoAiBkRB7AqogIWin72g74kFRQUBu1gQBVTgASqixmdFsaAUQaqNZoIQSgICIcB8a5/17qzJZCbtZjL3ZP6/ta7BmTsz59x7Z2bPPi3O5/P5BAAAAHChnJsHAwAAAASVAAAAKBFkKgEAAOAaQSUAAABcI6gEAACAawSVAAAAcI2gEgAAAK4RVAIAAMC1Cu6fAoiMRx55RNatWyeXXnqp9OvXj8PsIatWrZJ58+bJxo0b5cCBA6JrKIwbN04SExOjXTSUMdddd525xm677TZp27ZtkR9/5513ytatW83zdO/eXWyvD+Blcayog0jbuXOnfPjhh7JixQrZsWOHVK5c2QQfycnJ5kP+2GOPDfm4M844QxYtWmSCy3/9618lVp7777/fBENXXXWVnHfeecV+nmeeeUYWL17s//9JkyZJnTp18n3Mv//9b/nzzz/9/z99+nSxzbPPPiu33nqrHDlyJNfta9askRNPPDFq5ULZVK1aNfnnn3/Mj5gLL7ywyI9v3ry5/P777/LKK6+YgM72+hTGd999Jx9//LH89ddf5vVOPfVUueiiiyQhISEirwc4yFQiYg4fPiwPPPCAPPXUU5KdnR12vxNOOEHmzJkjrVq1KpWzsWDBAvn555/ltNNOcxVULly40JTb0aZNG7n99tvD7q/B5KOPPmqyerYGldu3b5e77rrLBJQ9e/Y0X4o1atQw9yUlJUW7eEBM0x/tAwcONAFlMH3fvvbaa7T6IKIIKhExN954o/kQUw0bNpTLLrvMZCWPOuooSUtLk02bNsmXX35pmrg1WLGVBlVZWVkmE5JfUPnqq6+agNLZ30bffPON+YFQpUoVef/9903WGUD05eTkyAUXXGCylOXLl5drrrlGOnbsKBkZGeZzWLO12pUoNTVVzjrrrGgXF2UUQSUiYuXKlf6AcujQoTJ58mTzQRfK+vXrpVatWtaeCf3g/vXXX2Xt2rUm6NJm+2CHDh2S119/3fxbm91feuklsZF+Qan69esTUAIeop8pGlCqWbNmmeZux0033SRdu3aV5cuXy/Dhw+WXX36RChX4+kfJ46pCRGjTsOPxxx8PG1Cq448/vtivs3fvXvnggw/kxx9/lF27dknNmjWlXbt25hd79erVc+2r/TrfeustkyFVb7/9tvmQDf5g1j5IRREXF2f6amlfTc1WhgoqtYzp6enSvn1707+pIPv375fPPvvMfPhv2bLFZAc1kNPn1mbncuXK5TsoYciQIXL22WebPqmamdDMsNarS5cupvmrUqVKRaqjHivtNqDBs9q2bZtpZnP06dNHrrzyymKfm3Dl/+mnn0xTnh4D7Yc2fvx4qVevXoHlLerz6LnRsuoAJM0i161b13wJ9+rVK+y1q10AvvjiC3Ota981PaYNGjQw/Ur1eOSXxdXy6HnRa1Gvn8aNG5uuGKecckq+x79169Zyxx13hNzn+++/l+eee84cZ/0b6PPPP5cpU6aYa0jrrv2cNdOs3UD039q3efDgwf79NaOurQhaN712KlasaFoZunXrJqeffnrYeukx0dfSx+kx1WOix0MDHD02bmm59Pn1vfH333+bumrZ9XiHe08Uhl6fejz08yAzM1Nq164tHTp0MM+rLSsFlak4xyqcH374wZw/fV59r2p2sbB9nVXfvn1zBZRK32/aB1yvaW0Z0mtP6waUOB2oA5S08ePHa8dBs23durVYz9GlSxfz+EceeSTk/fPmzfMdc8wx/tcJ3OrUqeObNWtWrv3HjRsXct/Abfv27YUu38UXX2wek5KS4ktLS/NVqFDBd9RRR/l27dqVZ9/zzjvP7Pvyyy/7XnzxRf/rhfLEE0/4qlSpEraMrVq18q1evTrkY5s1a2b2eeqpp3znn39+yMe3bNnS99tvv/mK4o477sj3uOn9bs5NcPknTJjgu+iii/I8dt26dYUqb2Gf5/Dhw77777/fFx8fH7KsJ510UsjX3LJli69du3Zhj0dCQoJvwYIFeR63c+fOsOdFt8svv9y3Z8+esMe/T58+Yev89ttvm33q1auX5z7nmtPjMnv2bF/NmjVzve7111/v3/f7778311i4MrZp0ybk6y9evNhcW6Eeo8f3ySef9BVH1apVzXO89tprvjPPPDPk83fo0CHs54xzLbzyyish758yZYo5X6Get2HDhr7//ve/YctWnGPl1Eff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5kjVqlVD7qvviRdffFF++OEHKV++vKmTvvcrVaok0bR69WrzPazlatq0qTz//PMlsm9JI1MZQZmZmdKxY0d56aWXpE+fPnLBBReYD73OnTubmeltcPnll5tyHzhwQNasWWPd+qsPPfSQnHjiifLjjz+aevTo0UPee+8980b78ssvxQb6AXfFFVeYlZ4uueQSOfvss+W///2vNGvWzHw42ubjjz+WRx99VFJTU2XZsmVii6+//lp27dolt956a65Nz4kt9Mv19NNPl6eeesp8Nl199dVy+PBh6dChg9jgyiuvzHP8b7rpJvnqq6/Me7xevXridW+++aa0aNFCVq5cKf3795fzzz/fXFsaWM6fP19soMG9fp7WqFFDBg0aJFWqVDGfS0888YR4zeOPP25+OGmgpd+7+rmTk5MTct+MjAxp166dTJs2zZybXr16yYQJE6Rbt24mQRQtffr0kUsvvdT8e/ny5bJo0aIS2TcidO1vRMbtt9/uq1Spkm/Dhg3+2/Tfettdd91lxWHfuHGj/9+nnnqqr1mzZj6b3Hbbbb5Zs2bluu3AgQO+448/3tekSROfDbZv357ntuzsbFP+Y4891meTHTt2+JKSknwPPPCATz9+Lr74Yp8tTjjhBF+fPn18NuvWrZuvXbt2vv379+e6fefOnT5bzZs3z1xLt956q88GDRo0MJ8/hw4dyvWZlJiY6DvttNN8XvfFF1+Y4/3QQw/lul3f0+XLl/f98ssvPi/ZsmWL7/Dhw+bfQ4cONWXftWtXyH1vuOEGX9WqVX3p6en+29auXesrV65cnvpG63u4WbNm5ru4JPaNBDKVEVxL/I033pBzzjknV5OG/vvcc881TR+6j9c1atRIbPbII4/4f7U54uPjTZPGn3/+aTI3XlenTp08t2lTTPPmzWXnzp1ikxEjRphmVluavMsSbe7WjN7o0aOlcuXKue6zoek7nNdee8381SZKG2i2rHHjxqZpNfAzqWHDhla0YC1YsMD81daTQNr8rVlv53x4RYMGDfJdq9qhzeJvvfWWyfRpNy/HCSecYL4votntq1ERvoej/Z1NUBkhf/zxh+zYsUNat26d5z69bfv27SaoQWSF6zfj9K+sXr26ladAmzW0T6J+kNtCP7C1b+urr74a9f5JxaXXzWWXXSb9+vUzTa96DmzhBAP6JfnAAw/IhRdeaK6fV155RQ4ePCg2Sk9PN337tK+69pW2gTYXa5PkL7/84r/tu+++k59//lkGDhwoNnTrCvVDxPn/77//Xmyk3bu0P2W47+yNGzdakYSINoLKCPnrr7/M32OOOSbPfU6/n7S0tEi9PPKhHbb1Q1wzmNoXyBajRo0yfXzatm1r+uX+61//KtUO2G7fD9r37eabbzZ9+Wyk/ce0H5kGYxpU6iALDWbuvfdesWWwl/6Q0mtHf/RqQHnSSSfJbbfdZvrDab9p22hrkGbHdOCdLZ555hmTLdbzoO8F7eOakpJi+u49+OCD4nXaH11pH8XgH1yB33224Tu7ZDD6O0KcjsA6UjeYfrArW7MDNtMPvuuuu04SExNl4sSJYpOLL77YNMPoh592JNcO6Jqd6du3r3iZznowePBgSUhIMAN0bKWDo7QODh19r6OmdXCCdmnRwMzLdKCBfi6dddZZMn36dP/tOkBEs6/PPfec3HnnnWITbZKsWbNmni4uXqYDRcaOHWveyzrwSINifT9rV51TTz1VzjjjDPEyzaaOGTPG/KjV7Lf+2MrKyjL/r8INgvE6vrNLBpnKCHGaVf/5558892mKXembEaVHM0v65a9BvU4tESqL7GU6KrF3794mKP7iiy/ktNNOM01pu3fvFi/T5lUNyHTmg3DdEWwQGFA6NMundEYBr3M+b4L7wumPFe3Tp8GOTXTEtGZf9T1gyxRtGnxphliDxw8++EAGDBhgRuDrsde+cDrbhteTDdr3U0epb9q0SZo0aWKCYP2r/US1a0WoPuA24Du7ZBBURoj++lcbNmzIc5/Tl9LZB5Gn/WGcJr5PP/3UNPvZTDuea4ZSv6R0ahIvW7p0qelmoM172nzvbOqbb74x/3733XfFRnXr1s3Vz8zL9As/VF84vZacbJNNnAEhNjV9r1ixwvwIPO+88/KcA/3BqF2iNFD2Os12axcKHfylc87+9NNPZqok7eOqP35tdPzxx+f7na0Dq5ymf4RH83eE6MTa2vft888/z3OfvhF1XjhttkHk6Qe1zk+pGWI99polKAv0A1x5PTOgc9ppP8Rgmp3RH1Y64EXn7bPR4sWLc30heZkGLdplQvvCaVDg2LZtmxk4qP36bKGjpLVvtPZJtOkHopOpDzVrgw7sDNzH6zTI0tYSx/vvv29+mFx77bViI11IQuc0Dv7O1lla9Lbu3bubjD4KUKoTGMWYuXPnmjmxXnrpJf9tkydPNre9//77PtvYOE/ltm3bfCeeeKKvVq1avqVLl/psNHHiRFOPQJ999pmZT6179+4+W9k0T+WiRYvyvGfXrVtn5husXbu2b+vWrT4bnHXWWb7GjRv7Nm3aZP4/JyfHN3DgQF+FChV8ixcv9tni5ZdfNtfPlClTfDbR+RL180ivmTVr1vhv18+matWq+Tp27OizwSuvvOLbu3ev//9XrFjha9iwoW/IkCE+Lytonso333zT3D99+nT/bU899ZQvLi7OfOZ6QbMizD0ZjXkqyVRGkM7I//TTT8vtt99u+pM5SwZqh3gdRWoDnf5FMwJKmzu0U7nTdKnzeeloXi+74447ZO3atSYjpqOng73wwgueb9LQ6Xd0lLE2ken8aTpQR/szaSd/vb4Qec7ALu3PqisZ7du3z2T8tKlP3x82rOSidEon7YOomWHN2Gu3EH1P65Ju7du3F5sG6GgfV+2DaBN9D2tfSp0JQY+/bnr8tVlcu7M8++yzYgPtRqTdKXTeZR0Apk32t9xyi1nBzGt0blYdGBU4Ql1XwdJBtNrCoKPxHfre0JYtfZ9PmjTJ9G/Vpm/9HozmQLxnn33WPyWYtlBpltj5Hta6aHmLs28kxGlkGdFXgGl21XkFdZk9/RCpVq2aNUdFg+Bw82lqx3Kvzw2nx33r1q1h79dgzYa5KrUJRs+DBgFaXg0KbLqOwi3XqEFyYBOa12nfSf2Rol+qOvm8TqxsI72O9Eei9qXUtcudGSlsoF9ZOtCudu3a1vbfUzrnob6n9XtBf6h4vRtLMP1hpcGwll+vIa8OltLPf/0eCEV/mHTq1CnP7dqMr/OGOk380Z56bvXq1SaREIoOknL6Sxd130ggqAQAAIBrjP4GAACAawSVAAAAcI2gEgAAAK4RVAIAAMA1gkoAAAC4RlAJAAAA1wgqAQAA4BpBJQAAAFxjmUYAZUZ2drYsXrzYrBijq2A0btxYTj75ZNcrxugqFd9++62kpKRIcnKy2OrTTz+VDRs2yNChQ81KKABQkshUAigTpk6dapZN7Nq1q1nD9+KLL5a2bdtKUlKSWWtZ11gurs8//1yuv/56s3SbzZ577jlTDzfHAgDCIVMJwHpz586VwYMHm38fe+yx0qZNG6lUqZJZ31rXJ37++edl/PjxZi3fWNazZ0+zxnS5cuQTAJQ8gkoA1nvmmWfM3/vuu08eeeSRXEHTrl275O2335YKFfi4GzlyZBTPEoCyjk9ZANbbsmWL+XvXXXflycIdffTRMmLEiFy3/fjjj6Yp+6KLLpJatWqFvE+bz/Wxoeg+69atk7p165rm9qOOOirkfj6fz2RK165da4Ja7d95/PHH59lv69atsnLlSklPTzfP2aFDhzzlCtW3c/ny5ea2xMREOeuss+SDDz6QHTt2yDXXXCMHDx6Ur776yhybs88+22Rw8+tTuXfvXvPcWpaaNWtK586dTVYzWEGv4QTyP/30k2zbtk3q169v6n3MMceEPEYAyhAfAFguJSXFpx9nX375ZaH2v+eee8z+y5YtC3vfypUr/bc9++yz5rYZM2b4evToYf7tbElJSb6vv/46z/N89913vpYtW+baV7fevXv7srKyzD5//fWXr2/fvr7y5cvn2qdSpUq+Bx98MM9zOuV46623/HXW7bLLLjP3d+nSxVe1alXz2omJif77586da+7v16+f+f+cnJxczzt+/Hhf9erVc5UhPj7e98gjj+QpQ0Gv8dBDD/mOOuqoPPUZOXJkoc4NAHuRqQRgvXvuuUc++eQTk8G75JJLpFu3bqZf5SmnnOJ65Heg+++/32QTtW+iZvN++OEH2bRpk1xwwQWyatUqMyhIaaazR48esm/fPqlXr54ZMFS1alVz+0cffWQyfdWrVzd9Pt9//31p2rSptGzZ0mRGt2/fbjKGDz74oLRq1crUJ5g282s5zjnnHGnUqJG0b9/ef19OTo7Jsmomsn///ibj6WQQQ3niiSfk3nvvNf1N9bhpBjQjI0O++OIL+fe//22ylcOGDcv1mHCvoRnc0aNHm+fSDK7epvXRjOr06dPNQCEAZRdBJQDradOvBpUa0MyYMcNsSqcV6tevnzz88MPSvHlz16+TlZVlAqQTTzzRP4XR1VdfLbNmzTIB02OPPeYPPjWg1GbmZ599Nlfz+Icffig1atQw/9bR6qmpqSZ4XLJkiezcuVMOHTok3bt3l1GjRpnnDRVU7tmzxzSrh2pK1yZpDTK1H2m4ZnmHNlPrsWnYsKF89tlnuZ5Pp2Xq0qWLPProo3mCynCvMXv2bPP36aefztV/U4NQ5z4AZRdBJYAyQbN2umk/Ps2YaZC2YMECE/joX80S6ryVbtxyyy3+gFLFx8ebAEqDvy+//NLcptP1aN9F7Rv5wgsvmFHogc477zz/v7WfoWYJNeDS/pfB0tLSwpYjVEDpGDduXIEBpdL+kBr8alZVs6OLFi0yt2tZdNNA3OkzqYFnQa/RqVMnqVatmnkezd5qFlVptviqq64qsDwA7EZQCaBM0UCtT58+ZnvggQfMaHD9+9BDD8nrr7/u6rlbtGiR5zYdiOI0W6vMzEyTwdTm7OCAMtgdd9xhAlLNXOrgHH0u5zHTpk0zWctQ9LnD0ccXNivrBK3z5883WziaQQ0MKsO9hu6jwbUeaz1Wely0C4J2S7j22mslISGhUOUCYCeCSgBl2uWXX26CysCJyytXrmz+7t+/v9DZwXD3aaZv9+7d0qRJE/P/mqnTEeja17Ig//nPf0w/TG1S18xmYDP7lClTwj5OM6ThaFawsKvlaL9OpSO9QwXMjuBR8Pm9hvYf1X6iGhD/+uuvZoWjp556SiZOnGgyyIH1BFC2EFQCsJ4GK61btw45F+V7771n/gY21TpLLWrTrjbZBvYjzC9j9+KLL5oVabSvpkMnVdemYmewjGbx9N86iGfy5Mly44035glMNWOnA3e0b6KWJTjQ0sEzoZrDS5r2mdTgUMusfUKdYNuhZdCpjgq7NKUOPNK6aLCq50IDVd00CL7yyitlzpw5efpnAig7CCoBWE9X09H5FbWZVUdS67yNmj1cuHChGcCjLrvsMv/+OspZRyjrwJ7NmzebwOfPP/80zeP5BXMaEOqciwMHDjSjv/X53333XRNADR8+3L+fDtTp27evCaDmzZsnZ555pglqdXDNzJkzZc2aNSao1BHqGtj26tVLevfubTKnOnDn+++/L9FR6+HosdJmaa23NqlfeOGFZsS29gvVAFGPnTbN65yThV3ZSJu+tT+lHlMdOa6ButPtIDAYB1AGRXtOIwBwa/Dgwb6KFSvmmRNSt7i4ON+IESN8hw4dyvWY22+/Pc++5513nu+OO+4IO0/lpEmTfA0aNMj1GJ1j8qWXXspTJn2Mzs8Y/Bo6r+X27dvNPosXL84zP6TW48033/QlJCT4OnTokOc5dZ/58+eHPA7OHJLhhJqn8sCBA75BgwaFPXZDhw4t9GvoXJU1atQI+Vw6P2d2dnbYsgGwH5lKANbT/ocTJkwwWT7tx6cZRW1ybdasmckChhpUov38dLS4jtTWzJz2K9TpezTzqFnOwBVtdMofnR5Ipy7SLKXOuaivo5k4zYCGGjhz0003mRV7NHu3fv16k6nULKe+htPMrM3kutrOW2+9ZTJ6Oqel3q8jzLVJXzOugZxyOKOqg2mG8LTTTivS2t96nN58800z16dOd6Tl0Iyi9hHVY+f0FS3Ma+iclZot1i4Ev/zyixm0pHXQ1XZ0IBKAsi1OI8toFwIAAAB2y71ILgAAAFAMBJUAAABwjaASAAAArhFUAgAAwDWCSgAAALhGUAkAAADXCCoBAADgGpOfF4NOlJyTk+P+6AMA8tAlKnUZTQB2IagsAp0nXtcX1tU2AACRo2ur169fX+Li4jjMgCUIKovACSiPOeYYs4wZH3YAUPI/3vft2yfbtm0z/x+8VCUA7yKoLEKTtxNQ1q5dO7JnBQBimK6TrjSw1M9cmsIBOzBQp5CcPpSaoQQARJbzWUv/dcAeBJVFRJM3AEQen7WAfQgqAQAA4BpBJQAAAFxjoE4J2bRpk2RkZEg01alTRxo1alTkx23fvl2GDx8uffv2lauvvjrP/d9//72MHz9ebrnlFjnzzDPNbddcc438888/cvnll8ull16aa/8NGzbInXfeKYMHD5Y+ffqEfE19PX3d+++/X1q3bh22bD///LPMmzdPNm7cKFWrVpUTTzzRvF69evWKva+WvVmzZvLAAw+EHOH/7rvvmufKysqSunXrSsOGDaV3797SqlWrPM9T1GPgPCYUHQA2efLkkPuWK1dOqlevbkbCtm3bVnr16uUfzOAlNr8PAm3ZssVcBytWrDAjkZOSksz1dMkll0iNGjVK7LoLPMfa3Kv9CE844QS56qqrpHHjxq7fEwUp6jU8adIk+eabbwp83tdff91cr6Hq6JR5wIABkpycXOQyA/AwHwpl//79vtWrV5u/wTZu3OirUqWKTw9nNDctg5alqP7880/z+DvuuCPk/bNnzzb3T5s2zX9bQkKCua1+/fq+PXv25Np/2bJl5r6JEyeGfL4ffvjB3F++fHnfkCFDwpZrxIgRZp8BAwb4Xn75Zd/kyZN9Xbt29VWsWNE3derUYu+rZe/Ro0eu244cOeJ77LHHfPHx8b7u3bv7xo8f75sxY4bvmWee8fXp08cXFxfnu+CCC/I8T1GPgT7m5JNPNsc0eFuwYEG++77++uu+UaNG+Y477jhfzZo1TR29xLwPKleO/vugcuVivQ+c6+Dhhx/2VapUyVwjkyZNMteBXhstW7b0Va1a1ff555+X2HUXfI71emvVqpWvcuXKvtTU1DzlK8rrFUZRr+Hvv/8+5LWr23333Wf217JnZWWFraMeU72G9fPqs88+K9ZnLgBvIlNZAjQzo9mM6dOnS4sWLSQa1qxZIwMHDjRlcZulKawmTZqYbIZmMR988MFCP+6VV14xGTfNij733HMm++FkNRyffvqpvPDCC/Lvf/9bHn74Yf/tN9xwgzz77LOSlpZWrH3DGTNmjMkgaaZQHxfo5ptvlm+//dY8f0kcA50iRTNexd33kUcekdtuu01uvPFGOXLkiAwbNkw88z44cECmi0h03gUia0Rk4IEDxX4f6LEdPXq0vPTSS+b4Brr77rvNNeLMn1gS112oc6xZSs1o3n777fLLL7/4by+p13NzDXfo0MFswfR4a1bTeX8Hv5+D63jFFVfIcccdJ//3f/+Xq44A7EZQWYI0oGzTpo3EilNOOcV8weiXkQY2uvpFQfbu3SvvvPOO+cK87rrrzGPffvvtPIHc8uXLzd8ePXrkeQ4N8rRpujj7hmvq1KDyoosuylMOR+fOnWXu3Lklcgzc0jn7NBD/73//K/fdd58Jzr001ZUGlDa+C/Q6ePTRR6Vfv355AkrnuOv9e/bsKZHrLhztBnHqqafKwoULJTs7W+Lj4yP6em6v4UOHDpmmc22O1x87+uO2INpUr91etI4HDhyQypUrF6vsALyFgTpw5bHHHjPzyGl2pzA0oNQvEQ3etD/V+eefbzIbwZo2bWr+fv311yGfJ7BfW1H2DUX7px08eND08cpPQkJCiRyDkqB9LC+77DLZtWtX2HqjaJzroKCgyMnCub3uCvrxValSJbMGtiOSr+fmGtYfiF9++aUJdseNG1fox2lwrvULrCMAuxFUwhVtOhsxYoS89tprpgm+IBpA6oCgBg0amP/Xx/7000/+LIxDs0XdunUzTX3nnnuuPP300+aLSwPSYEXZN5RVq1aZv8XtulDUY7By5UrTFBi8PfPMM0V6XR3soH799ddilRuhr4PgAVnhuL3uwtEM9LJly8zz64+HSL9eca5hx9SpU03Tuz5+5syZhV755uOPPzbveR0Ax2o5QNlBUAnX9EtOszf33HNPgcHU4sWLzZeXo2fPnqZv1auvvpprX/2i0T5k2jSuzYHal+ycc86RWrVqydChQ2XHjh3F2jcU7Q+rgkdTr127Nk/gt3nzZlfHwGn60z5lwVunTp2kKJzyOuWHO+Gug3DcXnehfmR06dLFBFp6PQRn8Evq9cIpyjWs9L2szeU6mltHyue3fG1gHbUryXnnnSfdu3cP2UoBwF70qUShV64It59+qY0aNcp8GWkfqXDNcPoFos/x4osvmi1wXfUZM2aYprPAL/QKFSr4Ay6lX5r6HDoN0fr1681rOWUqyr6hpqBRO3fuzDWNi04n5DzfnDlzTNO9DmQINQ1KYY9BUQfq5EfLq1iLvmQ4x1GvnXDT+QRzc90F/8jQQVe//fabyTz/9ddfubKUJfl64RTlGtapt7QPsvb5nDZtmumXWZg6atn0Pa6tAprdBFC2kKmEyTQ4/bhCcQYAVKtWLezR0lGcOtr2rrvu0mmq8tyvTXQ6Ol77XwVn6J544gmzz+zZswv80r/33nvNoACdK+/PP/8skX2dDKHOxxn8HE52pTBNogUdg5L2ww8/mL/t2rWL+GvFAs2gqe+++67Yz1GU6y74R4b2kdWBV6mpqWa2AZ3LNRKv5/Ya1r6XWl4NfJ3XLmwdL774YpOlJKAEyiaCSphMnU7xs3Tp0pBHQ/t3qfyyETp6U0dQa5PYrFmz8tyvmb7du3ebaUdC9SfUZvDAJvAff/wxbJBbs2ZN89e5vyj7huL08Xz++efNQI3iKugYlKT09HSTOdXZBnSkMNzT60AnutdprjQDF25widP30u11F46OitaAUrP3Glw6IvV6Rb2Gb7rpJlm0aJFpptfR8ADgIKiEceutt5ovreC+jfrloZ3xL7zwwgKzCzpq9rTTTjMDCIJpE50GP+GmK9EvKB3Vqv0Yndft2LGj+RtIVzjRjGbz5s3lpJNOKvK+oeiULW+99ZbJ8mgmJXi+P50yRaebKYz8jkFJ0YFNOlBDm0f13KBk6HWggZyuCqTXgTbxBv+46tq1q+kfWBLXXX60OVtbELQ52hHJ1yvsNazzd7788sumH7S+Z0I10QOIXfSpLEFFGTXptdfW5i7NwuhSjNq3Ub+gNBumX6DavKVfJgXR/lL6WM06BtI+Yl999ZVpKgtHlx1UGtTqfHk6PYk25+lfnUpFJ4P++++/ZcmSJaa5esqUKf4vtKLsG44GC9r8rZlUDZ71S1UD4MzMTFm9erXpy6Zz8BW0rFy4YxBq0EIo2kUgcM6+wH11qTvtN6d109s+/PBDTy5zt8bi19brQLOD2k3j2GOPNV0LtIlZ52DU95iOwG7fvn2JXXf59UHUuScff/xx0xyekpIS0dcr7DXsBJo6vZbOMxuOTk108sknuy4LALvE6bI60S6EDbRPoGayNOAInqhXMxva8Tzao3B1Amz94nOzoo4GLpqR0QEAminRJm/tDxXs/fffNwNZQo1YXrBggezfv98EZhqc6nHTLz7NsmjzYjgffPCB6cQfOLmzNuetW7fO9N9yOviHe47C7qtlP/roo/3rmAfTumv2R/uSakCh6z7rwI3gL+yiHIPAx+TXxN6/f3//FCuB++pr6/nQZnqdSkiDXK8x74MTTjCr6kRTlcqVZc26da5XltKVczSo1/e1HncN4kLNVermusvvWtQfNDq9kF57gf1mi/KeKEhRr+FPPvmkUJOsa3DufG4U9H4rzmcuAG8iqCyhDzj9QtWlyqLdN7K0lmgEQuF9gJJCUAnYx3vpDktpMEdAh1jH+wAAYhdBJQCUITotkfa9zc+bb77pqfXiAZQNBJUAUIboABudaio/rLcNIBIIKgGgDDnrrLOiXQQAMYpJxgAAAOAaQSUAAABcI6gsIqb1BIDI47MWsA9BZSE5HdujPcE5AMQC57OWQUWAPRioU0i6yknNmjXNKhtKp+PQ5cwAACWbodSAUj9r9TPXWWEKgPexok4RP+y2bt0qu3fvjtwZAQCYgLJ+/fr8eAcsQlBZDIcPH5acnJySPxsAANPkTYYSsA9BJQAAAFxjoA4AAABcI6gEAACAawSVAAAAIKgEAABA9JGpBAAAgGsElQAAAHCNoBIAAADi1v8DkFnINOnUGpQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Get the channel matrix between the base station and the UE from the channel model\n", "channelMatrix = channel.getChannelMatrix()\n", "\n", "csiRsResources = sweepConfig.getResources() # Get CSI-RS resource information\n", "setResources = csiRsResources[ sweepSet.rsId ] # Get the resources for beam sweeping (by ID)\n", "sweepWs, sweepBeams = channel.txAntenna.getSweepingBeams(1, numSweep) # Get beam angles and precoders from TX panel\n", "print(\"Beam information:\")\n", "print(\" Beam Theta Phi Pol\")\n", "print(\" ---- ----- ----- ---\")\n", "for i in range(numSweep):\n", " print(f\" {i} {np.round(sweepBeams[0][i],1):5.1f} {np.round(sweepBeams[1][i],1):5.1f} {sweepBeams[2][i]}\")\n", "\n", "# Create a transmitted resource grid and precode the CSI-RS resources using the\n", "# precoders obtained above. Then set the corresponding resource elements in\n", "# txGrid to the precoded CSI-RS values.\n", "txGrid = bwp.createGrid(channel.txAntenna.numEl)\n", "for resourceId, (lIdx, kIdx, sweepReValues) in setResources.items():\n", " b = resourceId-1 # Beam index (= resource ID - 1)\n", " w = sweepWs[:,b:b+1] # nt x 1 # Precoding vector for this beam\n", " txGrid[:,lIdx, kIdx] = (w @ sweepReValues, \"CSIRS_NZP\", resourceId) # Precode the resources in txGrid\n", "\n", "txGrid.drawMap() # Draw a map of txGrid for the first TX antenna port\n", "gridStats = txGrid.getStats() # Get statistics. This shows the number of REs in the\n", "print(\"\\nResource elements in 'txGrid':\") # full resource grid allocated to each CSI-RS\n", "for k,v in gridStats.items():\n", " print(f\" {k+\":\":15s} {v}\")\n", "\n", "# Pass txGrid through the channel and add noise\n", "rxGrid = txGrid.applyChannel(channelMatrix) # Apply the channel to the precoded resources (frequency domain)\n", "noisyRxGrid = rxGrid.addNoise(snrDb=10, useRxPower=True) # Add noise\n", "\n", "# Process CSI-RS at UE:\n", "sweepReportMan.processRxGrid(noisyRxGrid, csiRsResources) # Process the CSI-RS and prepare the feedback\n", "\n", "# For this example we assume the feedback is available immediately\n", "csiReportInfo = sweepReportMan.getFeedback() # Get all available CSI reports from CsiReport objects\n", "csiFeedback = csiReportInfo[ sweepReport.reportId ] # Get the CSI feedback for the beam sweeping (by ID)\n", "cri = csiFeedback.cri.cri\n", "print(f\"\\nCRI Info:\")\n", "print(f\" CRI: {cri}\")\n", "print(f\" Best beam index: {cri-1}\")\n", "print(f\" Best beam: 𝛳={sweepBeams[0][cri-1]:.2f}°, 𝝋={sweepBeams[1][cri-1]:.2f}°\")\n", "print(f\" RSRP: {csiFeedback.cri.rsrp:.2f} dB\")\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "202b542f-8946-4855-89ea-dea42c64d7be", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqAAAAG/CAYAAACHVGUWAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAATppJREFUeJzt3QeYE+XaxvFn6b2JSAcBASl2BOXDhthQUCwodrEcu4IN9Sg2sCti99gbioIgdkCOYgc9CkpXqQJK72XJd90vTkyy2d0su5lkkv/vusKyk9nslGxy53nL5IRCoZABAAAAPinl1y8CAAAACKAAAADwHRVQAAAA+IoACgAAAF8RQAEAAOArAigAAAB8RQAFAACArwigAAAA8BUBFECUJ554wq655prAHJWbb77ZHn74YcvWczNo0CC7++67LZ389ddfds4559hnn32W6k0BkKZyuBISss2//vUv27hxo/t/Tk6OVapUyVq3bm2nnHKK7bLLLhYEt912m9vua6+9tsQf+9RTT7Wvv/7afv/994TW37Rpk73//vv27bff2vLly6127dq26667Wo8ePaxOnTrh9RQS//e//4W/L1++vDVu3Nh69uxp7dq1y/O4Wv/nn3+2Z555psDfr59t2rSpjRkzxjJdvHPzf//3f1amTBmbMGGCr9vyxx9/2IABA+z888932xBJ26fngM6d7geAWFRAkXVeeeUVmzx5sh1yyCF28MEHW4MGDeyhhx6yli1b2sSJEy0I3n33Xfvoo49SvRn2ySefWLNmzax///7u+3322ceqVKli//nPf6xRo0Y2dOjQ8Lpjx461V1991R133XbffXf383vuuWfcCqbWf/nll33dnyC66aab7IYbbvD9965atcpefPFFmz17dp779CHk+eefd39fABBPmbhLgQyn0KkmQs+5555ru+22m1111VU2adKklG5bUKh59ZhjjrFevXq5oFiuXLnwfaqMKYBMmTIl6mdKly4dddyvvPJK23///e3666+3s846y2rVquXrPmSCo48+2tKNPoREnmcAiEUABcysXr16tscee7jmza1bt7omTc+GDRvsjTfesO+//962bNlie+21l5155pmuCTyyH6KqPpdeeqmrsH733Xe200472RlnnGGtWrXKc4yXLl3qqoEzZsywChUquCbME044wQW02Me8/PLLbdiwYfbVV1/Zvvvu67ZDTZwKfN6bvILbgw8+WKRtljlz5thLL73ktkfVS4XARIRCIbev2sfnnnsuKnxGhno1yRdEXSC6devmQr+a5w877LAdfj5qPxM59okcm8cee8w9juic6Ph26dLFjjvuOLfNsefosssuc79b3RCaNGniunlUr17dPf5rr73mlms9LddzLRGJnhv1AS1VqlRUFTS/547OiffYw4cPt99++82qVq3qQmzXrl3zPPavv/5qb7/9tltf3Sn0gaNTp07ug8Utt9zi1lG122v+7969u5188smuD6j6qp533nl20EEHRT3mN998Y6NHj7Y///zTHQt9gFEV3DNv3jz32BdffLFrxtfja1mbNm2sb9++Vrly5YSOH4D0RhM88Lf169e7IBUZAqdPn+7e+PQmv/POO1uLFi3cQBC9YS5cuDC83jvvvOOajPv06eOClJrzv/jiCxdq1T8y0ueff+7uVzBR1VXBR/3k9Ea9du3auI+pN231l5w1a5Z17tzZhYaaNWuGm7MPOOCAIm+zHlv9J8ePH++2Rz930kkn2bZt2wp9TiiATJ061fWbLSgQJFLR1HGXihUrWnEkcuwTPTZt27YNH9uOHTtabm6uC4DqgxnJO0e6T8dD5/PZZ591Tc/r1q2z3r17248//uiWv/nmm+6xIs9xfopybrSPH374Ydztin3uyJNPPun6PCuUaj/1YUv9cC+44IKox1AIV4DX42j79behrhbqrqLzqsq16LG8Y6XuGKJ9VPP8zJkzox7zuuuuc89VHWvtn/Zr7733tnvuuSe8jj606Gf/+9//ho93w4YNbeDAgXbEEUe4Dz8AMoAGIQHZpHLlyqEjjzwyatmECRNCOTk5oV69eoWX5ebmhtq2bRtq3bp1aN26deHlGzZsCLVo0SJ0/PHHh5dpPT3uG2+8EfXz3bp1C9WuXTv885s2bQo1aNAgtM8++4Q2btwYXnfy5MmhUqVKha644oo8jzls2LDwMu9x9t1331DXrl3z7Fui26zfXa9evVCXLl1CW7ZsCa83evRo9zubNGlS4DF85ZVXlAJCTz31VChR3bt3D5UvXz5q2ZIlS9x26BZ5PPJbP55Ej31Rzmc848ePd/v86aef5vnd7777bnjZtGnT3Ho6tiNHjgwvnzlzpls+ZMiQAn9PUc9N586dQwcffHDcYxL73Pn222/d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TJfpTSQbEUB3gMKnrigCAAASpwto6EpwHl3AQBeG0EUhkBl0QRFdZCK/C4F4CKA7QJVP7w9J11UGAAD5W716tSvceO+fXmuiLimsqpkqowostCoGlyrZ+kChq5zpvOoqaLHV7kgE0B3g/YEofBJAAQAo2vunKKwohCqYqmqG4NMliHXZ4rlz57rzG3mZ3VgMQgIAAClTUJUMmXs+OesAAADwFU3wJS1NRsX7sRUhyx7pcVbTR8inY1USz7F0O3fJ/LtJt33NWgP9/XWhgen3XFF/QKAgBFCgELypp+5Y6fGK+zamn+ccAsEyb948++uvv3z5XbVr17bGjRsnvP6KFSvs5JNPDn+vPo8a2d+7d287/PDD86x3991323777ZdvUH/nnXfs3XfftcWLF7ttOfroo+2UU05xg7Niffzxx259HZ+ddtrJ9txzT+vbt69Vr17d3T9kyBCbM2eOPfLII+GfWbp0qV1yySXWvHlzGzx4sA0dOtT9vlgNGjSwF198Mfw43jravxo1aljbtm2tV69e1qZNGysJBFCgEASYxBDyAJQEhatWrVrZxo0bfTmgGigzY8aMhEPopk2bbNy4cS7MKVhqsM3XX39tRx55pL366qt26qmnRq2XX5DevHmzC3STJk2ya6+91k466SQ3evzGG2+0p556yt5///3w4CzNk3raaafZp59+apdffrkdc8wxtnLlSvvpp59s7733tl9++cXtx7Rp0+x///tf+Hf8/vvvdsQRR7iA/Pzzz7v+mVpH00lGhlSJHAgWuY4Gimlku363fteVV15p9957rxUXARQoRggNZWEA87thrSSqoACCQ4HNr/Ap+l36nUWpgspee+0VrngqEH755Zc2YsSIcAAtzB133OEC6tSpU1110qOq6e67727XXXedPfroo+F1VZFU4GzZsmXU49x8882uShnr559/duGzY8eO9vrrr1v58uXD92kGn8hqbTyx65x++umuMnvUUUfZHnvsYWeccYYVB4OQAAAAimHdunX266+/WtOmTRNaf9u2bfbEE0/YueeeGxU+pU6dOq7K+J///Mc2bNjg1n3sscdcU3ts+PSCYmxzvSqyBx10kGvOHz58eFT4LA4F2q5du9ozzzxT7MeiAgrsYBU0W6pyoUIqkdlS+QWASAMGDLD777/ftmzZ4qqN3bp1s1tuuSWhgzR37lxbtmyZdejQIe79atpXE74eV/1Cte6+++6b0GMrCKtyqX6f+TWVq4k9tgKq72+44YZCH1/brC4CWRVAdZ1YlaDfeOMN11lWJz62jB6v9H3FFVfYYYcdFv5enyZeeOEFV/pWnwmVlNV3I5P40W8x04NHvLCVLaEznmzedwCIpUFHCorqn6mgOGjQINfUfcEFFxR6sDZs2OC+eoOHYmnQj7eed5lSb1lhVA3VbcGCBS43xRvMpAwVGzZ1+cxEJ5sviS4SgQmg+oShyzqp34FK3bNmzcqzjp4Eo0aNsnvuuSeqTN2iRYuo9c4//3z76KOP3KcXjVLr0aOHGxV24YUX+rIvAAAg2CL7gKpfpDLI1VdfbWeffXah10GvV6+euyqUKqHxaPCQFxRr1qzp1vWWFaZJkyZuFLsKa3369HEDo8qUiY57ifQBzc/ChQutbt26ljUBVAl+4sSJbiTXVVdd5f6fH/V76NSpU9z7fvzxRzcSbMKECXbwwQe7ZRoVpk8CetKUVD8JAACQPRQWVSBTYWuXXXYpcN2aNWvaAQccYK+99poLrbEUGlu3bm3NmjVz3x944IGuuqp1Iy9nmh8NPBo7dqzrs6nR8/rZ2BC6I9Qt4L333nN9S7MmgCokKnwmQn0eFCTVsfecc86JqoB+8MEHrj+FQmrkiDONIlOnXS+UZgKmDwKyC90kCpbj8wTxyB6qfr711ltuJH1h4TMyqxx66KF26623ur6jXlO5Rr5/+OGHLuh57rvvPjvkkENcy+1tt90WLpapef7xxx+3yy67LM9119U9QF0N1TdVOefNN9+MO1o+UUuWLLGLL77Y/U5tR9YE0EQpdO6///6uvK2w2b59ezdpq9fHU3NsKchGfoLwpl7QffECqBK/bp7Vq1dbUBBCkQmYigkldcUgQihKehCSwufMmTOtSpUqLuTlt16kBx54wDp37uxyigYLPf30067roJrZlU9GjhzpmvU9qpaqoqk5QDUASJPCr1q1yoVCjaTPL1hq3s7x48e75vYTTzzRheT8BiEpAKt7osdbR+NmNAhK+6gw+8UXX9iuu+5a7OOXUQFUHWM1AaueBKImdd0uvfRSmz17tlumIBk52aroU4MOfH6dajXZrD5xAAUh7APpjxCa/tRKqfdlPyei1+9MVK1ateyTTz4Jf6/8UL9+fdfaGjngJ3a9SI3/LnxpSiNNgq+bwqSubqQrDcVrZu/SpYvLOOo36l0JSUW3yK6D6qK4Zs2aqJ/T2BlNdq8AuXz5creOJr2P19Ic+TjeOmq61wAoXRxAOaukZFQA1Yn3wqenZ8+e9tJLL7k+GepzoRFn+n8kXU1AI8V0fzz69NKvX7+oCmijRo2StBcAYtG0jJLkXTudamh6UjhTIEvXS3FqgFEiA3gSXU8U7nRLdJCRbvGo32g82j9vHzWAKL/1Ih+nsHWKK6MCaDwKl/ok4X0q0XVTVb7WJ4SqVau6Zd5lq/QpIR59umBwEgBkFqqh6SsyMCEzZdSVkNTZVhOwepYuXer6XaiTr6Yc8Cqi+lSiaZdEfRvUF0MTvOrSV5laPYq8AQD+fn1kYBKQEoGqgOrSVOr7MGXKFNeP4fjjj3fLhw0b5vpwqPm9V69erh+D+itMnjzZTcf03HPPhR9DfSZefvllO/PMM10nX1VIN2/e7DoCAwAAIPkCFUBVvYw3At0b/aV5rxQ6dUWCP//8082fFW+klh5HHXi/++4717SukFrYpLFANqJijmyrgtIvFPBHoAJo5OU086O+nvn15YykCqmmEwAQH+ET2Yh+oYA/MqoPKICSQfhENqNfKJB8gaqAAshOxZ2IPt7PFn4xO2QzpmoCkosKKICsQ/hEoqiGAslBAM0yvPEiaNOGleT0YXr+8zeAIj8nmaoJKHE0wWcR3niRDKEAPceCtK1ILzTJ+2zePDOfroRkugxnESa9X79+vT3++ONufvELL7ww6j5N76jLVeo67t56uqRl06ZN8328v/76y12vffHixe6qTBpwrasVxdK13zXfudbTDD8HH3xwnkuLBwkBNAvkZNAglpw0H0TD4J30ReDkGGUqTR2VUVVahU9dltKna8FbhQpmM2YkHEI1HeS1117r/q9LYh555JHh+5599lkXIhVAvfXatWuXbwB95JFH7MYbb7QDDjjAXQxH144///zz7aabbnI3j5afcsop1r59e3f78MMP7bLLLrMHH3zQTS0ZRARQFAuBK3PlBHTAUX6PCSAgVPn0K3yKfpd+ZxEv/akgeP3117spHXUBnKJ644033AV2hg8f7qqkngkTJrjHVJC96KKL3DJ97dOnjz322GPh9ZYtW2azZs2yoKIPKIC04/XVJDgCSFeqUM6ZM8deffXVHfr5gQMHWvfu3aPCpxxyyCF21llnuft1ufDc3Fx38RwF3ki6sqMupBNUBFAAAIAi2mWXXaxfv37273//2zZt2lSkn12yZIlNnz7djj766Lj3a7n6emodXWBH/UJvv/12e/LJJ23mzJkWCgW//ZEACiCtUQUFkK7Ux3PDhg1RTeOJ+OvvAVYNGjSIe3/Dhg2j1lNzvfqA3nnnndaqVSurU6eOGwCly44HFQE0CyRrShsAQDDxPlAyqlSp4iqgd911l61cuTLhn6tRo4b7qipnPH/88UfUejVr1rSHH37YFixYYHPnzrVBgwbZ6NGj7bjjjrOgIoACAIqMAANYeICQAuLdd9+d8CFp0KCBGxn/6aefxr1fA5H0mG3atMlzX+PGje2CCy5wIfSbb74JbBWUAJpFGNgBoCRfTwCYlS1b1lVAhwwZYgsXLkz4kNxwww1uBLzCZqSffvrJnn76aTfCvkyZ7ZMVffXVV3l+XgOTKlSoEK6SBg3TMGUB3igQdMmYmgkASor6Z95///02adIk23PPPaPue/vtt23q1KlRy3r37u0qp2pO14Cjk08+2c0D+ttvv9lrr73m5gL15hoV/X/r1q3WsWNH23nnnV1IHTVqlPudCsBBRAAFAABIUOXKla1///7WqFGj8LKcnBx31SMNFurQoUPUevH6em7evNl9VTP6ueeea++//74bGa8BRmpWb9u2bdT6EydOtMmTJ9sXX3zhmtw1VdM999zjrogUVDmhTBjL7zNd3aB69erusli6FFeUnPSoN6ZqK0IB2mae+AVLj2dyMJ9bQX3epdNxSltpesWhHbkSUjLPd2y0iPe+uXHjRlfxU4hSU3JQroSEguV7XmNQAYWveINDJgU2AEmgIKhAmKbXgkfJIICiRBEwURzZEDbpzwokQIGQUJjRCKDIWjlZHoQAAEgVpmECAACArwigAAAA8BVN8AAAZLHv7jCrW8Ns8UqzDv9O9dYgWxBAAQDIYgqfDWuleiuQbQigANJmFoN4v58BYQCQeQigQJZJdcgEAIAACgAA0sq8VfPsr/X+TERfu1Jta1w98YnodU326dOnW9OmTa1KlSoFrrty5UpbunSp7bTTTu6Wn/Xr17vLdTZs2NDKlStn2YAACgAA0ip8tnq0lW3c6s+lOCuUqWAzLpuRcAj966+/rH379vbBBx/YUUcdFXedH374wa666iqbNGmSNWjQwP744w9r06aNPfTQQ3bggQeG15s/f75ddNFFNn78eLeervPerVs3u+uuu6x169aWyZiGCQAApA1VPv0Kn6LfVZLV1p9++sm6dOliu+++u6t+zpw504XWww8/3A477DD78ssvw+ueccYZtmHDBhdQ58yZYytWrLCzzjrLvv32W8t0VECRtRjcAgAoaf3797fGjRvb448/bqVKba/zlS9f3lU1J06caJdffrlNnjzZcnNzXRh94oknrGbNmm690qVLW8+ePbPipFABBQAAKAFr1qxxzennnHNOOHxG6tu3r33//feu6V1hc9ddd7VXXnnFfvvtt6w7/gRQAACAErBgwQLbtm2bNWvWLO793vK5c+e6rwqfS5Yscct1O/30023EiBFZcS4IoAAAACXAG8GuUe3xrFu3Lmq9/fff36ZNm2ZTpkyxG264wTZu3GgnnXSSXXLJJRl/PgigSKs+mcm+AQCQLE2aNLGqVavajz/+GPd+LS9TpowboBSpXbt2duGFF9rbb79tAwcOtCeffNLWrl2b0SeKAIqsQhgFACSLwuW5555rzzzzjJvXM7Z/6JAhQ+y0005zIVVU8Yyl6ZhycnIsFMrssgmj4AGk/ZWbMvtlGEAQqR/n1KlTo5ZpUNGgQYPcNEoHHXSQq2aq2qlBRnfccYfVrl3bHn744fD6muvz7LPPtk6dOtnOO+/spnC6+eab7ZRTTgmH1ExFAM1Q8d6wuQQjAADFU7ZsWWvbtq0NHTrU3SI9//zz1qFDB5swYYI9++yz9vLLL7tBRroK0plnnmn/+te/rFKlSuH1v/vuO3v66afd42gS+nr16rnQqlH0mY4AmqHSOWxSzQIAFHRpTF2dyM8rIel3JkphMrbyGUvzfmogUWGDiXbeeWe76aabLBsRQAHAZzkDi/fzoWL+PJDOdElMXRozXa8Fj5JBAEXWKqhKTJUWmRxgAc+hbcyqVPj7eZVGh0WBkFCY2RgFjxLFKHMACIA2Zt/fZTb+JrPqFbcvql/T7K0rzQ5smeqNQzagAoqkoYoIAGmmjZn1MrPdzfb+e1FOzj9fe+xrdkIHs0ueN3tqXCo3FJmOAIqMl07NSgCQ6uBZkLKlt399/FyzKfPNvpzpy9YhCxFAAQDIguCpVqmlFerY75Wb2vxKjWyPlT9ZyzWz4v5Y7jazq48mgCJ5AhVAdVWAjz76yN544w2rX7++3XXXXXHXef31123cuHFWoUIFN5nrwQcfXOR1Mrn5m4ogAGQeve4v2WUX+71pU/u9ZVP7vU9T+715Uxc4dZtbuYltLFPxn6mCcjfa7NEtrOGGhXEroSfsZ1ahrNnGLT7vCLJCYALoli1b3NUEmjVrZps3b7YpU6bEDaAXX3yxvfPOO3bNNdfYihUrrFu3bm6S18hJXRNZB0BmvTHzwQvBl2NWZRezGk2336o3Cf+/de+mNrdJE9tY8Z+AWZitOWWslG3L9/7SpcyqVSSAIssDaOnSpe3jjz92AfSqq66yiRMn5llHE8M+9dRTNnbsWOvatatbVq5cORc0+/Tp4/6fyDooHAOMACDJATMcNL3/NzEr8/ecSTFmFPLIlTats6Ybfrem6/65dV/4ntXf8Ee+P6Nm+NUbirlLQNADaKlSpVz4LMj777/vrlBw6KGHhpf17t3bXdbq66+/dtdlTWSdTEd4BIBUBcy6eQNmOGg2zjdgFqby2rXW9Pff873ttGyZ5exkZj01+WcCkzDmmpWebLYhVc3v6+aZbfJnInorX9usMhPR+y0wATQRc+bMsYYNG7qw6mnatKn7+uuvv7pwmcg6sTZt2uRuntWrVyd5T+BH4KZJFok8T3YEz600ULOZWccrzFbNM/vqQZ9+aY5Z1Xp5msejmszLlN+xh9681mzFb2YrfzdbNXf714jbmuuXFf68W2Zmz5nZT2Z2VSFPVL1FfmCpC5/vtjLb5s+lOK1UBbPjZiQcQnXN9r333jvq2vDKFSpmXXrppZbjzWtlZu+++6498cQTLl+o+HX44YfbFVdc4f6f7TIqgG7cuNGqVKkStUyDjNR8r/sSXSfW4MGD7bbbbkvilgPph0o5ginHbP/LzLoONitXefui6aPMVswpgYcuZVZFAbNJ/CZyV8HcwYC5ac0/gXJVdLh0tw3LC960ovyuSWb2vJmd+/cfemQ1NPfv73V/qqZgUuXTr/Ap+l36nQkG0NzcXFu4cKG9/PLLdsghh7hxKWpB7du3r7vvyiuvdOsNGzbMzjrrLLv//vvtiCOOcMUrDX7Weu+8845lu4wKoNWrV7fly6P/SFeuXOmeEDVq1Eh4nVgDBgywfv36hb/Xk6hRo0ZJ2Qf4J1sDVrbud3Fx+csAqNncrOdzZk0iWrIW/2i2en4RA2YBTeSlyxUjYP5dwYy8edXMQgJmidMk8zosR5tZh78TrF4cJv9d+WT+z0LVrl3bVT5FXQRfeukl+/zzz8MB9MUXX7Tjjz/eVTw9+++/v8sbyLAAuscee9gzzzxj69ats8qVt3/y1Wh5ad++fcLrxCpfvry7Acjc0EezeQZUPQ+/26xspX8Wf/eY2SfXm+Vu/nu1UmZV6+c/yKd6o2IEzNXxw6XXbL5xhaWdmX/fhppZLTPTJg5J9UYFk5rYf/jhBzdI2qPcoG5/al1VS6tHLa7IsADas2dPu/rqq11/C41q13yfDz30kO21117Wtm3bhNcBshVVPmRE1XPNIrP/vWi2dYPZ0Y/80x/TVTDL7njADPfBjNNEvnFlie0SguHMM890IVPTRKpfqGbSuf7666NaT4855hhr0qSJm+6xY8eOdtRRR9luu+2W0u1OF4EKoNdee63Nnz/ffcrQyT711FPDZW49CXbeeWd77rnn7Nxzz7VRo0a5pnU1t3/wwT89qRNZB/ALgQ8ohqMeMetwsVmpmLcyVTm7DCjaY21clbeJPHKwDwETMVS8Uh/QrVu32s8//+zmGL/55ptt0KBB7n4FzlmzZtnIkSPts88+c+ureV63hx56KOuPZ6ACqObtVGBUn4pIkeXsk08+2T0h1CFYobRLly5WMWZi3kTWAQCksaaHmnW8PPH1N6yIO3o8fNu0KplbiwzvA6rZdFT9VBO8QmilStu7gtSqVcsNOtJNHnzwQevfv7+7AuMBBxxg2SxQAVSl60SoynnccccVex1kJqqOQAZQmNyWa1Yqpj9dKLR90NG8iWYzx5j9+bPZyrkETCSdZthRNXT9+vXhABrrtNNOcwF0wYIFWX9GAhVAEVyEPgAlasWvZkN23T74qFk3s3p/z8uoORjV17N9H7Pde5nNfM/s64fM5n/BCUDSqFvgk08+6eYHVWVUrrvuOuvUqZObgknhVIOfNa2jwmmnTp2y/mwQQDMYoQ9ARlOlc6wGfVxvtlMrs/anmbU/3axWi+3366pCbU40a9XDbGiL7ZPSAyU8CElVzxUrVrhugo8++mhUd7/77rvPjTnRZb41haMGPI8ePZqpHIPWBB8EhD4ASIFlM8wmDNx+q99hewW03anbL325ZZ1ZbqquKYkdujSmrk7k55WQ9DsTVKdOHTcgOnIcipbFTq/UoUMHe/PNN93/ly1b5uYaZwqmfxBAAQCZZdF3228fX7O9aX7tErO1f6R6q5AoXZFIl8ZM02vB61Le3uCjRHHpzbwIoACAzBTKNVuk604icBQIixAKETwEUAAAsrj71/yqZqrnLahq1qiErj7GJX9RmFKFrgEAAACUIAIoAAAAfEUABQAAKRPSxQOQdeeTAAoAAHxXtmxZ91VXDkLm8M6nd37zwyAkAADgO82Jqbkxly5d6r7XFYJydCUrBLbyqfCp85nInKcEUAAAkBJ169Z1X70QiuBT+PTOa0EIoAAAZLHFudFf/aSKZ7169dyVhLZs4WpVQadm90Sv9kQABQAgi3X456qSKaPQwmUqswuDkAAAAOArAigAAAB8RRN8UOWUMmvcxaxqPbM1f5jN+9wstC3VWwUAAFAoAmgQtT7B7KghZtUb/bNs1XyzD680mz4ylVsGAABQKJrggxg+T3nLrFqD6OX6Xst1PwAAQBojgJa0gX/fktXsrsqn9//Y++Soh/PeBwAAkEZogg8S9fmMbHaPpeBZvfH29eb+188tA9LfwAz/fQAQIJTKgkQDjkpyPQAAgBSgAhokGu1ekushfQ1M38paqIDfz1WcfeqOAwABRwANEk21pNHuGnAUr5+npmFavWD7ekgbBQW2dA1uiWwzEkAIBYC4CKDJEu8NvLhv6gqYmmpJo931/8gQ6s0B+uFVzAfqkyCHtCBve+AQQgEgDwJo0GiezzdPyjsPqCqfCp/MA2rZHtCCvO0ZixAKAFEIoEGkkDljFFdCytJwlgn7kJUIoQAQRgANKjW5M9VS4YeJsIZ0QggFAIcAms52bmtWu5XZtBHRy0uVMWvb22zuZ2arNSipkVmTg/Kvlm5Z78vmAkgAIRQACKBprfXxZvtfljeAlq1s1uuV7X1BFUAb7L/9+6nDzLZtjV539ocE0DSTbiPeAQDwGxXQTDL6fLMt61K9FcgHwRMAgO24EhIAAAB8RQU0k7TrbbZ10z/fb92Qt/keAAAgxQigmaRZt+g+oBtXEkADIpTqDQAAwEcE0LSPJXF6DubkxI8t9AENxLRLhE0AQLYjgKazNX+YVdpp+yU3vUttSuVd/r5/kWWjIITMeAieAABsRwBNZ4u+2x4+1bQ+56N/lrc4ymzTGrM/f7FME9RwCWQD/X1mxWwOvA4BSUcATWdLp5p99aDZScPMvn3UbNVcszrtzPa5wOyjq802rS54EJL8+onZuqWWLgiYQLDwNwsgGQig6e6Ta81mjjFr1tWsfoftE8//p5PZ0in/rKNg+tMrZk0Pzfvzf0z2NYDyZgUEH3/HKHa1+FaOIQpGAA0CXfO9oOu+L5pkNvJMXzaFNyYgc/H3naXocoAUIIAiCm9AQHbhbx5AKhBAswxvNgB4HQCQagTQDMMbCwBeGwCku4wKoJs2bbKLLrooz/Lzzz/f/u///i9q2YgRI2zcuHFWoUIFO/nkk61Tp04+bikAAED2yqgAumXLFnvxxRft5ptvtubNm4eX161bN2q9K664wl5//XW78sorbcWKFdalSxd74YUX7PTTT7d0R4UTAK8ZAIIuowKop3v37vlWNH/55Rd79NFH7YMPPrAjjzzSLatUqZJdffXVdsopp1jZsmUtVQiXAHgtAZANMjKAPv74464Sqiponz59rH79+uH73n//fatZs6Z169YtvOy0006zO++807755ps8TfUliYAJgNcXADArlWkHoV69ei5wtm7d2saOHeu+fv755+H7Z8+ebY0aNbJSpf7Z9V133dV9nTNnTr59S1evXh11A4B0oA+2fLhFsZ5DHD6kQEZVQDWgaOrUqVarVi33vfp4qlldA5PU9C4bNmywypUrR/1cxYoVrXTp0u6+eAYPHmy33XabD3sAAIUjcAIIuoyqgJYpUyYcPj0a4T5t2jRbtWqV+75atWq2cuXKqHV0X25urlWvXj3u4w4YMMCt493mz5+fxL0AgPiodgLIFBlVAY1n/fr17msotL2RoX379vbss8+65Rp8JKqaSrt27eI+Rvny5d0NADKh0pmTnIfNHDt63LmkJZCdFdAvvvjCFi9eHP5efTWHDBlinTt3tho1arhlPXv2tJycHHvmmWfC6z3yyCMufCqcAkCqUekEkOkyqgKqZvSuXbvaLrvs4gKnAqkGGL300kvhdXTfU0895fqFjhkzxs0DqiZ1TcsEAKlCv06kktoIqYzDTzkhr206Q2jEuqZT+vPPP61Zs2a21157uYpnrEWLFrmAqqb1Qw891KpWrZrw71BlVf1F1R9UfUojxftdnow60EAcvIEVvak2FcGT85QkAW2Cj/ccLO5zJDZaFPS+ieyUcQHUDwRQID6CTWJS/aLLeUqSDAigJfXcIIAiq/qAAgAAIP0RQAEAAOArAigAAAB8lVGj4AEASFX/XfrWAokjgAJAlils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NbNbb73VzjvvPPvss89s+fLl9tZbb9mIESOsVKmMyuNZPcgAAEoSI+CBkpUTUmfMgHj44Ydd8Ix1++23h0e1L1q0yE2/pKCqsKmKZ7y+nRqUNH78eNe0rumddtttt4S3Q31INZBJ/UGrVasWdV+i84iW1EEPctgKZdC+JCod/9iy4binSjqe76DISbPzlG8A1fL87guSEt6H2GhR0PsmslOgAmi6IICWDAJoeiCAJk+2v7jmFOM4pOJ5GSpqAE10WRAQQOGzQDXBAwDSF91oYoJcUMMo4AMCKAAgqaEza+fcJIwC+WLUDQCgyLLpikIJN78XhGooEIUACgAokh0JntkSVgEkhib4Eub3mK5MatbKpH0JEo470u05k27Pybjbc6tllkzbH6Q9KqAAAADwFQEUAAAAviKAAgAAwFcEUAAAAPiKQUjFGGikKyIBAICCee+XXHwRHgLoDlizZo372qhRox35cQAAsvb9U9eEB7gW/A7Ytm2bLVq0yKpWrWo5OTkp/USpEDx//nyrVq2aZRL2LZg4b8HEeQumIJ03VT4VPuvXr2+lStH7D1RAd4j+eBo2bJg2zx+98KT7i8+OYt+CifMWTJy3YArKeaPyiUh8DAEAAICvCKAAAADwFQE0wMqXL2+33nqr+5pp2Ldg4rwFE+ctmDL5vCHzMQgJAAAAvqICCgAAAF8RQAEAAOArAigAAAB8xZWQAkAT+L7zzjs2cuRINwF+ixYt7PLLL7e2bdtGrbdixQobPHiwfffdd1azZk07//zz7ZhjjinyOn5btmyZvfDCC24fDzzwQLvnnnui7p87d6717t07z88NHTrUOnToEP5+1apVdvfdd9vXX3/t5ps799xzrWfPnpZKOt4vvviijRgxwvbdd1976KGH8qyjyZnvvfde++KLL9zFDc466yw78cQTi7xOqj3wwAM2fPjwqGVNmza1YcOGRS2bOHGiPfroo7Z48WJr166dDRgwwBo0aGDpauPGjfbggw/auHHjrEKFCu65qOMfNE899ZQ9//zzUct22mkne++996KWTZo0yR5++GE3uXnr1q3thhtusF133dXSyYYNG+yNN96wV1991apUqeJeG2Nt3brVvUa8//77Vrp0afdacNFFF0VNgp7IOn7btGmT+zt6+eWXrUyZMnnOj3Tr1i18RT7Pv/71LzvnnHPC3+fm5trjjz9uY8aMcd8fe+yxdskll7j9BNIBATQArrnmGvv999/t+OOPd1eRePvtt22fffaxzz77zDp27OjW2bJlix122GFWqVIl94bxyy+/uBfT1157zU4++eSE1/Gb3uQ6derk3tQVtGfMmBH3zeabb76x0aNH28477xxe3qpVq6gX2yOOOML9/6abbrJZs2bZSSed5N5wzzjjDEuFpUuX2t577+22Q28k06ZNy7OO9lkfANatW+dGsyps9+nTxx577DH34SDRddLBb7/95kbjRn6AqFixYtQ6n3/+uXXt2tU9pxXiFEQ7d+5sP/74Y9pOUn3qqae6c3fXXXe5DxSXXnqp+yCov6Eg0d/a5s2bXSjxlCtXLmqdH374wbp06eJC2Omnn27PPvusHXDAAe787LLLLpYu2rdv7z6s6vXgyy+/jLuO9uHjjz+2++67z+13v379bM6cOXb//fcXaR2/6bV9r732csdb2xaPCgjXX3+9HXrooeFlsZeGvuKKK9wHX+2Lrth39dVXu9dX/c0BaSGEtLdmzZo8yw444IDQmWeeGf7+pZdeCpUpUya0dOnS8LJLL7001KJFiyKt47dNmzaFNmzY4P5/4oknhnr27JlnnWnTpoX0VJ0/f36+j/Pmm2+GSpUqFVqwYEF4Wf/+/UONGjUKbdu2LZQKmzdvDq1fv979//TTTw8deeSRedYZPXq027dff/01vOymm24K7bLLLqGtW7cmvE460HMp3vmLdNBBB7nz7NG5r1GjRujuu+8OpaMvv/zSHfvvvvsuvOyhhx4KVa5cObR27dpQkOg5c/DBBxe4To8ePUJdu3YNf79ly5ZQw4YNQzfccEMonaxcudJ9veOOO0JNmjTJc//MmTPdefvggw/Cy15++WX3+rd48eKE10nlvt13333ubzye6tWrh4YPH57vY/z+++/u9XDkyJHhZVpfy+bNm5eErQaKjj6gAaAmpnjL9Indo+ZBVRIjK4Sqbs6ePdtVzBJdx2+qwKhZMxHnnXeeq56pGSm2mqh9U+UgsilX+6aqz8yZMy0VypYtm6cCGEvbrWboyCZObfeSJUts6tSpCa+TLiZPnuyq7CeccIJrkldzYmRTtroQHHfcceFlOveqXI8dO9bSkY593bp1bb/99os69qpGq6tH0EyfPt0OP/xw69Gjhw0aNMjWr18fvk+V9vHjx0edH1Xu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Tz75JM/yuXPn2rBhw9w1sQEA6YUACiDQdLWXo48+2iZMmBB1RaYTTjjBRo0aZZUrV07p9gEA8uJKSAAC7+qrr3Zh86effnKXmbzhhhvstddec9+n46UkASDbEUABBN7GjRvddcAPOuggO/30061r16728ccf26GHHprqTQMAxEEABZARvv32W+vcubOreJ5zzjl23333pXqTAAD5IIACyBiqgH755Ze2YMECq1u3bqo3BwCQDwYhAcgIGvGuKmiLFi2sf//+qd4cAEABqIACCLz58+fbHnvsYbfeeqsddthh1qFDBzcI6cQTT0z1pgEA4iCAAgi0UCjkBh2VLl3aDTzKycmxQYMG2cMPP2xTp061OnXqpHoTAQAxCKAAAk2Dje6++26bMmWK1a9f3y3Lzc21Aw880Bo0aGAjRoxI9SYCAGLQBxRAYK1du9ZVOV966aVw+BRVQ1988UUrV66cTZs2LaXbCADIiwooAAAAfEUFFAAAAL4igAIAAMBXBFAAAAD4igAKAAAAXxFAAQAA4CsCKAAAAHxFAAUAAICvCKAAAADwFQEUAAAAviKAAgAAwFcEUAAAAPiKAAoAAADz0/8D10rzkIVeb9EAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Draw the map again, this time with an arrow showing the direction of the CRI beam\n", "beamAngle = sweepBeams[1][cri-1] # Angle of the reported CRI beam\n", "ax = dmData.drawMap(\"LOS-NLOS\") # Draw the scenario map\n", "dmData.drawBsPanel(ax, bearingAngle) # Draw the base station antenna panel\n", "theta, phi = AntennaPanel.local2Global(sweepBeams[0][cri-1], sweepBeams[1][cri-1], channel.txOrientation)\n", "dmData.drawBeamArrow(ax, phi, color=\"cyan\") # Draw the CRI beam arrow\n", "ax.scatter(x=[uePosition[0]], y=[uePosition[1]], c=\"cyan\") # Draw the UE position\n", "ax.annotate(\"UE\", uePosition, textcoords=\"offset points\", # Annotate the UE position\n", " xytext=(0,-13), ha='center', color=\"cyan\")\n", "ax.set_title(\"Reported CRI beam direction\"); # Set the map title\n" ] }, { "cell_type": "code", "execution_count": null, "id": "bd601d69-a95c-4a8b-89e0-8f4dd3226c8c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "41916071-8252-45cd-a115-80f4742b50a2", "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.12.10" } }, "nbformat": 4, "nbformat_minor": 5 }