{ "cells": [ { "metadata": {}, "cell_type": "markdown", "source": "# BL40A2020 Wireless Communication Systems\n\n## Komm demo: Constellations\n\n## Author: [Roberto W. Nóbrega](http://docente.ifsc.edu.br/roberto.nobrega/)" }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "! pip install komm", "execution_count": 1, "outputs": [ { "output_type": "stream", "text": "Collecting komm\n Using cached https://files.pythonhosted.org/packages/6f/de/44863b6a267c575c4e117e1a21d71a5ffe4d6a0446c8cd59fbc0553cdb82/komm-0.6.1.tar.gz\nRequirement already satisfied: numpy in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from komm) (1.15.4)\nRequirement already satisfied: scipy in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from komm) (1.1.0)\nBuilding wheels for collected packages: komm\n Running setup.py bdist_wheel for komm ... \u001b[?25ldone\n\u001b[?25h Stored in directory: /home/nbuser/.cache/pip/wheels/34/a6/74/f1db8049827fbb2e6abf22f2c152c277b6b6a08ba969afa685\nSuccessfully built komm\nInstalling collected packages: komm\nSuccessfully installed komm-0.6.1\n", "name": "stdout" } ] }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "%matplotlib inline\n\nimport numpy as np\nimport matplotlib.pylab as plt\nimport ipywidgets\nimport komm", "execution_count": 5, "outputs": [] }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "def constellation_demo(modulation, noise_power_db, xlim, ylim):\n awgn = komm.AWGNChannel()\n\n num_symbols = 10000\n noise_power = 10**(noise_power_db / 10)\n awgn.signal_power = modulation.energy_per_symbol\n awgn.snr = awgn.signal_power / noise_power\n num_bits = modulation.bits_per_symbol * num_symbols\n bits = np.random.randint(2, size=num_bits)\n sentword = modulation.modulate(bits)\n recvword = awgn(sentword)\n\n _, ax = plt.subplots(figsize=(16, 10))\n ax.scatter(recvword.real, recvword.imag, color='xkcd:light blue', s=1)\n ax.scatter(modulation.constellation.real, modulation.constellation.imag, color='xkcd:blue', s=8**2)\n for (i, point) in enumerate(modulation.constellation):\n binary_label = ''.join(str(b) for b in komm.int2binlist(modulation.labeling[i], width=modulation.bits_per_symbol))\n ax.text(point.real, point.imag + 0.075 * xlim[0], binary_label, horizontalalignment='center')\n ax.set_title(repr(modulation))\n ax.set_xlabel('Re')\n ax.set_ylabel('Im')\n ax.axis('square')\n ax.set_xlim(xlim)\n ax.set_ylim(ylim)\n ax.grid()\n info_text = 'SNR = {:.1f} dB\\n'.format(10*np.log10(awgn.snr))\n info_text += 'Eb/N0 = {:.1f} dB'.format(10*np.log10(awgn.snr / modulation.bits_per_symbol))\n ax.text(1.125 * xlim[1], 0.0, info_text, horizontalalignment='left', verticalalignment='center')\n plt.show()", "execution_count": 6, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "## Phase-shift keying (PSK)" }, { "metadata": { "scrolled": false, "trusted": true }, "cell_type": "code", "source": "def psk_constellation_demo(order, amplitude, phase_offset, labeling, noise_power_db):\n psk_modulation = komm.PSKModulation(order, amplitude, phase_offset, labeling)\n constellation_demo(psk_modulation, noise_power_db, xlim=[-3.0, 3.0], ylim=[-3.0, 3.0])\n\norder_widget = ipywidgets.SelectionSlider(\n options=[2, 4, 8, 16, 32],\n continuous_update=False,\n description='Order:',\n)\n\namplitude_widget = ipywidgets.FloatSlider(\n min=0.1,\n max=2.01,\n step=0.1,\n value=1.0,\n continuous_update=False,\n description='Amplitude:',\n)\n\nphase_offset_widget = ipywidgets.SelectionSlider(\n options=[('{:.2f}π'.format(x), np.pi*x) for x in np.arange(0.0, 2.001, step=0.01)],\n value=0.0,\n continuous_update=False,\n description='Phase offset:',\n)\n\nlabeling_widget = ipywidgets.Dropdown(\n options={'Natural': 'natural', 'Reflected (Gray)': 'reflected'},\n value='reflected',\n description='Labeling:',\n)\n\nnoise_power_db_widget = ipywidgets.FloatSlider(\n value=-40.0,\n min=-40.0,\n max=10.0,\n step=1.0,\n continuous_update=False,\n description='Noise power (dB):',\n)\n\ninteractive_output = ipywidgets.interactive_output(\n psk_constellation_demo,\n dict(\n order=order_widget,\n amplitude=amplitude_widget,\n phase_offset=phase_offset_widget,\n labeling=labeling_widget,\n noise_power_db=noise_power_db_widget,\n ),\n)\n\nipywidgets.VBox(\n [\n ipywidgets.HBox(\n [\n order_widget,\n amplitude_widget,\n phase_offset_widget,\n labeling_widget,\n ]\n ),\n noise_power_db_widget,\n interactive_output,\n ],\n)", "execution_count": 7, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d49aba44d982413eaa5cd87a8815d460", "version_minor": 0, "version_major": 2 }, "text/plain": "VBox(children=(HBox(children=(SelectionSlider(continuous_update=False, description='Order:', options=(2, 4, 8,…" }, "metadata": {} } ] }, { "metadata": {}, "cell_type": "markdown", "source": "## Quadrature Amplitude Modulation (QAM)" }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "def qam_constellation_demo(order, base_amplitude, phase_offset, labeling, noise_power_db):\n qam_modulation = komm.QAModulation(order, base_amplitude, phase_offset, labeling)\n lim = [-2.125*np.sqrt(order), 2.125*np.sqrt(order)]\n constellation_demo(qam_modulation, noise_power_db, xlim=lim, ylim=lim)\n\norder_widget = ipywidgets.SelectionSlider(\n options=[4, 16, 64, 256],\n continuous_update=False,\n description='Order:',\n)\n\nbase_amplitude_widget = ipywidgets.FloatSlider(\n min=0.1,\n max=2.01,\n step=0.1,\n value=1.0,\n continuous_update=False,\n description='Base amplitude:',\n)\n\nphase_offset_widget = ipywidgets.SelectionSlider(\n options=[('{:.2f}π'.format(x), np.pi*x) for x in np.arange(0.0, 2.001, step=0.01)],\n value=0.0,\n continuous_update=False,\n description='Phase offset:',\n)\n\nlabeling_widget = ipywidgets.Dropdown(\n options={'Natural': 'natural', 'Reflected 2D (Gray)': 'reflected_2d'},\n value='reflected_2d',\n description='Labeling:',\n)\n\n\nnoise_power_db_widget = ipywidgets.FloatSlider(\n value=-40.0,\n min=-40.0,\n max=10.0,\n step=1.0,\n continuous_update=False,\n description='Noise power (dB):',\n)\n\ninteractive_output = ipywidgets.interactive_output(\n qam_constellation_demo,\n dict(\n order=order_widget,\n base_amplitude=base_amplitude_widget,\n phase_offset=phase_offset_widget,\n labeling=labeling_widget,\n noise_power_db=noise_power_db_widget,\n ),\n)\n\nipywidgets.VBox(\n [\n ipywidgets.HBox(\n [\n order_widget,\n base_amplitude_widget,\n phase_offset_widget,\n labeling_widget,\n ]\n ),\n noise_power_db_widget,\n interactive_output,\n ],\n)", "execution_count": 5, "outputs": [ { "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1821ad20d21a4b5089ce4da824f58350", "version_minor": 0, "version_major": 2 }, "text/plain": "VBox(children=(HBox(children=(SelectionSlider(continuous_update=False, description='Order:', options=(4, 16, 6…" }, "metadata": {} } ] }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "", "execution_count": null, "outputs": [] } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" }, "language_info": { "mimetype": "text/x-python", "nbconvert_exporter": "python", "name": "python", "pygments_lexer": "ipython3", "version": "3.5.4", "file_extension": ".py", "codemirror_mode": { "version": 3, "name": "ipython" } } }, "nbformat": 4, "nbformat_minor": 2 }