{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7bc0978d",
   "metadata": {},
   "outputs": [],
   "source": [
    "%config InlineBackend.figure_format = 'svg'  # don't scale plots\n",
    "\n",
    "from importlib import reload\n",
    "import plot\n",
    "reload(plot)\n",
    "import ubitstr\n",
    "reload(ubitstr)\n",
    "import defs\n",
    "reload(defs)\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import math\n",
    "PI = math.pi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0dd6fb14",
   "metadata": {},
   "source": [
    "# Modulation\n",
    "\n",
    "## Konstellationsdiagramme\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "62791554",
   "metadata": {},
   "outputs": [],
   "source": [
    "n = len(defs.MODULATIONS)\n",
    "ncols = 3\n",
    "nrows = (n + ncols - 1) // ncols\n",
    "fig, axes = plt.subplots(nrows, ncols, figsize=(3 * ncols, 3 * nrows))\n",
    "for ax, scheme in zip(axes.flat, defs.MODULATIONS):\n",
    "    plot.constellation(scheme, ax=ax)\n",
    "for ax in axes.flat[n:]:\n",
    "    ax.set_visible(False)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ebf48cd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "TEXT = \"This was a triumph. I'm making a note here: HUGE SUCCESS!\"\n",
    "\n",
    "# MOD_SCHEME = \"4-QAM\"\n",
    "# CARRIER_FREQ = 10\n",
    "# IMPULSE = \"rect\"\n",
    "# # FREQ_FILTER = lambda f: defs.freq_filter(f, 5)\n",
    "# FREQ_FILTER = lambda f: defs.freq_filter(f, 2)\n",
    "# XSCALE = 1\n",
    "\n",
    "MOD_SCHEME = \"32-QAM\"\n",
    "CARRIER_FREQ = 1\n",
    "IMPULSE = \"rect\"\n",
    "FREQ_FILTER = lambda f: defs.freq_filter(f, 5)\n",
    "# FREQ_FILTER = lambda f: defs.freq_filter(f, 2)\n",
    "# FREQ_FILTER = lambda f: defs.freq_filter(f, 2)\n",
    "XSCALE = 1\n",
    "\n",
    "bitstr = ubitstr.from_ascii(TEXT)\n",
    "print(bitstr)\n",
    "passband_signal = plot.modulation(bitstr, MOD_SCHEME,  carrier_freq=CARRIER_FREQ, impulse=IMPULSE, xscale=XSCALE)\n",
    "\n",
    "plot.spectrum(passband_signal, xlim=40)\n",
    "plot.spectrum(passband_signal, freq_filter=FREQ_FILTER, xlim=40)\n",
    "filtered_signal = plot.filtered(passband_signal, FREQ_FILTER, xscale=XSCALE)\n",
    "\n",
    "rx   = defs.demodulate_signal(filtered_signal, MOD_SCHEME, carrier_freq=CARRIER_FREQ, impulse=IMPULSE)\n",
    "received_bitstr = plot.demodulation(rx, MOD_SCHEME)\n",
    "received_ascii = ubitstr.to_ascii(received_bitstr)\n",
    "print(f\"orignal data:     {bitstr}\")\n",
    "print(f\"demodulated data: {received_bitstr}\")\n",
    "print(f\"decoded data:     {received_ascii}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv (3.13.5)",
   "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.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
