{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "94fe5d55",
   "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": "5cd614ca",
   "metadata": {},
   "source": [
    "# Kanalkodierung\n",
    "\n",
    "## Encoder Beispiel\n",
    "\n",
    "Beispiel mit einem Encoder, der aus $k=4 \\text{ bit}$ langen Datenwörtern, $n=5 \\text{ bit}$ lange Kanalwörter bildet, und dabei ein Paritätsbit als Redundanz hinzufügt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8eec55b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "text = \"GRNVS\"\n",
    "k = 4\n",
    "n = 5\n",
    "\n",
    "data = ubitstr.from_ascii(text)\n",
    "\n",
    "print(f\"Input Text:             {text}\")\n",
    "print(f\"Input ASCII:            {data}\")\n",
    "\n",
    "plot.bitstr(data, xtick_interval=k)\n",
    "\n",
    "encoded = defs.encode(data, k, n)\n",
    "plot.bitstr(encoded, xtick_interval=n, k=k)\n",
    "\n",
    "print(f\"Input ASCII:            {data}\")\n",
    "print(f\"Encoded channel words:  {encoded}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ced61548",
   "metadata": {},
   "source": [
    "## Fehlererkennung und -korrektur\n",
    "\n",
    "Eine Fehlererkennung ist nicht immer gesichert möglich; wird aber ein Fehler erkannt liegt dieser sicher vor.\n",
    "Je nach Grad der Redundanz können Bitfehler auch korrigiert werden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c632a052",
   "metadata": {},
   "outputs": [],
   "source": [
    "k = 8\n",
    "n = 12\n",
    "\n",
    "text = \"GRNVS\"\n",
    "bitstr = ubitstr.from_ascii(text)\n",
    "encoded_bitstr = defs.encode(bitstr, k, n)\n",
    "error_pattern = ubitstr.error_pattern(0.04, n, len(text))\n",
    "received_bitstr = ubitstr.xor(encoded_bitstr, error_pattern, n)\n",
    "decoded_bitstr = defs.decode(received_bitstr, k, n)\n",
    "received_text = ubitstr.to_ascii(decoded_bitstr)\n",
    "error_affected_chars = ubitstr.highlight_error_affected_chars(error_pattern, k, n)\n",
    "error_chars = ubitstr.highlight_errors(text, received_text)\n",
    "\n",
    "print(f\"text:           {text}\")\n",
    "print(f\"bitstr:         {bitstr}\")\n",
    "print(f\"encoded_bitstr: {encoded_bitstr}\")\n",
    "print(f\"error_pattern:  {error_pattern}\")\n",
    "print(f\"received_bitstr:{received_bitstr}\")\n",
    "print(f\"decoded_bitstr: {decoded_bitstr}\")\n",
    "print(f\"received_text:  {received_text}\")\n",
    "print(f\"error affected: {error_affected_chars}\")\n",
    "print(f\"errors:         {error_chars}\")\n",
    "\n"
   ]
  }
 ],
 "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
}
