80 lines
2.8 KiB
Plaintext
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
|
|
}
|