space-workshop/.ipynb_checkpoints/U02_4_Sync.en-checkpoint.ipynb
Kai Vogelgesang 489ddd75b9
Init
2025-09-18 18:33:58 +02:00

80 lines
2.8 KiB
Plaintext

{
"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.en\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.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}