Commit 43bca6ea authored by Christian Rohlfing's avatar Christian Rohlfing

Merge branch 'development-lab' of git.rwth-aachen.de:IENT/gdet3-demos into development-lab

parents 7dc7d622 641d0cf3
......@@ -46,11 +46,15 @@
"\n",
"$$S_\\mathrm{a}(f) = \\frac{1}{T}\\sum\\limits_{k=-\\infty}^\\infty S\\left(f-\\frac{k}{T}\\right) \\text{.}$$\n",
"\n",
"Die Wiederholungen sind bei Vielfachen der Abtastrate $r=\\frac{1}{T}$ positioniert. \n",
"Die Wiederholungen sind bei Vielfachen der Abtastrate $r=\\frac{1}{T}$ positioniert und mit $r=\\frac{1}{T}$ gewichtet. \n",
"\n",
"Zur Rückgewinnung wird ein Rekonstruktionsfilter $h_\\mathrm{TP}(t)$ eingesetzt, welches im Idealfall die die spektrale Kopie bei $k=0$ (auch Basisband genannt) aus $S_\\mathrm{a}(f)$ rekonstruieren soll. \n",
"Hier wird das ideale Tiefpassfilter \n",
"$$H_\\mathrm{TP}(f)=\\mathrm{rect}\\left(\\frac{f}{2 f_\\mathrm{g}}\\right)$$ mit Grenzfrequenz $f_\\mathrm{g} = \\frac{r}{2}$ verwendet."
"$$H_\\mathrm{TP}(f)=\\mathrm{rect}\\left(\\frac{f}{2 f_\\mathrm{g}}\\right)$$ mit Grenzfrequenz $f_\\mathrm{g} = \\frac{r}{2}$ verwendet.\n",
"\n",
"Zur Rückgewinnung im Spektralbereich wird dieser ideale Tiefpass mit dem Spektrums des abgetasteten Signals $S_{\\mathrm{a}}(f)$ multipliziert. Das Spektrum des rekonstruierten Signals ist somit \n",
"$$G(f)=S_\\mathrm{a}(f) \\cdot H_\\mathrm{TP}(f) \\cdot T\\text{.}$$\n",
"Das rekonstuierte Signal im Zeitbereich $g(t)$ wird dann durch Rücktransformation gewonnen."
]
},
{
......@@ -70,7 +74,9 @@
"\n",
"Achtung: Die letzten beiden Signale $s(t)$, Rechteck- und Dreieckimpuls, haben unendlich ausgedehnte Spektren $S(f)$. Daher ist eine fehlerfreie Rekonstruktion prinzipiell nicht möglich!\n",
"\n",
"Zunächst werden $s(t)$ und $s_\\mathrm{a}(t)$ im Zeitbereich betrachtet. Weiterhin wird das zu $s_\\mathrm{a}(t)$ gehörige Spektrum $S_\\mathrm{a}(f)$ dargestellt. In der gleichen Abbildung ist die Übertragungsfunktion $H_\\mathrm{TP}(f)$ des Rekonstruktionsfilters gezeigt. In der letzten Abbildung wird nun das rekonstruierte Signal $g(t)$ gezeigt. Im Alias-freien Fall für cos-, sin- und si-Funktion gilt $g(t)=s(t)$."
"Zunächst werden $s(t)$ und $s_\\mathrm{a}(t)$ im Zeitbereich betrachtet. Weiterhin wird das zu $s_\\mathrm{a}(t)$ gehörige Spektrum $S_\\mathrm{a}(f)$ dargestellt. In der gleichen Abbildung ist die Übertragungsfunktion $H_\\mathrm{TP}(f)$ des Rekonstruktionsfilters gezeigt. \n",
"Das Spektrum des rekonstruierten Signal $G(f)=S_\\mathrm{a}(f) \\cdot H_\\mathrm{TP}(f) \\cdot T$ wird in der nächsten Abbildung dargestellt.\n",
"In der letzten Abbildung wird nun das rekonstruierte Signal $g(t)$ gezeigt. Im Alias-freien Fall für cos-, sin- und si-Funktion gilt $g(t)=s(t)$."
]
},
{
......@@ -121,6 +127,7 @@
" g = ient_idft(G); \n",
" g = np.fft.ifftshift(np.real(g)); # IDFT\n",
" \n",
" # Sample\n",
" if s_type == 'cos-Funktion' or s_type == 'sin-Funktion':\n",
" fSadirac = f[np.where(Sa)]; Sadirac = Sa[np.where(Sa)]\n",
" fSdirac = f[np.where(S(f))]; Sdirac = S(f)[np.where(S(f))]\n",
......@@ -159,47 +166,60 @@
" else:\n",
" ax.plot(f, G, '-', color='grun'); \n",
" ient_plot_dirac(ax, [], [], 'rot');\n",
" ax.set_xlabel(r'$\\rightarrow f$'); ax.set_ylabel(r'$\\uparrow G(f)$');\n",
" ax.set_xlabel(r'$\\rightarrow f$'); ax.set_ylabel(r'$\\uparrow G(f)=S_\\mathrm{a}(f) \\cdot H_\\mathrm{TP}(f) \\cdot T$', bbox=ient_wbbox);\n",
" ax.set_xlim([-7.5,7.5]); ient_grid(ax); ient_axis(ax);\n",
" \n",
" ax = axs[3]; ax.set_title('Zeitbereich (nach Rekonstruktion)');\n",
" ax.plot(t, s(t), color='rwth', linestyle='--', label=r'$s(t)$');\n",
" ax.plot(t/deltat/(f[-1]*2), g, 'grun', label=r'$g(t)$');\n",
" ax.set_xlabel(r'$\\rightarrow t$');\n",
" ax.set_xlim([-7.5,7.5]); ax.legend(loc=2); ient_grid(ax); ient_axis(ax);\n",
" ax.set_xlabel(r'$\\rightarrow t$'); ax.set_xlim([-7.5,7.5]); ax.legend(loc=2); ient_grid(ax); ient_axis(ax);\n",
" plt.tight_layout()\n",
" else:\n",
" axs[0].lines[0].set_ydata(s(t))\n",
" axs[0].lines[0].set_ydata(s(t)); axs[1].lines[-3].set_ydata(S(f)); \n",
" ient_dirac_set_data(axs[0].containers, nT, snT)\n",
" \n",
" if s_type == 'cos-Funktion' or s_type == 'sin-Funktion':\n",
" ient_dirac_set_data(axs[1].containers, fSadirac, Sadirac); \n",
" axs[1].lines[1].set_ydata(np.ones_like(f)*np.nan);\n",
" if s_type == 'cos-Funktion' or s_type == 'sin-Funktion': # dirac plot\n",
" ient_dirac_set_data(axs[1].containers, fSadirac, Sadirac); axs[1].lines[1].set_ydata(np.ones_like(f)*np.nan);\n",
" ient_dirac_set_data(axs[2].containers, fGdirac, Gdirac); axs[2].lines[0].set_ydata(np.ones_like(f)*np.nan);\n",
" else:\n",
" ient_dirac_set_data(axs[1].containers, [], [])\n",
" axs[1].lines[1].set_ydata(Sa);\n",
" axs[1].lines[-3].set_ydata(S(f)); \n",
" if s_type == 'cos-Funktion' or s_type == 'sin-Funktion':\n",
" ient_dirac_set_data(axs[2].containers, fGdirac, Gdirac); \n",
" axs[2].lines[0].set_ydata(np.ones_like(f)*np.nan);\n",
" else:\n",
" ient_dirac_set_data(axs[2].containers, [], [])\n",
" axs[2].lines[0].set_ydata(G);\n",
" axs[3].lines[0].set_ydata(s(t))\n",
" axs[3].lines[1].set_ydata(g);\n",
" # Adapt labels\n",
" if s_type == 'sin-Funktion':\n",
" axs[1].lines[1].set_ydata(Sa); ient_dirac_set_data(axs[1].containers, [], []);\n",
" axs[2].lines[0].set_ydata(G); ient_dirac_set_data(axs[2].containers, [], []);\n",
" \n",
" axs[3].lines[0].set_ydata(s(t)); axs[3].lines[1].set_ydata(g);\n",
" \n",
" if s_type == 'sin-Funktion': # Adapt labels\n",
" axs[1].lines[1].set_label(r'$\\mathrm{Im}\\{S_\\mathrm{a}(f)\\}$'); axs[1].lines[-3].set_label(r'$\\mathrm{Im}\\{S(f)\\}$');\n",
" axs[2].set_ylabel(r'$\\uparrow \\mathrm{Im}\\{G(f)\\}$');\n",
" axs[2].yaxis.label.set_text(r'$\\uparrow \\mathrm{Im}\\{G(f)\\}$');\n",
" else:\n",
" axs[1].lines[1].set_label(r'$S_\\mathrm{a}(f)$'); axs[1].lines[-3].set_label(r'$S(f)$')\n",
" axs[2].set_ylabel(r'$\\uparrow G(f)$');\n",
" axs[2].yaxis.label.set_text(r'$\\uparrow G(f)=S_\\mathrm{a}(f) \\cdot H_\\mathrm{TP}(f) \\cdot T$');\n",
" axs[1].legend(loc=2)\n",
" \n",
" ient_update_ylim(axs[1], Sa, 0.19, np.max(Sa)); ient_update_ylim(axs[2], G, 0.19, np.max(G));\n",
" ient_update_ylim(axs[3], np.concatenate((s(t),g)), 0.19, np.max(np.concatenate((s(t),g))));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aufgaben\n",
"* Wähle eine cos-Funktion für $s(t)$ und setze $F$ auf die kleinstmögliche Größe. Im Spektrum ist die Frequenz des Cosinus zu erkennen und im Zeitbereich wird dieser perfekt rekonstruiert. Erhöhe nun $F$ schrittweise. Beobachte das Spektrum. Was passiert und warum?\n",
"* Betrachte das Spektrum für $F=1$. Vergleiche die Höhe der Diracs mit denen für $F=0.9$ und $F=1.1$. Wie ist der Unterschied zu erklären? \n",
"* Für $F\\leq 1$ wird das Signal nicht mehr perfekt rekonstruiert. Dieser Effekt nennt sich Aliasing. Wie verhält sich das rekonstruierte Signal bei größer werdendem $F$?\n",
"* Betrachte abschließend $F=2$. Was passiert hier? \n",
"* Wähle nun eine sin-Funktion und untersuche dieselben Dinge, wie zuvor für die cos-Funktion. Wie ist das Ergebnis für $F=1$ und $F=2$ zu erklären?\n",
"* Betrachte die si-Funktion. Das Spektrum der si-Funktion ist ein Rechteck. Was passiert, wenn $F$ größere Werte annimmt? Warum?\n",
"* Setze $F=1$. Kann aus $S_a(f)$ prinzipiell das ursprüngliche Signal rekonstruiert werden? Warum wird das Signal trotzdem perfekt rekonstruiert?\n",
"* Betrachte $F \\leq 1$. Welche Form nimmt $G(f)$ an und wie wirkt sich das auf das rekonstruierte Signal aus?\n",
"\n",
"Nun wird der Rechteckimpuls und der Dreiecksimpuls betrachtet. Im Gegensatz zu den vorherigen Funktionen ist das Spektrum hier, wie bereits oben erwähnt, unendlich ausgedehnt. Daher ist eine fehlerfreie Rekonstruktion prinzipiell nicht möglich.\n",
"* Starte wieder mit dem kleinstmöglichen $F$. Betrachte das Spektrum des abgetasteten Signals $S_{\\mathrm{a}}(f)$ und das Spektrum nach Anwendung des Rekonstruktionsfilters $G(f)$. Wie müsste $G(f)$ für fehlerfreie Rekonstruktion aussehen? Was erzeugt den Unterschied?\n",
"* Erhöhe nun $F$ schrittweise und betrachte die Änderung von $S_{\\mathrm{a}}(f)$, $G(f)$ und $g(t)$. Ab welchem $F$ ist das Ausgangssignal nicht mehr zu erkennen?\n",
"* Was passiert für $F \\leq 1$ und wie erklärt sich das?\n",
"* Führe dieselben Überlegungen für den Dreiecksimpuls aus. Wie erklärt sich das unterschiedliche Verhalten?"
]
},
{
"cell_type": "markdown",
"metadata": {},
......
......@@ -202,6 +202,13 @@
"print('|H(0)| = {0:.3f}'.format(Habs(0)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Am Plot der Übertragungsfunktion und den berechneten Werten kann eindeutig erkannt werden, dass es sich hierbei um einen Hochpass handelt. Niedrige Frequenzen werden gedämpft, während hohe Frequenzen durchgelassen werden. "
]
},
{
"cell_type": "markdown",
"metadata": {},
......@@ -390,6 +397,13 @@
" axs[0].set_title(r'$F={}\\mathrm{{MHz}}$'.format(Fsel))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In dieser Demo kann beobachtet werden, wie sich die Ausgangsspannung verändert, je nachdem welcher Wert für $F$ gewählt wird. Für kleine Werte von $F$ wird die Ausgangsspannung gedämpft, während sie für größere Werte eine zur Eingangsspannung ähnliche Charakteristik aufweist."
]
},
{
"cell_type": "markdown",
"metadata": {},
......
......@@ -15,7 +15,7 @@ Visit the notebook [index.ipynb](index.ipynb) for a table of contents.
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fgit.rwth-aachen.de%2FIENT%2Fgdet3-demos/development-lab?urlpath=lab/tree/index.ipynb)
* Run the notebooks on your local machine:
* Install [Anaconda](https://www.anaconda.com/) (using pip is also possible, you have to install all the requirements listed in `environment.yml` and install the two `jupyter labextension ...` commands listed below).
* Download/`git clone` this repository to your local disk.
* Download/`git clone --recurse-submodules` this repository to your local disk.
* It is highly recommended to run the GDET3 notebooks in an isolated environment. You can create a new environment called `gdet3lab` from the provided `environment.yml` by running `conda env create -f environment.yml` in the Anaconda prompt. This makes sure that all required packages are installed amd don't interfere with the packages in your base environment.
* Activate this environment with `conda activate gdet3lab`.
* Run two final commands in the Anaconda prompt (with activated `gdet3lab` environment):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment