diff options
-rw-r--r-- | doc/thesis/chapters/implementation.tex | 17 | ||||
-rw-r--r-- | doc/thesis/chapters/theory.tex | 2 | ||||
-rw-r--r-- | notebooks/FIR_mehrere_V2.ipynb | 83 | ||||
-rwxr-xr-x | simulation/QAM_Fading/qam_fading.py | 181 | ||||
-rw-r--r-- | simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc | 14 | ||||
-rwxr-xr-x | simulation/QAM_Fading/qam_fading_block.py | 33 | ||||
-rw-r--r-- | simulation/QAM_Fading/qam_fading_frequency_selectiv_copy.grc | 2 | ||||
-rw-r--r-- | src/gr-fadingui/grc/fadingui_multipath_fading.block.yml | 6 | ||||
-rw-r--r-- | src/gr-fadingui/python/multipath_fading.py | 15 |
9 files changed, 118 insertions, 235 deletions
diff --git a/doc/thesis/chapters/implementation.tex b/doc/thesis/chapters/implementation.tex index 04549c5..b2e5d72 100644 --- a/doc/thesis/chapters/implementation.tex +++ b/doc/thesis/chapters/implementation.tex @@ -70,14 +70,19 @@ Here its possible to add some AWGN noise in the channel line. Different paramete Discuss the multitap FIR model we used. How it is possible to set the delay etc. Also mathematics for the interpolation. } -To get a basic line for further simulations a 16QAM has been made. The results of this simulation are shown in \figref{fig:simul16QAM} and \figref{fig:simul16QAM_1} as the red Signal. In \tabref{tab:modulation_settings} some importer Parameter settings for a different modulation scheme are mentioned. - -A FIR-Filter was added in the Channel to create a time delay between tow paths. In \figref{fig:simul16QAM} the result includes a direct path and a delayed one. In the plot of \figref{fig:simul16QAM_1} the transmission line dosn't include a direct path. %It's impotent to mention that the delay should be smaller than the symbol rate or a multiple of it. (Stimmt dies , not sure any more) - -For the a first simulation with some fading the 16QAM simulation model has been extended with a FIR-Filter in the Chanel. The results of this simulation are shown in \figref{fig:simul16QAM} and \figref{fig:simul16QAM_1} as the blue Signal. +%To get a basic line for further simulations a 16QAM has been made. The results of this simulation are shown in \figref{fig:simul16QAM} and \figref{fig:simul16QAM_1} as the red Signal. In \tabref{tab:modulation_settings} some importer Parameter settings for a different modulation scheme are mentioned. +% +%A FIR-Filter was added in the Channel to create a time delay between tow paths. In \figref{fig:simul16QAM} the result includes a direct path and a delayed one. In the plot of \figref{fig:simul16QAM_1} the transmission line dosn't include a direct path. %It's impotent to mention that the delay should be smaller than the symbol rate or a multiple of it. (Stimmt dies , not sure any more) +% +%For the a first simulation with some fading the 16QAM simulation model has been extended with a FIR-Filter in the Chanel. The results of this simulation are shown in \figref{fig:simul16QAM} and \figref{fig:simul16QAM_1} as the blue Signal. +\subsection{Fading} %TO DO: übersetzen -Für das veranschaulichen des Fading effekts wurde ein eigener Block kreaiert und in den Channel implementiert. Dieser Block basiert auf einem FIR Filter. Es kann mit direcktem Pfad oder ohne dargestellt werden ( Line of Side ). Mit Hilfe des FIR filters wird die Verspätung der nebenpfaden dargestellt. Es ist möglich beliebig viele dieser Pfade mit unterschiedlicher stärke zu simulieren. +Für das veranschaulichen des Fading effekts wurde ein eigener Block kreaiert und in den Channel implementiert. Dieser Block basiert auf einem FIR Filter. Es kann mit direcktem Pfad oder ohne dargestellt werden ( Line of Side ). Mit Hilfe dieses Filters wird die Verspätung der nebenpfaden dargestellt. Es ist möglich beliebig viele dieser Pfade mit unterschiedlicher stärke zu simulieren. + +% Bild einfügen +\subsubsection{Fractional Delay} +Problem Werte nur auf dem Sample übermitelt und keine dazwischen. diff --git a/doc/thesis/chapters/theory.tex b/doc/thesis/chapters/theory.tex index 92dea24..520277d 100644 --- a/doc/thesis/chapters/theory.tex +++ b/doc/thesis/chapters/theory.tex @@ -273,6 +273,8 @@ multipath = tap(.8, 500e-9, f) + tap(.4, 300e-9, f) \subsection{Difficulties caused by discrete time} + + \skelpar{Not sampling at peaks of sincs.} \skelpar{Discrete frequency response. Discuss bins, etc.} diff --git a/notebooks/FIR_mehrere_V2.ipynb b/notebooks/FIR_mehrere_V2.ipynb index 6d07670..1cfdd29 100644 --- a/notebooks/FIR_mehrere_V2.ipynb +++ b/notebooks/FIR_mehrere_V2.ipynb @@ -153,7 +153,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] @@ -182,7 +182,7 @@ { "data": { "text/plain": [ - "array([2, 5, 5, 9, 0, 3, 6, 7, 7, 9, 5, 9, 4, 9, 5, 9, 6, 2, 2, 5])" + "array([9, 8, 7, 6, 9, 7, 5, 7, 9, 0, 5, 5, 7, 5, 1, 0, 8, 6, 9, 0])" ] }, "execution_count": 8, @@ -224,8 +224,8 @@ { "data": { "text/plain": [ - "array([0., 0., 2., 5., 5., 9., 0., 3., 6., 7., 7., 9., 5., 9., 4., 9., 5.,\n", - " 9., 6., 2., 2., 5., 0., 0., 0.])" + "array([0., 0., 9., 8., 7., 6., 9., 7., 5., 7., 9., 0., 5., 5., 7., 5., 1.,\n", + " 0., 8., 6., 9., 0., 0., 0., 0.])" ] }, "execution_count": 10, @@ -247,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 11, "id": "79e18131", "metadata": {}, "outputs": [ @@ -255,16 +255,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Tap with amplitude=1, delay=5\n", + "Tap with amplitude=1, delay=5.2\n", "Creating filter of order N=11.0\n", - "[ 1.00000000e+00 -3.89817183e-17 3.89817183e-17 -3.89817183e-17\n", - " 3.89817183e-17 1.00000000e+00 3.89817183e-17 -3.89817183e-17\n", - " 3.89817183e-17 -3.89817183e-17 3.89817183e-17 -3.89817183e-17]\n" + "[ 1. 0.04454711 -0.05846808 0.08504448 -0.15591488 0.93548928\n", + " 0.23387232 -0.10394325 0.06682066 -0.04923628 0.03897872 -0.03225825]\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] @@ -277,24 +276,20 @@ ], "source": [ "\n", - "delay = 5\n", + "delay = 5.2\n", "ampl = 1\n", "print(f\"Tap with amplitude={ampl}, delay={delay}\")\n", - "\n", " \n", "order = 2 * np.floor(delay) + 1 #N\n", "print(f\"Creating filter of order N={order}\")\n", "\n", - "\n", "skip = np.floor(delay) - (order - 1) / 2 #M\n", "assert skip >= 0\n", "\n", "samples = np.arange(0, order+1)\n", "\n", - "\n", "h = ampl*(np.sinc(samples-delay)) #sinc\n", "\n", - "\n", "h[0] = 1\n", "\n", "print(h)\n", @@ -305,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 12, "id": "c89c83ae", "metadata": {}, "outputs": [ @@ -324,16 +319,16 @@ { "data": { "text/plain": [ - "[<matplotlib.lines.Line2D at 0x7f5b33445e50>]" + "[<matplotlib.lines.Line2D at 0x7f3e0dc80c40>]" ] }, - "execution_count": 26, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABPI0lEQVR4nO29a5Bkx3Ue+J16d1V1NzAz3T1DvAYEBy85TIgagtTSogiCIAFueEFurBhgbND4IQWWNqGQuJJsyN7wKvaXwg5ZEbZpMkCbS2hDIk2JpImVYL6G0lKiTBEDGsQbwhCkMIOZ6e6ZwXRXdXe9c3/cm7eqq+uRj5N5u6fzi5iY7lu3+tyT9+R5ZeY5JIRAQEBAQMD+RSbtBwgICAgISBfBEAQEBATscwRDEBAQELDPEQxBQEBAwD5HMAQBAQEB+xy5tB/ABIcOHRJHjx5N+zECAgIC9hSeeuqpC0KIheHre9IQHD16FCdPnkz7MQICAgL2FIjo70ZdD6mhgICAgH2OYAgCAgIC9jmCIQgICAjY5wiGICAgIGCfIxiCgICAgH0OFkNARJ8johUiem7M50RE/5aIThHRM0T0toHP7iWil+PPHuF4noCAgIAAdXBFBJ8HcO+Ez+8DcCz+9xCATwMAEWUBfCr+/HYAHyWi25meKSAgICBAASyGQAjxXQCXJtxyP4A/EBG+D+AqIjoC4E4Ap4QQrwohWgC+GN+7qyCEwJ88dQZvbLS80vzjk6dxedMvzS+dPI21rbZfmk+exnrDH81eT+A/P/kaainQrDc7Xml+8QevYcMjzW5P4As/eA2bLf80t1pdbzQ73R6+8IPX0Gj7o+kSvtYIrgFweuD3M/G1cdd3gIgeIqKTRHRydXXV2YOOwrOvr+E3//hH+I9/9ao3mk+fvozf+pNn8Lm/+ok3mj987Q380z95Bv/39/zR/MFPLuGffvkZ/MFf/9Qbze//5CL+2Zefxf/z/ZFna5zgr38c0fxDjzT/8tQFPPKVZ/GFH7zmjeb/97cr+O2vPIv//OTp6Tcz4TsvRTT/+Cl/NL/9YkTzyz88442mS/gyBDTimphwfedFIR4VQhwXQhxfWNhxQtopvv3iCgDgRPy/D0ha3/ZIMxU+X/LP54kU+Pz2i8veaZ5IgWY6c2V5G22fNH3y6RK+DMEZANcN/H4tgLMTru8qfOel6KW/dL6GM29seqEpFeQL59Zxbm3LC83vxEL97OtrWF5veKEpJ9SPzlzGaq3pheZ34rH94Wtv4JKHdJ8QAidiGTr5d5e8pPuEEImSevKnl7yk+4QQiQz9zU8uekm99XoieZ/f//FFL2mwXk/gz1+OaH7v1AWvKSlX8GUIHgfwj+LdQ+8EsCaEOAfgSQDHiOhGIioAeCC+d9fg/FoDz72+jo8cvxZAX4m4xOuXt/DiuT5NH17H6UubeHm55pXPn17YwI9XN/CR49dCCCSTyyV+vFrHTy4M0PTA56mVOk5f2sJHjl+LngD+4mX3qc2Xztfw+uWIZqcn8N2/dU/z+bPrOL/ewEeOX4t2V+AvX7ngnOZzZ9ewUmviI8evRavb80LzR2cu40K9hY8cvxbNTg/fO+WepmtwbR/9AoD/BuAWIjpDRL9MRB8noo/HtzwB4FUApwB8FsA/AQAhRAfAwwC+AeBFAF8SQjzP8UxckArxV37hzbjxUMVL+ClpPvTum3D9gXLiNfug+Y/f8xZcc9WMF5oy6nn4rmM4Ml/yw2f8/n71vcewOFtMPHWXkHz+2vtuxqFqMUkTuYR8n5+852YcqBS8yRAR8BvvvwXzM3kvfJ54cQUZAn7zA7dgtpTzxmc2Q/itD9yKajHnRYZcg6X6qBDio1M+FwA+MeazJxAZil2J58+u4apyHscWq7jz6IFkUrvEC2fXcLBSwE0LFdx54wH85Ss+vLk1LMwWceOhCt5x4wF8/9WLXmgenivh+oNlvP3oAfz30294oXnNVTO47kAZb7/xAJ5/fc0DzXVcf6CMa66awduPXo0Xzq17oLmGGw9VcGR+Bj93gz+aNy1UsTRXwvEbrsYLZ33QXMexxVkszpa88fnc62u4eWkWC7NF/Oz1V3nh0zXCyeIpWF5v4vBcCUSEw/MlXNxoot3tuac5H9E8Ml/Caq2Jbm/kGjorzSPzJQDA4fkSVmpN9BzTXIn5BIAj8yUsrzcR+QzuMMjnkTlfNBsJn4fnS1hZd78WIuUW6I+tD5rDMuQaK7XGDhlyjW18zvmh6RrBEEzB8noDS/GEWporQQg4X9Q8v9anuThXQk8AF+puaS6vN7A42+ez0xO46Hgh9fx6A0tzRQARn61OD5c33S4wDr/PrXYX6w23C4zDNOvNjvPzBJEMFROaa1tt53veh2Xo0kYLzY5bmoN8Ls76ctS2j+1q3b2j5hrBEEzB8noj8awOzxeTay6xUusrDknbNc3Ia+0Ltzeaw3zW3NNMlHLs1a045FMIEfMZja2P9ymEiGRovq+UXdPs9QRWas1EhiSfLqOfTreHC/XmwPx076i1Oj1c3Ghtk6FuT+CiY0fNNYIhmAApaIMeB+B2QrW7PVyotwY8Dml83Alao93FG5ttLCXeXERzxaFS3mx1UGt0sDi3neb5NXc0680ONlrd/tjOxjQdvs/1rQ4a7d5AhOfemXhjs412V+x4ny7H9uJGC92e8MrnhXoLPYEdMuSS5mqs8BND4EGGfCAYggkYFjSZi3SplGVeddhTdilo0oMa9iDPr7njU47h4bntNF16kFIRDubrB5/FBWSEszTEp0tltYPPJNpy+T638+llbGOawzLkZWw98ukDwRBMwLCgHSgXkM+SU6U8PKEOVovIZshp+uL8EM2F2SKI3E6oYT6lB+lybOUYDuaxB5/FBaTi2GkIfBif/voLACw7jAiG36eMRly+z2G59TG2iQzNbU+jhojgCsawoGUyhMXZklsFOaQ4shnCQrXoNKwfNnj5bAYHK0UvhkDmlIu5LA5UCm6VckIz4rOUz2J+Ju+Hz3hsq8UcqsWc2/c5JENzpRxm8lk/YxvTvKqcRyGXcerAyL+9FMuQD0dtmM9D1SIy5HadyQeCIZiARNBi6w9EnoAfT7lPc2mu6DSs73utQzQ98Cm9VQBYnHVNs5nQkVia82NkF4dkyOX6i+RzIeaTiCI+HY8tEXCoWvBG8/x6A9kM4WAl4tOLo7beRD5LuLoc8ZnNEBZm3cqQDwRDMAHL681I0KoDimPW7b7h5dp2QQMiZenUs6o1UchlMD+TT6653h+9vN7ETD6L2WL/TOOSc5oNzBZzqAzTdJo7b2J+Jo9SPptccz62tQYOVAoo5vo0IxlymzI5VC0il+2rlCUPSnkhTp1KLM4VnfO5OFtCZoCmaxnygWAIJuD8emOHoB2eL7nNta7tFLTDcyW3ntVaIzk0J7E453YSn48PWQ3SdM3n8np/S6XE0pzb93l+YIvsIE3XqaGlIZrOZWgUn44PeI16nz74HIycAfcy5APBEEzAKEFbnCui1uw4q3K4XBslaEVc3nR3IGh5hHAfnivh4kYLrY6bwzmRZ7WTzwv1JjqODgSN4nNpruj0QNDKemNbWiiiWcJKreHsRPM4GVped0hzvbmTZhwRuKPZSLZvJjQdOzCD51D6NIvOz7+4RjAEEzBK0FwfCDq/1j8yL+F6a+U44QbcnSWQEcE2mvJAkKPDOZGy2ulBujwQNDoiKKLdFc5KYJ9fa46MQpqdnrNy1KNk6PB8EZutLmqOnKZxc6XW6DjrkDZOhlw6aj4QDMEEjHrprreoraw3k+2NO2g6UMrRyVe/fI6lOeuOZnTydaeyWnTIZ7cnsFrzO7btbg8XN5rbFuFd02x2urg0cNp2mKaL9a2tVlQaZJwD44JPWRpknAz5qCHlCsEQjEG7G3lPh6rbIwL5u4vaP4125D0tzI6h6WBBarPVxVa765XPWrODVqeX7DBJaM6643O9EZ229cnnG5vRgcQdfLqkudGCEMCCR5oyshk3tqs1/shH8uFzbC+Oobkg+dzDZSaCIRiD9TiEnp/ZXqlb7qxx0Wxd0pwb2L0DAPPl6HcXYb3kY36Y5oxDmluTaboY27UUaCZ8lj2ObWOMDEk+HdBMZWynya2D4oXrW52RNOcc8ukLwRCMwVoKk3jahEqDZhqKY7+MrVeaDp0JqXTT4HOcwbtS5oovcHUou5eIXiaiU0T0yIjPf4uIno7/PUdEXSI6EH/2UyJ6Nv7sJMfzcGDcSy/lMyhkM14FrVLIIpshr5N4tpQDkd9JPFfKbfvcBU2fHuSuMgQp0JxzqCCnRZVO+fToHPqCdYcyIsoC+BSAexA1o3+SiB4XQrwg7xFC/GsA/zq+/x8C+KQQ4tLAn7lLCLGrGn+OE24iwtxM3qunTESYn8l7ncSZDGG2mPOaGsplM6g6ojmOz0Iug5l81itN6Uz4lCGnzsQYmrNF987EOONzpTgTvsAREdwJ4JQQ4lUhRAvAFwHcP+H+jwL4AgNdpxj30qNrfpWVvOadZjkFmmnw6YjmuDUf6Uz4jPDScibmSn5pZh06MGk4E77AYQiuAXB64Pcz8bUdIKIygHsBfHngsgDwTSJ6iogeGkeEiB4iopNEdHJ11X0P33GTGEhHWTlTHLtMKfuOtuQ1/2PrSllFC5o+5XZ9qw2iKJ3oi+baVhvZDKFa3EnTpQzls4SZgXIhEq749AUOQ0Ajro07SvgPAXxvKC30LiHE2wDcB+ATRPTuUV8UQjwqhDguhDi+sLBg98QKSFNxzI2ZUK5yrbtpEruMtgrZDEr5nSLvks9SPrOt5o8PmpVCFvnsTj5dOhOzxdy2sigSLvmcK+W2lSjxQXN+Ju+Vpi9wGIIzAK4b+P1aAGfH3PsAhtJCQoiz8f8rAL6KKNWUOtKaxNViblvhLh8098MkXt9qY27MJHapIEc5EoB7ZTWOpitPeXgBdZCmq8jH99hKGfJJ0xc4DMGTAI4R0Y1EVECk7B8fvomI5gH8IoCvDVyrENGs/BnA+wE8x/BM1pg6iR3tMhlP052nPGkSu1Ec/idxNLaj90Y4VZAp8OlbWe1Gg+ebpitnwhesdw0JITpE9DCAbwDIAvicEOJ5Ivp4/Pln4ls/DOCbQoiNga8vAfhq7KXlAPyREOLrts/EgWmCVmt20OuJkZ60KaZ5HOuNDoQQI71aU6gIt0+a+0VxuPRaU3EmJsiQKyObhsE7OHSqeJDmC2f3sSEAACHEEwCeGLr2maHfPw/g80PXXgXwVo5n4MY04RYCqDU6Y71pc5rjvdZuT6De7GC2xE1z/IRqdwW22l2UCyyiktCcNIkb7R6ane7ItJwNzYWhEgiDNDdaXbS7vZG5dXOaHVxzVWnkZ/MzedQaHXR7YluZc3uabdxwsDyWpitnYrj42yBNF87E+lYb1109M5qmw91ub16ojKa5xyOCcLJ4DKalL6J7eF/8NKV8pdCc7LWmwWcueS5OTIrw5PUac1mCae9TOhO8NCfPFelM8NKczGez02OvBjqNpnQm9iKCIRiDaWka4MpQyrvN4Lk6jbq2OWFsHZVf2A+GXQjhfa4IIbzLUK8nsN7w70z4QjAEY5DWJJ4bk/ZxcWJSeRIzLoxPm8QuxrbXE6g1O16VVafbQ73p18i2Oj1stbteaTbaPbS6vbFy64LmRquLbk+MNwQOSpXUmh0IMXo7OeC2lpMPBEMwAlMnsYOX3ux00Wj3pk5iTo9DTmKfimPaJHZBs9aYMokd0FxvjK5U6ZJmcvZlzLqVC2di0nmbweuczoQyTc73uTX+gKkrmj4RDMEI7MZJ7JRmGnymQNPnJJ7KpwNnQnVsOZ2JVN7nmDIaTmmmwKdPBEMwAml6HFe6cCtPYo8epIuccjB4geZeQjAEIzDtpc/ks8hneSs5TpvE1WKOvXrkND7lNlWfCrKfvuDb2bJfFMe+cSZ2ocFzWXLbB4IhGIFpL91FJUcVmnMl3gNB02hmM4RZRzTHTeJ8NoNKgbeS4zQ+i7ksSnneHhNpOhPjaKbjTESlqDkV5DSDl+paSDAEVw6mvXSA/8TkuDZ4g5ifySf3cUCFT3kIiQvTJrH8jHfh1j9NVWfC5/t04UxMe58u+lpMW0+TzoTPsXXhTPhEMAQjkIayUlXKPiexE5qNyZMY4K/bkubYjot85Gc+PWX5mYu02yQ+uU/6rjfayBBQnXDa3cX7zGUI5cL40+7cNH0iGIIRqMUe8KRSDnOlqN4QH812THO8cM/N5FlPoko+R5WDTmiWeGmuNzqgKZN4biaPepOTz6js9aRJPFfKs564rTU6cdnryTQ5G57Xmh2U8pmJZTLmZvKoM8uQ7H42lqaDsa2OqZib0HQwV2bHVMxNaDLz6RPBEIxAvRkpjlG16yWqxRzvhGpGimNSfZ1KIccqaPVmGzP57Miy1wnNYi4xGCw0Gx1UCpMncbXIzGesrCZN4koxhzonn802qhOMOsDPZ6QgxzsvgBsZmsYntwxFSnkKn9wy1Ox459MngiEYgY1mV0FxZLHR5KtlstHsoFKcXGStUsyx0qw3u6hMiAYAoFrMYqPFJ9xp8Tkp6gH4lfJGs6vAZxYbrDQ7qCqMbZ1VblVkKJeSDPEagsqUwotVZpo+EQzBCKh4HNUibxhYb0z3OGZLOdZwN6pkOkW4S9yeckdJKbNGIbvUO68W8/xjqyBDrGm3ZgezKkbWswzNFnOsqdt6Q2GuMMuQTwRDMAIqHof0lHu9cV059VBvdqd6HJViFhutLoTgoZmOd65iCLg95eleKzefKt55tZhlT18oyRB7JDt9bDmjkLoSTWYZaqnxyTm2PhEMwQgoKatSDkIAm0ylbuvNtoLHEZURbrR5St3WG2qeVasb9QdgoangtVaLeWy1u+gwlfStKb7PepPTsKvT5DLsal4rcxSiIkPMUYhSJJsSn9xlxX2BxRAQ0b1E9DIRnSKiR0Z8/h4iWiOip+N//1L1u2lAzeOIPufyOtRyrdnk+Tigoqz6fPIYgg1FrxWICtRx0VSJQgA+w67qKfcE2Ay7itdaLWb5Dfs0Pgs5NNo9NsOuIkPVOHr2adi5I3afsDYERJQF8CkA9wG4HcBHiej2Ebf+pRDijvjf/6X5Xa9Q8ziiz7ly2aoepLzXG834cy7vqqa4FiKfjwMq3pzM57PxqSBDMrdeY/KW1fjkNexKEV6JmaaCDCU0mRap1eYKb8TuExwRwZ0ATgkhXhVCtAB8EcD9Hr7rDGoeB29EoOpZcdJU8VoTQ8BFs6UThfjjs8IcbalFPg6UssexFUIoylA8tgxKWQihKUP2Y9vrCWy2/EfsPsFhCK4BcHrg9zPxtWH8PBH9iIj+KxH9jOZ3QUQPEdFJIjq5urrK8NjjoeRxOFBWyt45p/Hx6FlJxeGTTyEE6i31CI/jfXZjxeFThtrdHpqdnlIeG+AZ22anh05PeDU+W+0uemLyIUiAV4ak7KvssAP4dIJPcBiCUZvth5NkPwRwgxDirQD+HYD/ovHd6KIQjwohjgshji8sLJg+61RIxaEq3Bxb1LqqHoecxAzpi0RxKHqtHDSbnR7aXaEehTDQ3Gx1IQS8Rj5ScagqK470olQ+qmtbHHzKv+GTTykTPt9nXXVsC7yOmk9wGIIzAK4b+P1aAGcHbxBCrAsh6vHPTwDIE9Ehle/6hlQcqp4Vh/VX9TgSz4rBO5fPPTVfz6kgm/49qw1FZcWpIFVpcvJZV3yfrAZP0xBw8ukzwtN9n/vVEDwJ4BgR3UhEBQAPAHh88AYiOkzxMV0iujOme1Hlu76Rimel6OXMMnpWNUWaLjzIqbnzAl+0VVOcxLOM0Zbq+0zTO+fgU1WGOBWksgw5mCu+N1b4xGTOFCCE6BDRwwC+ASAL4HNCiOeJ6OPx558B8L8A+MdE1AGwBeABEe2xGvld22eyQU3T4/DpWXHmWpMoZBd6razRlu7YMkRbynzu8ShENcLjTJmkI0NdJZpVRhnyDWtDACTpnieGrn1m4Od/D+Dfq343TWwoehzFXAa5DPF4VoqTuFzIgshvFJJ454yesnKaJoWcMgufKaSjUo3wUoi2fI6tPAynupNwLxaeCyeLh5AI2hTrT0SolniKTKnm64kIVabqkaqelSzfzBmFTJvE+WwGxVyGZbuhak5ZGnafUYg07JxeayreeQqRrM9dQ3XFsd3vu4auKKgKNxBNKo48duK1TvE4AL5yyVp8FnmMj6rXKp+Lk89pNImInc9pYysNO08UEnutU2hKw+5ThvLZDAq5jNdINonYWWiqje1MPosMU8TuG8EQDEFHQc4yRQSqXisQeR2su4ZU+GRSkKpeKwD+aEvV+PimySZDXXWaRWYZUnifXDKk6p2zRuxxqZNpBRo5nQnfCIZgCKq7huQ9PnOt8h6fu4bkPay5VsVoi8U71zUEHqMQeQ+rpzyhC5sEV5lvSbM8oQubBKcMZTOEYm666qoUeN6n7DY3qWmUBHfJbV8IhmAIOoqDq7xu3/hMF7TZIpenHHs5CoqDq6SvHCsVxcHpnWcIE7vNJTSZoq16s4tCnA6ZBi4FudGK2lRO6jY3SJPrfVYK2Ynd5iS4mraoNI0apMklQypzE4jHdg/uGgqGYAgbzc7UNpUSs0WedpUqbSolKkw17FXaVEpUi3k2D3Jar9mEZonPU64WJ/ealeBbf5neCEeCK2Wi0ghHgktB6vDJFYWoNI1KaHLJUHN6KZaEJhOfvhEMwRBU+ttKcDX50PE4qsU8C02VNpV9mjztKrU9KyY+VaI7gHctRJ1Pph1ZzemNcPo0uSJZDRliXNvSkyEeQ6CykQPgi3x8IxiCIdSbXXWPo5hnC3fVPQ6eiGCjOb0QW0KzxKSUFWo4JTQZw3rVseUy7FEVUB0Z4nEmlKMQxk0O0w4kSnAZdpXKoxJ8hl1jrjDx6RvBEAyh3mxreOdZ1Fv2HaZqDXWPQ+aUbWnWNT0rrsNA6oaAb4ujqtfKuXCr6p1Xi1mWrlY1Da+VL72oPrYRnzypIfX36Z/PsGvoCsGGRiohaVdp2UlL1zvv9gSaHbvmFyq16yW42lXqeK2yXWXXssOULp8cfah1vNYoZWLf1UrPa83zRVsaER5XCkyHT74ITz3aCobgCkBN0/oD9gdI9DwrnmPsOt45V5MPnVwrV6MYnUlcKfL0oa5rea05lq5Wut55q9NDy9KZqGnKEEcfar18fRQR2Bp2vbmSZYnYfSMYgiHo5gMBe2Wl61nJ71jR1MzXc9DU2X3BVTRMa2yZaKq0OpXgKjyXmgxpzhXbPtRaO3ji+2wNu97Y5lkidt8IhmAIdY18PVfZ2Zqm1woweMoaXitbFLKP+NRZ85HfsYGud25LUwhhNLa2NHWUMkfxwl5PYEOhaZSEXBvaa1tIgyEYwkZLPzVkuy1u0yA15DMikM+2ac2n+oTiKFSm2t82oVmw51O1v21Ck4HPTtxtTluGLPhsddXaVEokMmTBZ6PdQ0+h25wEB58ymvA9V3wjGIIBCCEnseJuGqk4LHLnvZ7AZrurdMIXiCpWAnYL1DInXdbM19uE9a1OD61uT5nPvlI2p9nsRIqjrPg+5X02ayFbbbW6NBIcfEplVVaVIYY1HynzqjQ5ZEgqdPW5Yj8/peFSlqECz3qab7AYAiK6l4heJqJTRPTIiM//VyJ6Jv7310T01oHPfkpEzxLR00R0kuN5TNHs9NDtCWUFmSgOC+vf6EStMcseoxDpragqq/6EMqe51ZKKQ3FsC1Ipm9NU7S0hwRERyPfiU4akolOOQhJnwp5P1bHlkKG+8dHj02Zsk4Jzmk7TXosI1LibACLKAvgUgHsQ9SB+kogeF0K8MHDbTwD8ohDiDSK6D8CjAN4x8PldQogLts9ii83kpfvz5nRq/gADEYGNl6OplCWfLN6cxtkFwNJTbvn3WvtK2V9U2Tc+/rzWZGw1+fQpQ2WGNI10JrTH1nJR3Dc4IoI7AZwSQrwqhGgB+CKA+wdvEEL8tRDijfjX7yNqUr/rkLx0Rc+qn0qw9871lTKDp6yZMrGZUPp8cnhz6lVAAR6vVTsiYOAzMT4evVbdaCtVGWIweDqH2AA7GUoDHIbgGgCnB34/E18bh18G8F8HfhcAvklETxHRQ+O+REQPEdFJIjq5urpq9cDjsKkZBsoqmiwRgbZSTiEisJhQdW0+GTxl3Tw2gzenK0Mci6h10zy2z2iLQYb05wpnqs+fDKUB69QQgFHV2UaepiCiuxAZgn8wcPldQoizRLQI4FtE9JIQ4rs7/qAQjyJKKeH48eNOTmvUNT3lXDaDUj5jl8fW9FqLuSzyWbvOS7p8lvIZZCxbKm7qepB5+wNlOg1iAJ4IT3dsWdJRiu0bJTh2nun0XIjuY1zzUeUzactpY3z0xpazLadPcEQEZwBcN/D7tQDODt9ERH8fwH8EcL8Q4qK8LoQ4G/+/AuCriFJNqWBTUykDkWLjSNOoeufyXqtFN82FPiKy51MzxM7ELRV9phJkS0WfC7eFrH2v5A3NCK+Uz4DIcuHWMO3mc+F2pmCfpkkWqJX5tE/1pQEOQ/AkgGNEdCMRFQA8AODxwRuI6HoAXwHwMSHE3w5crxDRrPwZwPsBPMfwTEbQTSUAkRfJsXCr6kECUe7TatFNM8QGOPjUC7Gje3Pe+awU7PjUTSUQSYNnv8VRlc++Yfe3yUH2+LBLaeqNbSGXQSGb8bpltZjLIJshKxlKA9apISFEh4geBvANAFkAnxNCPE9EH48//wyAfwngIID/ENf57wghjgNYAvDV+FoOwB8JIb5u+0ym0PWU5b0sC7c6EUEx59VTBjj41POUo3uzLF6rbrRlFxEYyJBlQTbdiCC6lyna0o2erVJD+jJULtryqTe20rDvtYiAY40AQognADwxdO0zAz//CoBfGfG9VwG8dfh6WtjQ3BIHwN6b01x0A+KIgGPRTcv42PKZQkRgEm1ZRj6pyJDmFkfAvj+A/O6MQttRCQ4ZyhCU+hVLRMbHbo0gnyWltqODNPdaRBBOFg8gHW9Of12iXOCJCGZ0lTLHzhatKMTSm2t2QASUFFqASlhHBK0OchlCQaEFqIRtn9t6q4NCLoO8Bk2OiGAmn0VWoe2oBEdEUCmotR2VsOezqyWzQGTw9lpEEAzBAKQ3p+XlWHtzXX0vx9aba6k3V09oMkQ+pXxGS3GUGfgs59Waq0tUiznr7cBlxVanEmXLdYnNpnqJEglrT1mjFEtC03JsN1sdrUgLiGXI6n12jMbWtkeJbwRDMIDN+KXrKA7bjkSyjryO4qhYehw6fV/7NG29OfXibxJVy36+GxrF/CTKBXua+nzayZBOoUQJHhnSH1uOuaIDaxkyHNu91pwmGIIBbLQ6WotfgL3132yplyyWKFvnPfXDXdvFYqMQ23JsdcoHS9imaTZbXW0Zsk71xSkTLZrWht1MhmzTNGZzxZJPI50QDMGexYZBiF229ji62uGude68pR8R2G4f3Wh2tBYzAblN1m6NQJembZpmo2WQSihabgc2SJnYp/r0+Yzmin8Z8s9nWCze09hsdYy8nGanZ9yCb1OjiYlEOc61mrbg2zDwzmVEYNqCT6dGv4TthNowiLasIwIDT9n+gGAKnrJB5MMSEZjIkOW2Z/25EhaL9zQ2mvoLYEk1UMN2eJFS1vdygH7te11sGqwRlItZ9ASMW/DVDb25Vte8t+6mQbRVLmTRaEflyE2wYRBtVQpZbLYtDLvJ2MZbOY0Nu8Eiapkj8jGJKi0PQurrhBAR7GkYRQSWxdE2jRaj7I7rm0YEgHkNFdO1EKDfy0AXGwbRllzoNfUizbYb5iBE1JvCBCYLmuVCDp2eQMs0kjXgs1rIodXpoW0cPZtFPlvtroVhN5gr8UL8XmpgHwzBAEy2xEkPxXSXgNxuqIN+AS8bBWnGpzlNg7WQ+P66qcEzGFvbWv11kx1ZljK0aSJDlu/ThE/birIbTYO1EMvy12ZzJYeeiFpr7hUEQzAAk3y9rQdpst2wzOGdG2xxBMyjkE2N3sEStiWaTbf+ye+awESGbKNKnb7MwzR9ypBNjwnd/tMJTYsGR7r9pyWqljKUBoIhGIDJPmVbD9IkxLbtjLah0URewra2u1U6yoBP3f7TEjZ9bmX/aZPto4CZ4tDtPy1hoyCj9I4w2k0T0dTnM+k/7TGlqdt/WoKjV7JvBEMQQyoO0zSNiXBLL8dk4RYwVxxbbb+phHa84GuajjKJCHT7T0vYeK2y/7TJ9lHATCnr9p+WsCmXbFLMD7CTId2uehKJDBmMrW63OQnbqDINBEMQo9XtodMT5hGBgaA12r2ocb1pRGAwoRIvx3Dh1sTg9fvbmi6KmyhIvTLJEjZea1LG3GOqT7c6poRNOsqkmB9gF/nY8mk0tgZlzAG7uZIWgiGIkTSgMPXmDARNtxn3ME2jCaXZ1nAHTRtvzjQiMFLK+mWSgYH8rgGf/TLm/iIC3Y5oElYRgUEBQWBgPc3I+NjKUAoRQUgN7T30Bc1fRNA3PqYRgYnxSSMiMFPKfW/OJiLwx+eG5fu08VrN15ksZMhjStM02rLZap2GDKWFYAhi9NMXprlz/ZdeN/WULfrc9ltjGm7lNIoIDNM0DGOr/z5z8fctvFZT79wmqjSUIbP3abpGYG7YbaPKvSJDaYHFEBDRvUT0MhGdIqJHRnxORPRv48+fIaK3qX7XF3QbY0vkshkUDfvcmvRIBuz63Oo245aYyWejPrdGHqQZn3Y5ZUM+LRaoTWXIbi3EjGY/TeNPhsoWGyts+TSKKuPv6G9ZtTu7kAasDQERZQF8CsB9AG4H8FEiun3otvsAHIv/PQTg0xrf9QKTrl0SFcOaOKYhtk2fW9OF26TPrcWE0h3bbIYwkzfj06T/NGDX59Y0lZD0ubVImejKUCkXGXYbPrUP6+Vt1plSSPUZdNUD7FKaaUFf6+3EnQBOxW0nQURfBHA/gBcG7rkfwB+I6Mz194noKiI6AuCownfZ8IUfvIbv/u3qyM9Wak0A+i9dfsfnohtg3h/ANJUAmHd7SiaUprIC4uP6RrtpzNZ8APM+t6Zpt6TPrcUCta4MZTKEct6sJ7RphCejZ7t1Jn3Dns+S4RqemQwVcxlkDKPnl8/X8O++88rEkhifuOst+HvXzGv/7UngMATXADg98PsZAO9QuOcaxe8CAIjoIUTRBK6//nqjB71Qa+LHq/Wxn9959ACOHqpo/13THqWmC7eAebenTcNFN0nTbF3CnE/TngQmvYMljCOfJMIzGFvDypx1m7E1fJ+mO+yAKM1itFhsMVdMq7uaypBN9PyN58/jT585h5uXqmPvMS02OQkchmBUa61hczbuHpXvRheFeBTAowBw/Phxo2pOv3r3Mfzq3cdMvjoRpj1KTb0cwLzUrXVEYOGdm/Bp2jHM1JsDZGVOf6kEwLwyp+RTp/+0hGlfC9NtlYB5X4uk/3ReP5sdzRWzaEu3/7SEcVTZ6qCYy+Cbn/xF7e/agMMQnAFw3cDv1wI4q3hPQeG7ux6mXcqsPWULr9UoHWXYpSzJ12v0gk5oGkY+Jv2nJaIG9maecjZDWv2nJSoWXqtu/2kJ0053Jv2nJYxlqKXfuF7CtCeBSf9piYqFDJlElLbg2DX0JIBjRHQjERUAPADg8aF7Hgfwj+LdQ+8EsCaEOKf43V0P0zz2RrODjKmXY9gXtd7sGCuOimGHqc1WB6V8BjkDz8q0J7SsGqnTf7pP0+x91mOaRorDYmx1F4olqobrTHWDQokSpmshJn22JSIZMqNpyqfxGp5BbwkOWBsCIUQHwMMAvgHgRQBfEkI8T0QfJ6KPx7c9AeBVAKcAfBbAP5n0Xdtn8g1zL6dj7uUY5pQ3DUr5JjSN87v6FTklTNMXmwb9pyVMu3eZVOSUsIm2TKI7wDx9EbUAtVCQFhGBEU3jlKZ+AUEJ05SmzVyxAQtFIcQTiJT94LXPDPwsAHxC9bt7DeZ5T/0a/RKmfW7tJ5RfPk3TFyb9pyVM+9yadJuTKJsu/ltEBJVCDmfe2NL+nhWfhSxW1pva37NyYAo5vLFpwqd+LwKJSjGH1ZoBnwZd9TgQThYzwDYiMKVpunBrPonN+Kwb1OiXMF24Nek216dpHm2ZRwTm6SjjiMBi8d+YT4uo0vx9mkY+FtGW6WYOi7lig2AIGFAu5Iz63NpY/3IxZ9TnNuoUZjOh9PvcmpT3ljBduDXpPy0R5Xc9RwSGGw5Mei5I2GwHNuXTdGPFZss8wjOOKi2jLdPNHHtyjSDA/Ej5hk2utZA16nO7aRHulgs5dHtCu4G9SacwiUoha9Tn1iYiKBeyRn1uTfoyS5j2ubWRIdMDgjZ8li02Vhg7MMZ82q2/mEY+pgvUNgiGgAH9Y+y6StnCyzE8xm6zuCifVZtPCw+y3x9Ak08bTzkeH92DO5sW0Va5EDew1+xzayNDlWIO7a5AS9ew26xtFXJodnroaBt2u7my2TKJni0jApPo2WJsbRAMAQP6lTn1IwIbT1n+DS2arU5Sc1+bpmGTD5uIoN8fwGBsLbw5E5rRtkrTrZxmMmS3U8lGhsyjkOhv6BlZkzayEnJsNzUNu40MVYpm0bPNepoNgiFggGnHMJvFYtPKnHZrBGY0Ny12KpkWDbMzsmYGzyqVYMyn+QGksun7tIkqDTrAJf2nbcdW432a9p+WqBg4E51uD82Ofv9pDgRDwADThhs2YWDVMGVit0ZgVj2ybrH1z6Tbk2n/6T5N/bFN+k8b09Tn07T/dELTIKXZ6vTQ6ur3n05oGqQ0k/7TtjKkwadp/2kJk3SxjFhM01E2CIaAASbdnvqKw1/6otcTVl6riTfXb1zvL/Ix7T8tYZIySfpPW6wRAHpja1NhFTCToS3DMuYS/XUmHT7NS7EAZj2hTTuiSSQypMOnYbc5DgRDwAATb67Z6aEnzAqxAWbe3Jalx2ESEZjWrpcwSbvZVMcEzBaobYr5AWZeq2lXvYSmgQzZ8tlXyho0Dct7S5jwadp/WsJkM4dphzsOBEPAABNvrt96z3LRTcfLsagaCZhFPqadpSRM0m6m/acl0vDmTPLYaciQaf9pCZOt1jblvQFDGbJ8n0aRT4gI9jZMerFae8oGXmvSKcz4EJu+12raKUzCzJuz85STiMCjN5fIkAmfHmXItP+0RNmAT5vy3oBhVGn5Po0inxAR7G2Y5FrlNkHbbXg62w3rlh5k1WD7qGnvYAmT3RcJn5b5XZ2xNe1XnNA04NO0d/Awzf3Cp08ZMpkrthGeDYIhYEA+Luus583ZhdjFXNTA3meILfvc6qQv6kl+13ahzyDy8biVM+lmZbkQb5ICM1/QNOfTZn89YLhwa5nS1Er12S5QG6TATHuYcyAYAiboHmO3DbFN+tzahtiyz62WwbNMR2UzhFJer8+tLZ8mDeyTjmiGfCZ9brUWUe1kaMagmbxNtzmg35zIaOHWMqWplwLjSUeZyFBYI9jD0C1sZdp0fBC6VTL7Stmcpm63J9sFakC/uqvtAjUgS4v785STPrcGfJpGBJkMadcbsumqB/Qb2OtFPnYRQSEbRc96KU3L6Dmf0Y6ebWXIBsEQMEG31O2GpacMyFK3/iICQJZL1l/QtOJTs9+DraccfVevMucmw9imwadudVfbiACIHRitVJ9dRCCjZ5Ntsqbvs2/Y9fk06T9tCytDQEQHiOhbRPRK/P/VI+65joj+nIheJKLniejXBj77HSJ6nYiejv990OZ50oTxhLKNCHS8HIbFKN3OaBsM4a5vTxnQr8y5wRBtGfNpJUOakY9F/2kJ3Vr9G61u1Lg+Z2d8tCICi/7TEtoyZNF/2ha2FB8BcEIIcQzAifj3YXQA/IYQ4jYA7wTwCSK6feDz3xdC3BH/27OdynT73Na5IgKtNQK7bZUAtHsl9xfd/PFZ51BWmn1uZf9pK8WhKUMbrS7yWbJSHOWCJp+tTrRRwaD/tERFsxXoRrODct6s/7SErvGpx72DTdrISuj2SrapdmoLW0NwP4DH4p8fA/Ch4RuEEOeEED+Mf64h6k18jSXdXQdd4d5sdUDUX7AzpqnpneezhKKlZ6W76GatODS7Wm3Gk9hGcej2uZUVVq0Uh2ZUaVNYT6KqndK0r5dfLuqlaWwqrEpUNZsNbTL0BdCOtix6aNjC1hAsCSHOAZHCB7A46WYiOgrgZwH8zcDlh4noGSL63KjU0sB3HyKik0R0cnV11fKx+aGvILvGjetNadrUGUpo6npzDJNYt9vTBgefmt27Npvm1TEHaeqmo2xp6qc07evlVzXTNDYVViW0U5oMncJ0W7tuWnTVs8VUQ0BE3yai50b8u1+HEBFVAXwZwK8LIdbjy58GcBOAOwCcA/B7474vhHhUCHFcCHF8YWFBh7QX6OYDbXoHS+imo6L66rbCrenNWTSlSWhqdnuyaeguob0duGVeYVUi6iGs57VyyJBuWQt746MfEfDMFb2FW3sHRn+BOq2IYCpVIcT7xn1GRMtEdEQIcY6IjgBYGXNfHpER+EMhxFcG/vbywD2fBfCnOg+/m6Db5zbqoMXh5eh6cwyesm5EwBCF6EZbthOqrJ1KYIgIdFN9DO/TSIZslbJ2SpMn8vEeERRzeO3SpvL9Nv2nbWGbGnocwIPxzw8C+NrwDRTlPv4TgBeFEP9m6LMjA79+GMBzls+TGnT73Mo8tg0qBb0+tzb18iWkN6dKkyOVoLuIatNzQUL/gKD9+9TdPrrJEOFVtHfw2HvK2nwyRFtRT2jNdQlrw64ZEVj0n7aFrSH4XQD3ENErAO6JfwcRvYmI5A6gdwH4GID3jtgm+q+I6FkiegbAXQA+afk8qUG3zy2Hp1wu6vW5teksJVEp5tDpCbQUe85ypBJ0+9xyesqqfW43GSI86SmrG3aeyEe3xLf3iIAh2ioXdLda88iQ7iE2W8NuCitOhRAXAdw94vpZAB+Mf/4rACNXRIUQH7Ohv5swWHhOZbfBRrOLg9WCFc3B4mgqh1DqzQ7edFXJiuZgTwKV3UcbzS4OVYs8NFtdzM9M9102mh28ad6Oz6Rccrur+D47uOFg2YpmuZhFLzbsKu+TY7thpZBFK24epLINlaOnbrmQQ6MdGXaV3WQc0VYlPnzZ6wml3WR1jmgrjkKEEEqbQjaaHWvjY4pwspgJUlmo7rHn2IZXLekV8LJpOp7Q1CwaVm92kuc0xawunxxjW8xr0aw3O8lzmmI2DRnSfJ8bLfv3mcitYtqEQ4bk91Ub2HPJkE4D+3qzk8iAbwRDwITEEDTUJlSNQdCkZ6aqOOoNnv3YAFBT5JPD+FQ0FSQHn9LTVuWTw1PW5pNDhjRoCiGYZEi9/LUQgkUpVzTmZ68nWDZzVDVkqB03rrelaYpgCJigW16X05tLQ3Go5Hi5FIeusvId+che0Fx8qtDkUhw6MtTsRL2g2WRIgeZWu4uesCvdAejxKWXbJ5+2fR5sEQwBE3QErcukOHRSQ1JxcKWjfCqOWQPFYZ1K0JnEseLwmRqybdYioSNDbDQ1+LRt4DRMU43PKH3EJUM6fIbU0B6Hicdhqzh0PGUuj0MnBcY1iXXCenkPl3de05jEbJGPAp8y3cA1tj751JIhZj7VlHJ723dMYWIIQkSwx2HiWdm+dB0PMlHKPj3lFD1IW89KZ4Ga3TtXSLsl6QumKESFTzbvXGtsuzw0tWQoomkrQ0bRluX7NEUwBEyo6nhW3F5OGt65Ap81Ju88Dc/KhE8uZaWyuMgd+Xj1zgvqc6XG7Z2nMbZaMrQ3TxYHxJA9hH16VlGZ3N3rnUuaXCkwr16rFp+8OeU0vHOtRVSP24Hl2NrKkE60xTW2ems+MvLJW9E0RTAETCCiqP64jnduKdxEhGohp+ZZMXk52QxhJp/V4tOWZiEXNevwGW1Jw67GZ+y1MhRjI/K7iKqzBZnLa9WLZHkjAqVoK421rYTPEBHseVSLao0okjUChroi1ZLaMXYuzyqh6dGzAiLvSmcHD4uRVRzbOtPYSsOutWvIkmY27lusl6+381rzcd/iupIM8awR6ETsXGOrE7H31yVCRLDnERmC9tT7pFfCoZSjLkj+PCsg4lPFs+Ja6AOgHm0lkY+9Z1VRjLbqDb6xVY8q47FlcCb0Zch+bKua79NWhpKIXWudyY5PnYidU25NEAwBIyIPUiMiYFLKKlEIl2cl/4aalxMpDo6dELp8cnhWs6rRlmzHyaEgVaMtRsUxqzm2fiPZDrIZQilvr6qqGoagkM1YdfJLaCrLUAelvF0nPxsEQ8CISlHR+jN5HID0rKZHIYniYKhuqNq3mKN3sIRqtFVvtpEhsCgOVQ+y1uBTHBXVaItRcVQ0ZKhi2QI0oamYApPF32w6+UnoRCFcnrmODHE4aaYIhoARqnnserPL53EUFaOQVgcz+SyL4qgW82oeZCzcHIpDPdqKqoWyKQ7FCI9r/7eqDEWKgyefrCxDjHxWS+qGYLbExKditMXKp44MBUNwZaBSVN1N02YTNB2Pg+vUYrWYVfLOOcokS6ThWSlHW6x8qkVbkeLgG1vVSJZPhhQNAbd3rnJqu2lfQFBCT4b2qCEgogNE9C0ieiX+f2TzeSL6adyA5mkiOqn7/b0C1TaOG4xNqqspKQ4VD5JXcajzyUVTtc8tR+XRPs10xlb17AKXkVXlk6MjmoTeXElBhvaqIQDwCIATQohjAE7Ev4/DXUKIO4QQxw2/v+sxW8yhrtBhijWsj0PsaTQ5arpvo6m4H5uriJZyfpc1rM8re60cO8CASIZqih4kW+SjkabhjLZU1kLYIzxVPtOQoT1sCO4H8Fj882MAPuT5+7sKlWLUOnJan1Ju71yl+QWn11ot5NDq9tDsTOeTzzvPKfWE5lVWUT/fae0qOb3WSjGXdLWaSJPZO/cdbalGIdx87tpIllGGTGBrCJaEEOcAIP5/ccx9AsA3iegpInrI4PsgooeI6CQRnVxdXbV8bDdQPa7PqaykFzHNu+L0WvvFtCZPKm4PUv5NbzRLsWGf0tWqzum1liLDPq0PNafXOlvModWJ2lVOQo3Ra60W89hqd6f2oeaeK/XmdMPO6Z0rR+wNvvdpgqmGgIi+TUTPjfh3vwaddwkh3gbgPgCfIKJ36z6oEOJRIcRxIcTxhYUF3a97gaqy4vaU5d+cSJPZa1Wh6cIQTOUzhbFNw+DtfRnq96GeBE7vXP6daYade2xVI/Y0dw1NpSyEeN+4z4homYiOCCHOEdERACtj/sbZ+P8VIvoqgDsBfBeA0vf3ClSVFUd/22GaKoqDOwpR8s7Zo5B0lPLShPs4x3ZQhhZmi2Pv4/XO+3xeXSmMvCdpGckVhQy8z/mZ0etlkiZ/JDv+fck2lS7mSmnMeRquplE2sE0NPQ7gwfjnBwF8bfgGIqoQ0az8GcD7ATyn+v29BNUiU6z5ekWlzLnoplJeV05ibm9u0jZHrv62Eiqli7n620qojC13f1sVGWp2emh37bvNSajwydWmUkKl8BxXm0oJFZ2QdptKwN4Q/C6Ae4joFQD3xL+DiN5ERE/E9ywB+Csi+hGAHwD4MyHE1yd9f69CZULJNpU+PWVuj0NlLYRbcag0UOFqUymhEuFxdZuTUIm2uEqKS6jIEDtNBT45ixYO/p3JfPKUFB+mqcJnmruGrCgLIS4CuHvE9bMAPhj//CqAt+p8f69C5aU78zgUJjG7B6ng5fj0rLgaigzTnBSFcLcYVOLT0dj65FNFhrgKzkmozBXO4oyAniHYyxFBwADS8KxUPEiu/gcSWp5VChOKy7NSaaDizDufUAqB22tVibbYvXOlsU1DhnjaVCY0dWRoN+8aClCHSrtKV15rGh7kpAnF1WJQIg3PSolPZq9VJY/N7bXqRFtsMqTQrtKZDKUQVarJUDolqIFgCFih0vyC2ztXaX6RRn6XsxEOoLbF0VVOWYVPn9EWZ0lxQG3Nh6vhj4RatMUrQyrRFrcMqa35pNumEgiGgBWyq9Ukby5pSsMkaESEajGH9Qk05Wdck1h2tZrMZ9yLgInPQi7qaqU0tkx8FnMZ5LPklc9yIYsMTY4IJE02I1uYHoWkEflwj60OTW7jo8RnSA1dOZifyWNta3ytGPnZuL3TpjTXJ9Bcd0QzDT590iSiVGjOeaaZzRBmSzmvNHPZDCqFrFeapXwWxVxGieYcE82ZfBb5LHmfK7oIhoAZ+0FB7laa68yTWP6t3cZnGs7E2mZ6fHK+z/mZfMLLKKxvtUHEG7Gr8JnNEEvTKFMEQ8CM1ITb8yRWVZBe+WSexJLmRAW51UYuTpVx0pzGZyGXGXtS1RXNmXwWhRyfylCRodliDlmGxkYSKnzOlfIszZQkVPicn8mzNFMyRTAEzJj20te32iimMInLhSzyjP1QVRTklTCJVWhyT2KVyIc7jaDKp2+anI6EKk0XfE6bK2mmhYBgCNiRxksPk7hP80oY27l9JEPT1rauFD59zxVdBEPAjLlS9NLHlZ118dJVQs85pr6vEml4raohNivNkkL6Ig3FwbzDRIXPNN7n3Awvn2pK2e/YupgrugiGgBnzM3m0uwJbY0rduvI4mp0eGp5pbra6aI+pJ+9KcdQanbHNaVx6reNq2Lv0Wic5E+w0y/sjwtsv0ZYugiFghnyh4168K+EGMFbAXU1i+bfH0XQxoQCMbeXoimZPAPUxh5Bc0ezExQl90pzkTLgyeL6difmZPGrNSc7E+LLYNjQnORMRn+mdIQCCIWBHmgpyHE1Xk3gSzbT4dGbwxmw5dDGJp47tZjrOxJUkQ6P4FEI4k6FxzoQQAusNfuOji2AImKGmOK6cCTWRZtkfTSGE02hrHE0Xk3gSn72eQG1CMxcXNNvdHjZaXa80m50uGu2eV5qNdg+trkOaI3RCPY5OgiG4wjBJ0Lo9gVqj4zVN42oST1KQaUzirXYX7S7/hJrkQbqaxJP4rDU6EIL3fMY0mv2T6f4iHxeH5tKiOWmuuKKpi2AImDF5EvsXbteTeJSCdHGYbJDmla44VMbWqwzFdXK4I7xJCtLFKXGgz8P6iHWmNN7n+lbHCU1dWBkCIjpARN8iolfi/68ecc8tRPT0wL91Ivr1+LPfIaLXBz77oM3z7AbsWmXlKE0zWrivIKVc3qXv8wqiuVsMXpo09/o5gkcAnBBCHANwIv59G4QQLwsh7hBC3AHg5wBsAvjqwC2/Lz8XQjwx/P29htlSDkR+hVvuKd9twu2VpoMyGlNpOprEaaQSdt37vJJopuBM6MLWENwP4LH458cAfGjK/XcD+LEQ4u8s6e5aZDKE2eLoSo6uXnoum0HVM81CLoOZ/Ojqka5olvIZFLKjq0e6olkpZJHNjK4e6SrymS0qOBPcaZo0nYkRi6hXlCFQSt3ubUOwJIQ4BwDx/4tT7n8AwBeGrj1MRM8Q0edGpZYkiOghIjpJRCdXV1ftntoxxh3OcWn9xx1auZJoyhLNPqOtSdUjXdHMZGjsadQ0nQnuyGeiM+EowivFhfN2izOxZyICIvo2ET034t/9OoSIqADgfwLwxwOXPw3gJgB3ADgH4PfGfV8I8agQ4rgQ4vjCwoIOae9IQymPU5CuFt2ACXw6msTR3/Qb+ci/uZ9puvRax/MZLaK6kttJzsQsczmWac5ENkNszXdMMZW6EOJ94z4jomUiOiKEOEdERwCsTPhT9wH4oRBieeBvJz8T0WcB/KnaY+9upDOJd5OCjCexg45Lk5QVEV9nqUGMq4njchJPkqF8ljDDWL1WYlK0VcpnUMzx05zEZ4W5Yu40mutbbcyWeCvmTqO5thXVjUqzBDVgnxp6HMCD8c8PAvjahHs/iqG0UGw8JD4M4DnL59kVmPTSC9kMSnl/wu1yEkcKcudpybWtNqrFHHIeJ/HaVlT2mrME9SDNcQrS1SSexOf8jJva9WOdCQcnmfs0J/N5pdCc5EyknRYC7A3B7wK4h4heAXBP/DuI6E1ElOwAIqJy/PlXhr7/r4joWSJ6BsBdAD5p+Ty7AvNjFKQ8vp6G4nCBSQoylUnMvIA6naa70gCTvFZXWw13m4K8kvhMY67owCqmFUJcRLQTaPj6WQAfHPh9E8DBEfd9zIb+boUMsYUQ25R+9NLd5AJ3m2fldBKP2WXijs/xaTe3CnJ0tHUlecrzM3m8cHa0wXNJ85WV2o7rrvl87eLGSJppnyEAwsliJzhYKaDV7aHW3D6RL9ZbOFApOKF5oFJEo93DxgiaV5fd0DxYLaDe7OyoWHlxo4kDFTfCfaBSxHqjg2ZnO81LG+74PFAp4vJWe0eVzIv1Jq529D4PVgp4Y7O1o0rmhXoTBxzyeWmjtaNK5sWNplMZurDR2lFy+8JG0+FcKeBifSdN1+/zYr214/pFh3zqIBgCB1iaKwEAVtYb264vrzeSz/hpFhMa22jWGjg874bm4mxEc2W9ue36ynrTOZ+rte00z683cNghTSEiJTyI5fWmU5rdnsDFjaGxrTWx5Oh9Ls0V0e4KvLG5XWEtrzedylCr09sRibiWoc1WF/UBp0kI4fR9Ls4VUWt2tjlqrmnqIBgCB5ACvDygIF2/9MNp0IyVw3Ktb3x6PYGVmkOlPL+Tz25PYLXmTlmNGtt2t4eLGy6VlXQm+jSbnS4ubbS8ylCj3cXaVtsZn4dHvM96s4N6s+PsfY6an7VmB1vtrvOxXRlwYNa22mh1es7GVgfBEDiAfLHn1/oKcr0RCZqrl76YCHef5uXNSNAWHSurQT4vbbbQ7gp3CnJ2J58X6k30BLzyuVprQgg4NwSDNKVRkFERN0bJkPzZOZ8jabrhc2kUn/E4LzqmOfg+zzseWx0EQ+AASZqmNjiJXQvaztSQpO/MOx+hlF1P4r4HOYLmrCsFGafAajtpHp53rKwGZajmVnGMHlu3xmeyDLmOCHby6S7VJyMCf2Org2AIHKBcyGG2lEu8DMC9oM2W8qgUstvCXel9uBK0uZkcSvmM10l8dTmPQjYz5EHGY+solXCoUkQ2Q9u8Ocnn4qwjmtUCMoRtMnR+TSoONzQXqpGcDI6t/Nll7hzA0FxxbQjG8+mc5iCfa25p6iAYAkc4PFfarpQ9hIFLc6VtSrmfSnBDk4himn0+lz3QXJwrbsudux7bTIawOFscyacr45PLZnCoOkzTrVIu5DI4VC1so9mPZN3QLOWzuKqc3xb5uJYh6aitjBhbVzRHOWrLjrMEOgiGwBGW5kpj8p7+DMF5D4I2zOf5tQaIgAVHaZqE5rbceQMZAg5V3dIcHtt8lpxt5QQiIzMsQ4VcBlc5OjgHRBHO8tD7nMlnnZQLkTg8V0qiHUmzWsw5rb9zeEiGltcbmCvlMFPgP4EvMUqGDlQKTk796yIYAkdYmitt2z664kXQikOelXtB28FnrYGDlaKTGjESh+dKO/hcmC06qREjsTRX3JECW5wtOSlpITGslKPtx0WndWkOzw/RrDWd01ycK23Lna/UGs7z5ksjZMhVdLeN5lBKc9Ghw6SDYAgcYWmuiJVaMzmcc97hGYI+zShNIw/KRMrK8YSaLeL8eiOheX7N/SRenCtuz5073HMuMSrCcx3SDxuf8+uNZHHVF83ltYaztFBCc7a4fTfNmvu5ko4MFXfI0G5YHwCCIXCGpbkSOj2BixvR4RyXh3IGabY6PVyOSzAsexDuw/MlNNq9pK+tjwMyS3MlbAwcCFrxZGRrjQ42W30+XSvlw3MlvLHZTk5RuzxkJbE4W8KFeis5Rb3s8EyIxOH5Ei7Um+hImj7kdq60zVFbiSM8l4ii5+2O2m44TAYEQ+AMw1vUlj0JGtBfG/AhaNJblOmhlZp7D/Lw0NieX/eTSgD6C/C+UgnDNH0YdkCekxBJOsolFudK6AngYlxqIkoNuR/bTk/g0mYrPgTZdLYVeJBmqxs5ap1uDxfqzV2xdRQIhsAZBvf1+xI0+feX1xveBO3wgPFpdXq4UHd38lVicMtho93F5c22e691gM/NVge1Rsd9amhgX3+t0cZGq+vB4PW3Vq5vddBouz/5moztWgOXNuSBRD+G/fxaAxc2muj23B2C3EFzvYEL9RZ6As7Khegi3bY4VzCkZ3V+3Z+gLQ4czlmNT9u6FrTB/dH9A0/+jI/0lp3nsQcM+/m14rbncE3z/Hoj2SnkKwpZXmugUshtu+aOZp/PXDZalPY1tsvrDcjac+6jrT6fzU6UBnOdXlRFMASOsDhbwlwph6dfu5wc1HnLQtUpzcPzJVSLOTx9+jLm4nZ7rmkemZ9BuZDF06cvJzui3rLoluY1V89gJh/RlDuFXNO87kAZxVwGT5++nFQEdU3z+gNlFLIZPP3aZWy1onWCmxy/zxsOVpDPEp4+fRnrjWityTWfRw9VkMsQfnT6clLYzzXNNx+qIkPA06cvJxsqfNAkAp5+7TKujg27a5qqCIbAEbIZwi/esog/f3klaqFYzOH40QNOaeazGbz75kM48eIKWh2BuVIOP3fD1U5pFnIZ/MKxQ/jOSyvYbHVxVTmPn73eLc1iLot3vSXi8/JmGwcrBbz12quc0izls/gfbjqIEy+uYGW9iYXZIv7em+ad0iwXcnjnTQfxnZdW8PrlLSzNFfEzb5pzSrNazOEdNx7EiZdW8JMLFbxpvoRbD886pTlXyuPtRw/gOy+t4JqrZnDdgRnnCnK+nMfxGw7gxIsrWJwr4ujBMt58qOKU5tWVAt52/dX4zksruKqcx5sXKjjqmKYqrNYIiOiXiOh5IuoR0fEJ991LRC8T0SkiemTg+gEi+hYRvRL/71aDeMbdty7iQr2F//Lfz+LdNy+gkHO/JPPeW5ewUmvi//3RWbznlkUn7SKHcfetSzi31sCfPXMOd92y6HQ/f0LztkW8fnkLX3/uPN7jjeYSXru0iW+9sIz33rLo9AxBQvPWRbx6YQMnXlzBe29d8tLb9r23LuLUSh1/8fIq3nvbohead9+2iJfO1/DdV1Zxty8+b1vEC+fW8b1TF7yO7bOvr+G//fgi7r510Tk9VdhqiecA/M8AvjvuBiLKAvgUoub1twP4KBHdHn/8CIATQohjAE7Ev18xeM8tC8hmCK1uD3ff5uel33XLAojgl+ati95pyknU6vbwPl80b+vT9Mbnbf75fN9tSwnNu+OfXUPSaXeFt7GV49nuCu9j2+kJb2OrAitDIIR4UQjx8pTb7gRwSgjxqhCiBeCLAO6PP7sfwGPxz48B+JDN8+w2XFUu4OduuBoZAt5zix9BO1gt4m3XX41shvCem/3QXJgt4q3XXoVchvDumxe80FycK+HvXzuPfJbwC55oHpmfwe1H5lDIZfAPjh3yQvPaq8u49fAsSvkM3vUWPzSvP1jGscUqZvJZ/Pybd3SYdYIbD1Xw5oUKKoUs3nGjH5o3LVRxw8EyZos5vP1Gt2lbiZuXqrj26hnMlXI47jhtqwMfawTXADg98PsZAO+If14SQpwDACHEOSIaq7mI6CEADwHA9ddf7+hR+fG/33MzXji77rUd3W+8/2a8slx31sx9FH7rA7fgx6v1ZJHaF82fXtx0WpNmGP/svlvx+htbKBf80jy/1kAp768mzW9/8Fas1ppeaf7z+27Dpc2WlxQqEBUw/BcfvA3rjY7TkijDNP+P//F2bLY6XtK2qqDhvp07biD6NoDDIz76F0KIr8X3/AWA3xRCnBzx/V8C8AEhxK/Ev38MwJ1CiF8lostCiKsG7n1DCDHVTB4/flycPLmDVEBAQEDABBDRU0KIHeu5U90aIcT7LGmfAXDdwO/XAjgb/7xMREfiaOAIgBVLWgEBAQEBmvARmzwJ4BgR3UhEBQAPAHg8/uxxAA/GPz8I4GsenicgICAgYAC220c/TERnAPw8gD8jom/E199ERE8AgBCiA+BhAN8A8CKALwkhno//xO8CuIeIXgFwT/x7QEBAQIBHTF0j2I0IawQBAQEB+hi3RrB7lq0DAgICAlJBMAQBAQEB+xzBEAQEBATscwRDEBAQELDPsScXi4loFcDfGX79EIALjI9zJSKM0WSE8ZmOMEaTkdb43CCE2FGTZU8aAhsQ0clRq+YBfYQxmowwPtMRxmgydtv4hNRQQEBAwD5HMAQBAQEB+xz70RA8mvYD7AGEMZqMMD7TEcZoMnbV+Oy7NYKAgICAgO3YjxFBQEBAQMAAgiEICAgI2OfYV4aAiO4lopeJ6BQRXVH9kU1BRD8lomeJ6GkiOhlfO0BE3yKiV+L/d09PPQ8gos8R0QoRPTdwbeyYENFvxzL1MhF9IJ2n9ocx4/M7RPR6LEdPE9EHBz7bb+NzHRH9ORG9SETPE9Gvxdd3rQztG0NARFkAnwJwH4DbAXyUiG5P96l2De4SQtwxsK/5EQAnhBDHAJyIf99P+DyAe4eujRyTWIYeAPAz8Xf+QyxrVzI+j53jAwC/H8vRHUKIJ4B9Oz4dAL8hhLgNwDsBfCIeh10rQ/vGEAC4E8ApIcSrQogWgC8CuD/lZ9qtuB/AY/HPjwH4UHqP4h9CiO8CuDR0edyY3A/gi0KIphDiJwBOIZK1KxZjxmcc9uP4nBNC/DD+uYaoD8s12MUytJ8MwTUATg/8fia+tt8hAHyTiJ4ioofia0tCiHNAJNQAFlN7ut2DcWMS5KqPh4nomTh1JNMe+3p8iOgogJ8F8DfYxTK0nwwBjbgW9s4C7xJCvA1RyuwTRPTutB9ojyHIVYRPA7gJwB0AzgH4vfj6vh0fIqoC+DKAXxdCrE+6dcQ1r2O0nwzBGQDXDfx+LYCzKT3LroEQ4mz8/wqAryIKSZeJ6AgAxP+vpPeEuwbjxiTIFQAhxLIQoiuE6AH4LPqpjX05PkSUR2QE/lAI8ZX48q6Vof1kCJ4EcIyIbiSiAqLFmcdTfqZUQUQVIpqVPwN4P4DnEI3Lg/FtDwL4WjpPuKswbkweB/AAERWJ6EYAxwD8IIXnSxVSwcX4MCI5Avbh+BARAfhPAF4UQvybgY92rQzlfBJLE0KIDhE9DOAbALIAPieEeD7lx0obSwC+GsktcgD+SAjxdSJ6EsCXiOiXAbwG4JdSfEbvIKIvAHgPgENEdAbA/wngdzFiTIQQzxPRlwC8gGi3yCeEEN1UHtwTxozPe4joDkQpjZ8C+N+A/Tk+AN4F4GMAniWip+Nr/xy7WIZCiYmAgICAfY79lBoKCAgICBiBYAgCAgIC9jmCIQgICAjY5wiGICAgIGCfIxiCgICAgH2OYAgCAgIC9jmCIQgICAjY5/j/AQTJ4GcwlvGKAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] @@ -360,10 +355,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "d51d8a62", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tap with amplitude=[4, 1], delay=[5, 6.2]\n", + "14\n", + "[ 1.55926873e-16 -1.55926873e-16 1.55926873e-16 -1.55926873e-16\n", + " 1.55926873e-16 4.00000000e+00 1.55926873e-16 -1.55926873e-16\n", + " 1.55926873e-16 -1.55926873e-16 1.55926873e-16 -1.55926873e-16\n", + " 0.00000000e+00 0.00000000e+00]\n", + "[ 0.03017707 -0.03598036 0.04454711 -0.05846808 0.08504448 -0.15591488\n", + " 0.93548928 0.23387232 -0.10394325 0.06682066 -0.04923628 0.03897872\n", + " -0.03225825 0.02751439]\n", + "[ 1. -0.03598036 0.04454711 -0.05846808 0.08504448 3.84408512\n", + " 0.93548928 0.23387232 -0.10394325 0.06682066 -0.04923628 0.03897872\n", + " -0.03225825 0.02751439]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "\n", "delay = [5,6.2]\n", @@ -403,10 +429,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "81b4ff57", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "delay = [5,6]\n", "np.max(delay)" diff --git a/simulation/QAM_Fading/qam_fading.py b/simulation/QAM_Fading/qam_fading.py index 957530d..42199d1 100755 --- a/simulation/QAM_Fading/qam_fading.py +++ b/simulation/QAM_Fading/qam_fading.py @@ -29,7 +29,6 @@ from gnuradio import blocks import numpy from gnuradio import channels from gnuradio import digital -from gnuradio import filter from gnuradio import gr import sys import signal @@ -37,7 +36,6 @@ from argparse import ArgumentParser from gnuradio.eng_arg import eng_float, intx from gnuradio import eng_notation from gnuradio.qtgui import Range, RangeWidget -import numpy as np from gnuradio import qtgui @@ -87,18 +85,11 @@ class qam_fading(gr.top_block, Qt.QWidget): self.phase_bw = phase_bw = 2 * 3.141592653589793 / 100 self.noise_volt = noise_volt = 0.0001 self.freq_offset = freq_offset = 0 - self.fading_3 = fading_3 = 0 - self.fading_2 = fading_2 = 0 - self.fading_1 = fading_1 = 2 self.eq_ntaps = eq_ntaps = 15 self.eq_mod = eq_mod = 1 self.eq_gain = eq_gain = .01 self.const = const = digital.constellation_16qam().base() self.chn_taps = chn_taps = [1.0 + 0.0j, ] - self.amp_3 = amp_3 = 0 - self.amp_2 = amp_2 = 0 - self.amp_1 = amp_1 = 0.2 - self.LOS_NLOS = LOS_NLOS = 1 ################################################## # Blocks @@ -114,11 +105,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.params_grid_layout_1 = Qt.QGridLayout() self.params_layout_1.addLayout(self.params_grid_layout_1) self.params.addTab(self.params_widget_1, 'Receiver') - self.params_widget_2 = Qt.QWidget() - self.params_layout_2 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.params_widget_2) - self.params_grid_layout_2 = Qt.QGridLayout() - self.params_layout_2.addLayout(self.params_grid_layout_2) - self.params.addTab(self.params_widget_2, 'Fading') self.top_grid_layout.addWidget(self.params) self._timing_loop_bw_range = Range(0, 200e-3, 10e-3, 2 * 3.141592653589793 / 100, 200) self._timing_loop_bw_win = RangeWidget(self._timing_loop_bw_range, self.set_timing_loop_bw, 'Time Bandwidth', "counter_slider", float) @@ -172,27 +158,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.params_grid_layout_0.setRowStretch(r, 1) for c in range(0, 1): self.params_grid_layout_0.setColumnStretch(c, 1) - self._fading_3_range = Range(0, 30, 1, 0, 200) - self._fading_3_win = RangeWidget(self._fading_3_range, self.set_fading_3, 'Fading 3', "counter_slider", int) - self.params_grid_layout_2.addWidget(self._fading_3_win, 3, 0, 1, 1) - for r in range(3, 4): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_2.setColumnStretch(c, 1) - self._fading_2_range = Range(0, 30, 1, 0, 200) - self._fading_2_win = RangeWidget(self._fading_2_range, self.set_fading_2, 'Fading 2', "counter_slider", int) - self.params_grid_layout_2.addWidget(self._fading_2_win, 2, 0, 1, 1) - for r in range(2, 3): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_2.setColumnStretch(c, 1) - self._fading_1_range = Range(1, 30, 1, 2, 200) - self._fading_1_win = RangeWidget(self._fading_1_range, self.set_fading_1, 'Fading', "counter_slider", int) - self.params_grid_layout_2.addWidget(self._fading_1_win, 1, 0, 1, 1) - for r in range(1, 2): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_2.setColumnStretch(c, 1) self._eq_gain_range = Range(0, .1, .001, .01, 200) self._eq_gain_win = RangeWidget(self._eq_gain_range, self.set_eq_gain, 'Equalizer Rate', "counter_slider", float) self.params_grid_layout_1.addWidget(self._eq_gain_win, 0, 0, 1, 1) @@ -200,34 +165,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.params_grid_layout_1.setRowStretch(r, 1) for c in range(0, 1): self.params_grid_layout_1.setColumnStretch(c, 1) - self._amp_3_range = Range(0, 5, 0.1, 0, 200) - self._amp_3_win = RangeWidget(self._amp_3_range, self.set_amp_3, 'Ampliude 3', "counter_slider", float) - self.params_grid_layout_2.addWidget(self._amp_3_win, 3, 1, 1, 1) - for r in range(3, 4): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_2.setColumnStretch(c, 1) - self._amp_2_range = Range(0, 5, 0.1, 0, 200) - self._amp_2_win = RangeWidget(self._amp_2_range, self.set_amp_2, 'Ampliude 2', "counter_slider", float) - self.params_grid_layout_2.addWidget(self._amp_2_win, 2, 1, 1, 1) - for r in range(2, 3): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_2.setColumnStretch(c, 1) - self._amp_1_range = Range(0, 5, 0.1, 0.2, 200) - self._amp_1_win = RangeWidget(self._amp_1_range, self.set_amp_1, 'Ampliude', "counter_slider", float) - self.params_grid_layout_2.addWidget(self._amp_1_win, 1, 1, 1, 1) - for r in range(1, 2): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_2.setColumnStretch(c, 1) - self._LOS_NLOS_range = Range(0, 1, 1, 1, 200) - self._LOS_NLOS_win = RangeWidget(self._LOS_NLOS_range, self.set_LOS_NLOS, 'LOS_NLOS', "counter_slider", int) - self.params_grid_layout_2.addWidget(self._LOS_NLOS_win, 0, 0, 1, 1) - for r in range(0, 1): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_2.setColumnStretch(c, 1) self.qtgui_time_sink_x_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate @@ -279,51 +216,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.plots_grid_layout_2.setRowStretch(r, 1) for c in range(0, 1): self.plots_grid_layout_2.setColumnStretch(c, 1) - self.qtgui_freq_sink_x_2_1 = qtgui.freq_sink_f( - 1024, #size - firdes.WIN_BLACKMAN_hARRIS, #wintype - 0, #fc - samp_rate, #bw - "", #name - 2 - ) - self.qtgui_freq_sink_x_2_1.set_update_time(0.10) - self.qtgui_freq_sink_x_2_1.set_y_axis(-140, 10) - self.qtgui_freq_sink_x_2_1.set_y_label('Relative Gain', 'dB') - self.qtgui_freq_sink_x_2_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") - self.qtgui_freq_sink_x_2_1.enable_autoscale(False) - self.qtgui_freq_sink_x_2_1.enable_grid(False) - self.qtgui_freq_sink_x_2_1.set_fft_average(1.0) - self.qtgui_freq_sink_x_2_1.enable_axis_labels(True) - self.qtgui_freq_sink_x_2_1.enable_control_panel(False) - - - self.qtgui_freq_sink_x_2_1.set_plot_pos_half(not True) - - labels = ['Fading', '', '', '', '', - '', '', '', '', ''] - widths = [1, 1, 1, 1, 1, - 1, 1, 1, 1, 1] - colors = ["blue", "red", "green", "black", "cyan", - "magenta", "yellow", "dark red", "dark green", "dark blue"] - alphas = [1.0, 1.0, 1.0, 1.0, 1.0, - 1.0, 1.0, 1.0, 1.0, 1.0] - - for i in range(2): - if len(labels[i]) == 0: - self.qtgui_freq_sink_x_2_1.set_line_label(i, "Data {0}".format(i)) - else: - self.qtgui_freq_sink_x_2_1.set_line_label(i, labels[i]) - self.qtgui_freq_sink_x_2_1.set_line_width(i, widths[i]) - self.qtgui_freq_sink_x_2_1.set_line_color(i, colors[i]) - self.qtgui_freq_sink_x_2_1.set_line_alpha(i, alphas[i]) - - self._qtgui_freq_sink_x_2_1_win = sip.wrapinstance(self.qtgui_freq_sink_x_2_1.pyqwidget(), Qt.QWidget) - self.plots_grid_layout_1.addWidget(self._qtgui_freq_sink_x_2_1_win, 1, 0, 1, 1) - for r in range(1, 2): - self.plots_grid_layout_1.setRowStretch(r, 1) - for c in range(0, 1): - self.plots_grid_layout_1.setColumnStretch(c, 1) self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c( 1024, #size firdes.WIN_BLACKMAN_hARRIS, #wintype @@ -382,7 +274,7 @@ class qam_fading(gr.top_block, Qt.QWidget): self.qtgui_const_sink_x_2.enable_axis_labels(True) - labels = ['fading', 'normal', '', '', '', + labels = ['Fading', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] @@ -426,7 +318,7 @@ class qam_fading(gr.top_block, Qt.QWidget): self.qtgui_const_sink_x_1.enable_axis_labels(True) - labels = ['fading', 'normal', '', '', '', + labels = ['Fading', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] @@ -470,7 +362,7 @@ class qam_fading(gr.top_block, Qt.QWidget): self.qtgui_const_sink_x_0_0.enable_axis_labels(True) - labels = ['fading', 'normal', '', '', '', + labels = ['Fading', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] @@ -514,7 +406,7 @@ class qam_fading(gr.top_block, Qt.QWidget): self.qtgui_const_sink_x_0.enable_axis_labels(True) - labels = ['fading', 'normal', '', '', '', + labels = ['Fading', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] @@ -544,10 +436,8 @@ class qam_fading(gr.top_block, Qt.QWidget): self.plots_grid_layout_0.setRowStretch(r, 1) for c in range(0, 1): self.plots_grid_layout_0.setColumnStretch(c, 1) - self.interp_fir_filter_xxx_0 = filter.interp_fir_filter_ccc(1, [LOS_NLOS]+(([0]*fading_1)+[amp_1])+(([0]*fading_2)+[amp_2])+(([0]*fading_3)+[amp_3])) - self.interp_fir_filter_xxx_0.declare_sample_delay(0) self.digital_pfb_clock_sync_xxx_0_0 = digital.pfb_clock_sync_ccf(sps , timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1) - self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1) + self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps * 1.001, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1) self.digital_map_bb_0_0 = digital.map_bb([0, 1, 3, 2]) self.digital_map_bb_0 = digital.map_bb([0, 1, 3, 2]) self.digital_diff_decoder_bb_0_0 = digital.diff_decoder_bb(4) @@ -566,6 +456,7 @@ class qam_fading(gr.top_block, Qt.QWidget): self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(const) self.digital_cma_equalizer_cc_0_0 = digital.cma_equalizer_cc(eq_ntaps, eq_mod, eq_gain, 2) self.digital_cma_equalizer_cc_0 = digital.cma_equalizer_cc(eq_ntaps, eq_mod, eq_gain, 2) + self.channels_selective_fading_model_0 = channels.selective_fading_model( 8, 0, False, 1.0, 0, (0,7), (1,0.2), 2 ) self.channels_channel_model_0 = channels.channel_model( noise_voltage=noise_volt, frequency_offset=freq_offset, @@ -590,20 +481,21 @@ class qam_fading(gr.top_block, Qt.QWidget): ################################################## self.connect((self.analog_random_source_x_0, 0), (self.blocks_unpack_k_bits_bb_0_0, 0)) self.connect((self.analog_random_source_x_0, 0), (self.digital_constellation_modulator_0, 0)) - self.connect((self.blocks_char_to_float_0, 0), (self.qtgui_freq_sink_x_2_1, 0)) self.connect((self.blocks_char_to_float_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.blocks_char_to_float_0_0, 0), (self.blocks_delay_0, 0)) - self.connect((self.blocks_char_to_float_0_1, 0), (self.qtgui_freq_sink_x_2_1, 1)) self.connect((self.blocks_char_to_float_0_1, 0), (self.qtgui_time_sink_x_0, 2)) self.connect((self.blocks_delay_0, 0), (self.qtgui_time_sink_x_0, 1)) self.connect((self.blocks_throttle_0, 0), (self.channels_channel_model_0, 0)) self.connect((self.blocks_unpack_k_bits_bb_0, 0), (self.blocks_char_to_float_0, 0)) self.connect((self.blocks_unpack_k_bits_bb_0_0, 0), (self.blocks_char_to_float_0_0, 0)) self.connect((self.blocks_unpack_k_bits_bb_0_1, 0), (self.blocks_char_to_float_0_1, 0)) + self.connect((self.channels_channel_model_0, 0), (self.channels_selective_fading_model_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.digital_pfb_clock_sync_xxx_0_0, 0)) - self.connect((self.channels_channel_model_0, 0), (self.interp_fir_filter_xxx_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.qtgui_const_sink_x_0, 1)) self.connect((self.channels_channel_model_0, 0), (self.qtgui_freq_sink_x_0, 1)) + self.connect((self.channels_selective_fading_model_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) + self.connect((self.channels_selective_fading_model_0, 0), (self.qtgui_const_sink_x_0, 0)) + self.connect((self.channels_selective_fading_model_0, 0), (self.qtgui_freq_sink_x_0, 0)) self.connect((self.digital_cma_equalizer_cc_0, 0), (self.digital_costas_loop_cc_0, 0)) self.connect((self.digital_cma_equalizer_cc_0, 0), (self.qtgui_const_sink_x_1, 0)) self.connect((self.digital_cma_equalizer_cc_0_0, 0), (self.digital_costas_loop_cc_0_0, 0)) @@ -623,9 +515,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.qtgui_const_sink_x_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0_0, 0), (self.digital_cma_equalizer_cc_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0_0, 0), (self.qtgui_const_sink_x_0_0, 1)) - self.connect((self.interp_fir_filter_xxx_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) - self.connect((self.interp_fir_filter_xxx_0, 0), (self.qtgui_const_sink_x_0, 0)) - self.connect((self.interp_fir_filter_xxx_0, 0), (self.qtgui_freq_sink_x_0, 0)) def closeEvent(self, event): @@ -676,7 +565,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.samp_rate = samp_rate self.blocks_throttle_0.set_sample_rate(self.samp_rate) self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate) - self.qtgui_freq_sink_x_2_1.set_frequency_range(0, self.samp_rate) self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate) def get_rrc_taps(self): @@ -709,27 +597,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.freq_offset = freq_offset self.channels_channel_model_0.set_frequency_offset(self.freq_offset) - def get_fading_3(self): - return self.fading_3 - - def set_fading_3(self, fading_3): - self.fading_3 = fading_3 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - - def get_fading_2(self): - return self.fading_2 - - def set_fading_2(self, fading_2): - self.fading_2 = fading_2 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - - def get_fading_1(self): - return self.fading_1 - - def set_fading_1(self, fading_1): - self.fading_1 = fading_1 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - def get_eq_ntaps(self): return self.eq_ntaps @@ -765,34 +632,6 @@ class qam_fading(gr.top_block, Qt.QWidget): self.chn_taps = chn_taps self.channels_channel_model_0.set_taps(self.chn_taps) - def get_amp_3(self): - return self.amp_3 - - def set_amp_3(self, amp_3): - self.amp_3 = amp_3 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - - def get_amp_2(self): - return self.amp_2 - - def set_amp_2(self, amp_2): - self.amp_2 = amp_2 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - - def get_amp_1(self): - return self.amp_1 - - def set_amp_1(self, amp_1): - self.amp_1 = amp_1 - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - - def get_LOS_NLOS(self): - return self.LOS_NLOS - - def set_LOS_NLOS(self, LOS_NLOS): - self.LOS_NLOS = LOS_NLOS - self.interp_fir_filter_xxx_0.set_taps([self.LOS_NLOS]+(([0]*self.fading_1)+[self.amp_1])+(([0]*self.fading_2)+[self.amp_2])+(([0]*self.fading_3)+[self.amp_3])) - diff --git a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc index 23cb577..641d78e 100644 --- a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc +++ b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc @@ -169,11 +169,11 @@ blocks: label: Fading min_len: '200' orient: Qt.Horizontal - rangeType: int + rangeType: float start: '1' - step: '1' + step: '0.0001' stop: '30' - value: '2' + value: sps widget: counter_slider states: bus_sink: false @@ -808,17 +808,17 @@ blocks: parameters: affinity: '' alias: '' - amplitudes: '[0.2, 0.2]' + amplitudes: '[amp_1]' comment: '' - delays: '[4,4]' - los: 'True' + delays: '[fading_1]' + los: 'False' maxoutbuf: '0' minoutbuf: '0' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [968, 324.0] + coordinate: [992, 316.0] rotation: 0 state: true - name: import_0 diff --git a/simulation/QAM_Fading/qam_fading_block.py b/simulation/QAM_Fading/qam_fading_block.py index 5622e69..89c4a32 100755 --- a/simulation/QAM_Fading/qam_fading_block.py +++ b/simulation/QAM_Fading/qam_fading_block.py @@ -87,7 +87,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget): self.phase_bw = phase_bw = 2 * 3.141592653589793 / 100 self.noise_volt = noise_volt = 0.0001 self.freq_offset = freq_offset = 0 - self.fading_1 = fading_1 = 2 + self.fading_1 = fading_1 = sps self.eq_ntaps = eq_ntaps = 15 self.eq_mod = eq_mod = 1 self.eq_gain = eq_gain = .01 @@ -168,6 +168,13 @@ class qam_fading_block(gr.top_block, Qt.QWidget): self.params_grid_layout_0.setRowStretch(r, 1) for c in range(0, 1): self.params_grid_layout_0.setColumnStretch(c, 1) + self._fading_1_range = Range(1, 30, 0.0001, sps, 200) + self._fading_1_win = RangeWidget(self._fading_1_range, self.set_fading_1, 'Fading', "counter_slider", float) + self.params_grid_layout_2.addWidget(self._fading_1_win, 1, 0, 1, 1) + for r in range(1, 2): + self.params_grid_layout_2.setRowStretch(r, 1) + for c in range(0, 1): + self.params_grid_layout_2.setColumnStretch(c, 1) self._eq_gain_range = Range(0, .1, .001, .01, 200) self._eq_gain_win = RangeWidget(self._eq_gain_range, self.set_eq_gain, 'Equalizer Rate', "counter_slider", float) self.params_grid_layout_1.addWidget(self._eq_gain_win, 0, 0, 1, 1) @@ -175,6 +182,13 @@ class qam_fading_block(gr.top_block, Qt.QWidget): self.params_grid_layout_1.setRowStretch(r, 1) for c in range(0, 1): self.params_grid_layout_1.setColumnStretch(c, 1) + self._amp_1_range = Range(0, 5, 0.1, 0.2, 200) + self._amp_1_win = RangeWidget(self._amp_1_range, self.set_amp_1, 'Ampliude', "counter_slider", float) + self.params_grid_layout_2.addWidget(self._amp_1_win, 1, 1, 1, 1) + for r in range(1, 2): + self.params_grid_layout_2.setRowStretch(r, 1) + for c in range(1, 2): + self.params_grid_layout_2.setColumnStretch(c, 1) self.qtgui_time_sink_x_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate @@ -491,14 +505,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget): self.plots_grid_layout_0.setRowStretch(r, 1) for c in range(0, 1): self.plots_grid_layout_0.setColumnStretch(c, 1) - self.fadingui_multipath_fading_0 = fadingui.multipath_fading(amplitudes=[0.2, 0.2], delays=[4,4]) - self._fading_1_range = Range(1, 30, 1, 2, 200) - self._fading_1_win = RangeWidget(self._fading_1_range, self.set_fading_1, 'Fading', "counter_slider", int) - self.params_grid_layout_2.addWidget(self._fading_1_win, 1, 0, 1, 1) - for r in range(1, 2): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_2.setColumnStretch(c, 1) + self.fadingui_multipath_fading_0 = fadingui.multipath_fading(amplitudes=[amp_1], delays=[fading_1], los =False) self.digital_pfb_clock_sync_xxx_0_0 = digital.pfb_clock_sync_ccf(sps , timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1) self.digital_map_bb_0_0 = digital.map_bb([0, 1, 3, 2]) @@ -535,13 +542,6 @@ class qam_fading_block(gr.top_block, Qt.QWidget): self.blocks_char_to_float_0_0 = blocks.char_to_float(1, 1) self.blocks_char_to_float_0 = blocks.char_to_float(1, 1) self.analog_random_source_x_0 = blocks.vector_source_b(list(map(int, numpy.random.randint(0, 256, 1000))), True) - self._amp_1_range = Range(0, 5, 0.1, 0.2, 200) - self._amp_1_win = RangeWidget(self._amp_1_range, self.set_amp_1, 'Ampliude', "counter_slider", float) - self.params_grid_layout_2.addWidget(self._amp_1_win, 1, 1, 1, 1) - for r in range(1, 2): - self.params_grid_layout_2.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_2.setColumnStretch(c, 1) self._LOS_NLOS_range = Range(0, 1, 1, 1, 200) self._LOS_NLOS_win = RangeWidget(self._LOS_NLOS_range, self.set_LOS_NLOS, 'LOS_NLOS', "counter_slider", int) self.params_grid_layout_2.addWidget(self._LOS_NLOS_win, 0, 0, 1, 1) @@ -605,6 +605,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget): def set_sps(self, sps): self.sps = sps + self.set_fading_1(self.sps) self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts)) def get_nfilts(self): diff --git a/simulation/QAM_Fading/qam_fading_frequency_selectiv_copy.grc b/simulation/QAM_Fading/qam_fading_frequency_selectiv_copy.grc index 18f7893..a960ec8 100644 --- a/simulation/QAM_Fading/qam_fading_frequency_selectiv_copy.grc +++ b/simulation/QAM_Fading/qam_fading_frequency_selectiv_copy.grc @@ -464,7 +464,7 @@ blocks: mags: (1,0.2) maxoutbuf: '0' minoutbuf: '0' - ntaps: '1' + ntaps: '2' seed: '0' states: bus_sink: false diff --git a/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml b/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml index 1d374ac..b10826f 100644 --- a/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml +++ b/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml @@ -4,7 +4,9 @@ category: '[fadingui]' templates: imports: import fadingui - make: fadingui.multipath_fading(amplitudes=${amplitudes}, delays=${delays}) + make: fadingui.multipath_fading(amplitudes=${amplitudes}, delays=${delays}, los =${los}) + + # Make one 'parameters' list entry for every parameter you want settable from the GUI. # Keys include: @@ -20,7 +22,7 @@ parameters: dtype: raw - id: los label: LOS/NLOS - options: ['True', 'False'] + options: [True, False] option_labels: ['LOS', 'NLOS'] #default: 'False' dtype: bool diff --git a/src/gr-fadingui/python/multipath_fading.py b/src/gr-fadingui/python/multipath_fading.py index 02b3bb4..3c34a79 100644 --- a/src/gr-fadingui/python/multipath_fading.py +++ b/src/gr-fadingui/python/multipath_fading.py @@ -31,7 +31,7 @@ class multipath_fading(gr.sync_block): """ docstring for block multipath_fading """ - def __init__(self, amplitudes=[], delays=[], los=True): # only default arguments here + def __init__(self, amplitudes, delays, los): # only default arguments here """arguments to this function show up as parameters in GRC""" gr.sync_block.__init__( self, @@ -61,22 +61,20 @@ class multipath_fading(gr.sync_block): inp = input_items[0] oup = output_items[0] + if len(self.amplitudes) != len(self.delays): # Test: Es muss gleich viele Werte für Delays und Amplituden haben. raise Exception("Amplitudes and Delay length dont match") - - - #TO DO negativ check + if np.min(self.delays)<0: #Negativ Check + raise Exception("Delay can't be negativ") - # raise Exception("Delay length can't be one") #if np.min(self.delays)<=1: # raise Exception("Delay length can't be one") - #max_len = np.max(self.delays) #Max Werte herausfinden für länge - #sum_x = np.zeros(max_len) - max_order = 2 * np.floor(np.max(self.delays)) + 1 + + max_order = 2 * np.floor(np.max(self.delays)) + 1 #Max Werte herausfinden für länge max_samples = np.arange(0, max_order +1) max_len = len(max_samples) #Für Filter @@ -110,7 +108,6 @@ class multipath_fading(gr.sync_block): # signal_shifted = np.convolve(h, inp, mode='full') # y = signal_shifted - #y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))]) y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))]) oup[:] = y[:len(inp)] |