113 lines
4.3 KiB
Plaintext
113 lines
4.3 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "e67c2a43",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Frequenz-Shift"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "6482d25c",
|
||
"metadata": {},
|
||
"source": [
|
||
"```{figure} img/reference/raw_waterfall.webp\n",
|
||
"---\n",
|
||
"name: fig:raw_waterfall\n",
|
||
"---\n",
|
||
"Wasserfall-Diagramm. Wir können die beiden Kopien des Spektrums bei $\\pm2.4\\text{kHz}$ erkennen.\n",
|
||
"```"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "cbe50415",
|
||
"metadata": {},
|
||
"source": [
|
||
"Als ersten Schritt wollen wir die Kopie des Spektrums bei 2.4kHz \"auf die 0\" verschieben.\n",
|
||
"\n",
|
||
"Im Frequenz-Bereich können wir diese Verschiebung als eine Faltung mit einem Peak bei -2.4kHz darstellen.\n",
|
||
"Wie können wir so einen Peak erzeugen?\n",
|
||
"\n",
|
||
"Wir erinnern uns:\n",
|
||
"$\\sin(2\\pi f t)$ und $\\cos(2\\pi f t)$ hatten Peaks bei $\\pm f$.\n",
|
||
"\n",
|
||
"Genauer gesagt:\n",
|
||
"```{math}\n",
|
||
"\\begin{align*}\n",
|
||
"\\sin(2\\pi f_0 t) \\,&\\circ\\!\\!-\\!\\!\\bullet\\, \\left\\{\\begin{array}{rcl}\n",
|
||
" \\frac{1}{2}i &∶& f = -f_0 \\\\\n",
|
||
" -\\frac{1}{2}i &:& f = f_0 \\\\\n",
|
||
" 0 &:& \\text{sonst} \\\\\n",
|
||
"\\end{array}\\right. \\\\\n",
|
||
"\\cos(2\\pi f_0 t) \\,&\\circ\\!\\!-\\!\\!\\bullet\\, \\left\\{\\begin{array}{rcl}\n",
|
||
" \\frac{1}{2} &∶& f \\in \\{-f_0, f_0\\} \\\\\n",
|
||
" 0 &:& \\text{sonst} \\\\\n",
|
||
"\\end{array}\\right. \\\\\n",
|
||
"\\end{align*}\n",
|
||
"```\n",
|
||
"\n",
|
||
"Damit haben wir jeweils zwei Peaks.\n",
|
||
"Wir können Sinus und Cosinus aber geschickt kombinieren so dass sich einer davon aufhebt:\n",
|
||
"Wenn wir den Sinus mit $i$ multiplizieren bekommen wir:\n",
|
||
"```{math}\n",
|
||
"i \\cdot \\sin(2\\pi f_0 t) \\,&\\circ\\!\\!-\\!\\!\\bullet\\, \\left\\{\\begin{array}{rcl}\n",
|
||
" i \\cdot \\frac{1}{2}i = -\\frac{1}{2} &∶& f = -f_0 \\\\\n",
|
||
" i \\cdot -\\frac{1}{2}i = \\frac{1}{2} &:& f = f_0 \\\\\n",
|
||
" 0 &:& \\text{sonst} \\\\\n",
|
||
"\\end{array}\\right.\n",
|
||
"```\n",
|
||
"Und wenn wir jetzt noch den Cosinus addieren:\n",
|
||
"```{math}\n",
|
||
"\\cos(2\\pi f_0 t) + i\\sin(2\\pi f_0 t) \\,&\\circ\\!\\!-\\!\\!\\bullet\\, \\left\\{\\begin{array}{rcl}\n",
|
||
" \\frac{1}{2} -\\frac{1}{2} = 0 &∶& f = -f_0 \\\\\n",
|
||
" \\frac{1}{2} + \\frac{1}{2} = 1 &:& f = f_0 \\\\\n",
|
||
" 0 &:& \\text{sonst} \\\\\n",
|
||
"\\end{array}\\right.\n",
|
||
"```\n",
|
||
"Damit haben wir genau den Peak bei $f_0$.\n",
|
||
"\n",
|
||
"```{note}\n",
|
||
"Den Ausdruck $\\cos(x) + i\\sin(x)$ habt ihr vielleicht schon mal in der [Eulerschen Formel](https://de.wikipedia.org/wiki/Eulersche_Formel) gesehen.\n",
|
||
"```\n",
|
||
"\n",
|
||
"Um den Frequenz-Shift durchzuführen, können wir also einfach in der Zeit-Domain (= auf den Samples) mit dieser Funktion multiplizieren.\n",
|
||
"Dazu gehen wir so vor:\n",
|
||
"- Für jedes Sample $s$ berechnen wir den aktuellen Zeitpunkt $t$.\n",
|
||
" Durch die Abtastrate $f_S = 16640\\text{Hz}$ wissen wir, dass der Zeitabstand zwischen zwei Samples genau $1/16640\\text{s}$ ist.\n",
|
||
"- Dann berechnen wir $\\cos(2\\pi \\cdot -2400 \\cdot t) + i \\cdot \\sin(2\\pi \\cdot -2400 \\cdot t)$ und erhalten einen komplexen Wert $a + bi$.\n",
|
||
"- Diesen multiplizieren wir mit $s$ und erhalten $a \\cdot s + (b \\cdot s)i$ und speichern ihn als neues, komplexes Sample.\n",
|
||
"\n",
|
||
"```{note}\n",
|
||
"Für dieses Projekt reicht es theoretisch aus, komplexe Zahlen als Paare von jeweils zwei reelle Zahlen zu speichern.\n",
|
||
"In manchen Programmiersprachen gibt es aber auch explizite Typen, um komplexe Zahlen darzustellen, z.B. [std::complex](https://en.cppreference.com/w/cpp/numeric/complex) in C++.\n",
|
||
"In Python kann man sie sogar einfach mit `a + b * 1j` erzeugen.\n",
|
||
"```"
|
||
]
|
||
}
|
||
],
|
||
"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
|
||
}
|