{ "cells": [ { "cell_type": "markdown", "id": "f611b5a0", "metadata": {}, "source": [ "# Synchronisierung" ] }, { "cell_type": "markdown", "id": "0c5468d3", "metadata": {}, "source": [ "Aktuell sind die Samples noch als komplexe Zahlen dargestellt.\n", "Um weiter mit ihnen arbeiten zu können, nehmen wir jeweils den Betrag:\n", "```{math}\n", "s = a + bi \\mapsto |s| = \\sqrt{a^2 + b^2}\n", "```\n", "\n", "Hier eine Visualisierung des soweit verarbeiteten Signals:\n", "```{figure} img/reference/filtered_full_scaled.webp\n", "---\n", "name: fig:filtered_full_scaled\n", "---\n", "Gefiltertes Signal.\n", "Wir sehen dass die Sync-Streifen gebogen sind.\n", "```\n", "\n", "Die Sync-Patterns markieren jeweils den Anfang einer Zeile.\n", "Um das Bild \"gerade zu ziehen\" müssen wir sie finden.\n", "\n", "Dazu gehen wir so vor:\n", "- Sync A hat das Pattern `000011001100110011001100110011000000000`.\n", " Wir haben 4 Samples pro Pixel, also auch pro 0/1 im Pattern.\n", " Dieses Pattern wollen wir suchen.\n", " Das funktioniert hier am besten, wenn wir sowohl das Pattern als auch die Samples in den Wertebereich zwischen $-1$ und $1$ skalieren.\n", " Für jede `0` im Pattern nehmen wir also 4 mal die $-1$, und für jede `1` nehmen wir 4 mal die $1$.\n", " Diese Sequenz von 39 * 4 = 156 Werten speichern wir als $p$.\n", "- Jetzt betrachten wir Blöcke $x$ von 8320 Samples.\n", " Wir finden Minimum $x_{min}$ und Maximum $x_{max}$ im Block, und skalieren so dass das Minimum bei $-1$ ist und das Maximum bei $1$:\n", " ```{math}\n", " x[n] \\mapsto -1 + 2 \\cdot \\frac{x[n] - x_{min}}{x_{max} - x_{min}}\n", " ```\n", "- Wir wollen die Position finden, die \"am meisten\" mit dem Pattern übereinstimmt.\n", " Also iterieren wir über alle Startpositionen $i$ im Block, 0 bis (8320-156).\n", " Für jede davon berechnen wir\n", " ```{math}\n", " z = \\sum_{n=0}^{156} x[i + n] \\cdot p[n]\n", " ```\n", " Die Position bei der $z$ am größten ist, ist die mit der besten Übereinstimmung.\n", "- So können wir für jede Zeile die Anfangsposition finden.\n", " Von dort aus gehen wir in Viererschritten über die Samples, um die Pixelwerte für die Zeile zu erhalten." ] } ], "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.11.8" } }, "nbformat": 4, "nbformat_minor": 5 }