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

113 lines
4.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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
}