GDET3 Korrelationsempfänger.ipynb 10.1 KB
Newer Older
1
2
3
4
5
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
6
7
8
9
10
   "metadata": {
    "jupyter": {
     "source_hidden": true
    }
   },
11
12
   "outputs": [],
   "source": [
13
    "# Copyright 2020 Institut für Nachrichtentechnik, RWTH Aachen University\n",
14
    "%matplotlib widget\n",
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    "\n",
    "import ipywidgets as widgets\n",
    "from ipywidgets import interact, interactive\n",
    "\n",
    "import scipy as sp\n",
    "import scipy.special\n",
    "import scipy.signal\n",
    "\n",
    "from ient_nb.ient_plots import *\n",
    "from ient_nb.ient_signals import *\n",
    "\n",
    "rect_pulse = lambda t, Tr=0.5 : ((t+.25) % 1)< Tr\n",
    "\n",
    "def correlation(s, g):\n",
    "    # Correlate s and g numerically\n",
    "    return sp.signal.convolve(np.conj(np.flipud(s)), g, mode='full')/(len(t))\n",
    "\n",
    "fs = 200 # Samplingrate\n",
    "(t,deltat) = np.linspace(-50,50, 100*fs, retstep=True) # Zeitachse\n",
    "(tau,deltatau) = np.linspace(-100,100, 2*len(t)-1, retstep=True) # Korrelation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div>\n",
    "    <img src=\"ient_nb/figures/rwth_ient_logo@2x.png\" style=\"float: right;height: 5em;\">\n",
    "</div>\n",
    "\n",
45
46
47
    "# Korrelationsempfänger\n",
    "Wird ein bekanntes Signal bei Übertragung über einen Kanal gestört, kann es bei starker Überlagerung durch Rauschen schwierig sein, dieses wieder zu entdecken. Trotzdem soll das Signal entdeckt und bezüglich Amplitude und Dauer geschätzt werden. Bei Störung durch weißes Rauschen ist die optimale Lösung für dieses Problem ein sogenannter Korrelationsempfänger. Dieser nutzt ein Korrelationsverfahren, bei dem das gestörte Signal mit einem ungestörten Mustersignal verglichen wird. Genutzt wird dies zum Beispiel für Synchronisierung oder Radarortung, ebenso ist es hiermit möglich, mehrere Signale auf einem gemeinsamen Kanal zu übertragen.\n",
    "Dieses Verfahren soll hier veranschaulicht werden."
48
49
50
51
52
53
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Iris Heisterklaus's avatar
Iris Heisterklaus committed
54
    "Das in der nächsten Abbildung dargestellte Signal $s(t)$ ist ein Burst-Signal\n",
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    "$$\n",
    "s(t) = \\sin(2\\pi F t) \\cdot \\sum_n \\mathrm{rect}\\left(\\frac{t}{D}-\\frac{1}{2}-nT\\right)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = 3 # Periode in Sekunden\n",
    "D = 1 # Burstdauer in Sekunden\n",
    "F = 2 # Frequenz des Sinus in Hertz\n",
    "A = 1 # Amplitude\n",
    "\n",
    "s = A*np.sin(2*np.pi*F*t)*rect_pulse(t/T-.25, D/T)\n",
    "\n",
    "# Plot\n",
    "fig,ax = plt.subplots(1,1); ax.plot(t, s, 'rwth'); ax.plot(t, rect_pulse(t/T-.25, D/T), 'k--')\n",
    "ax.set_xlabel(r'$\\rightarrow t$ [s]', bbox=ient_wbbox); ax.set_ylabel(r'$\\uparrow s(t)$', bbox=ient_wbbox)\n",
    "ax.set_xlim([-4.5,5.25]); ax.set_ylim([-1.2,1.2]); ient_grid(ax); ient_axis(ax);\n",
    "ient_annotate_distance(ax, r'$D$', (0,-1.1), (D,-1.1))\n",
    "ient_annotate_distance(ax, r'$T$', (0,-.9), (T,-.9))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Iris Heisterklaus's avatar
Iris Heisterklaus committed
85
    "In der nächsten Abbildung ist das Störsignal $n(t)$ und die zugehörige Verteilungsdichte $p_n(x)$ dargestellt. $n(t)$ ist gleichverteiltes weißes Rauschen im Amplitudenwertebereich $-1$ und $1$. "
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "n = np.random.uniform(-1, 1, len(t))\n",
    "x = np.linspace(-5,5, 1024)\n",
    "pn_hist, bins = np.histogram(n, bins=100, range=(-2, 2), density=True)\n",
    "x_nhist = (bins[:-1] + bins[1:])/2 # x-axis\n",
    "\n",
    "# Plot\n",
    "fig,axs = plt.subplots(2,1); \n",
    "ax = axs[0]; ax.plot(t, n, 'rwth');\n",
    "ax.set_ylabel(r'$\\uparrow {}^k n(t)$', bbox=ient_wbbox); ax.set_xlabel(r'$\\rightarrow t$ [s]', bbox=ient_wbbox);\n",
    "ax.set_xlim([-4.5,5.25]); ient_axis(ax);\n",
    "\n",
    "ax = axs[1]; ient_stem(ax, x_nhist, pn_hist, 'black-50', markerfmt=\" \");\n",
    "ax.plot(x, 0.5*rect(x/2), 'rwth')\n",
    "ax.set_ylabel(r'$\\uparrow p_n(x)$', bbox=ient_wbbox); ax.set_xlabel(r'$\\rightarrow x$', bbox=ient_wbbox);\n",
    "ax.set_xlim([-1.75,1.75]); ient_axis(ax);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Interaktive Demo\n",
    "\n",
Iris Heisterklaus's avatar
Iris Heisterklaus committed
117
118
    "In dieser interaktiven Demo soll nun betrachtet werden, wie man mit Hilfe der Korrelation das Nutzsignal $s(t)$ detektieren kann. \n",
    "Dargestellt sind auf der rechten Seite das Nutzsignal $s(t)$ und das Störsignal $n(t)$. Die beiden Signale werden nun überlagert und das Summensignal $g(t) = s(t) + n(t)$ betrachtet, dies ist oben links abgebildet. \n",
Iris Heisterklaus's avatar
Iris Heisterklaus committed
119
    "Ebenfalls dargestellt ist die Autokorrelationsfunktion $\\varphi_{gg}(\\tau)$.\n",
120
    "\n",
Iris Heisterklaus's avatar
Iris Heisterklaus committed
121
122
    "Mit Hilfe der Schieberegler können nun verschiedene Variationen des Signals dargestellt werden. Der erste Schieberegler ändert die Frequenz $F$ von $s(t)$, der zweite die Dauer $D$ und der dritte die Periode $T$ mit der die Anteile von $s(t)$ wiederholt werden. \n",
    "Über den letzten Schieberegler kann das Signal-zu-Rausch-Verhältnisse (SNR) eingestellt werden."
123
124
125
126
127
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
Iris Heisterklaus's avatar
Iris Heisterklaus committed
128
129
130
131
132
   "metadata": {
    "jupyter": {
     "source_hidden": true
    }
   },
133
134
   "outputs": [],
   "source": [
135
    "fig,axs = plt.subplots(2,2, **ient_landscape, gridspec_kw = {'width_ratios':[2, 1]})\n",
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
    "\n",
    "Twdgt = widgets.FloatSlider(min=1, max=20, value=10, step=1, description=r'Periode T', style=ient_wdgtl_style)\n",
    "Dwdgt = widgets.FloatSlider(min=0.5, max=10, value=5, step=.5, description=r'Dauer D', style=ient_wdgtl_style)\n",
    "def update_x_range(*args):\n",
    "    Dwdgt.max = Twdgt.value\n",
    "Twdgt.observe(update_x_range, 'value')# D ist an den Wert von T gekoppelt, da D immer kleiner gleich T\n",
    "\n",
    "@interact(F=widgets.FloatSlider(min=1, max=20, value=1, step=1, description=r'Frequenz F', style=ient_wdgtl_style), \n",
    "          D=Dwdgt, T=Twdgt, \n",
    "          SNR=widgets.FloatSlider(min=-50, max=50, value=-10, step=1, description=r'SNR', style=ient_wdgtl_style))\n",
    "def update_plot(F, D, T, SNR):\n",
    "    # Empfänger: Burst-Signal\n",
    "    A = 10**(SNR/20)*np.sqrt(2/3);\n",
    "    s = A*rect_pulse(t/T-.25, D/T)*np.sin(2*np.pi*F*t)\n",
    "    \n",
    "    # Kanal: Additives weißes Rauschen\n",
    "    g = s + n\n",
    "    \n",
    "    # Empfänger: Korrelation\n",
    "    phi_gg = correlation(g, g)\n",
    "        \n",
    "    if not axs[0,0].lines:\n",
    "        ax = axs[0,0]; ax.plot(t, g, 'rwth');\n",
    "        ax.set_xlabel(r'$\\rightarrow t$', bbox=ient_wbbox); \n",
    "        ax.set_ylabel(r'$\\uparrow g(t) = s(t)+n(t)$', bbox=ient_wbbox); ient_axis(ax);\n",
    "        \n",
    "        ax = axs[0, 1]; ax.plot(t, s, 'rwth'); \n",
    "        ax.set_xlabel(r'$\\rightarrow t$', bbox=ient_wbbox); \n",
    "        ax.set_ylabel(r'$\\uparrow s(t)$', bbox=ient_wbbox); ient_axis(ax);\n",
    "        \n",
    "        ax = axs[1,0]; ax.plot(tau, phi_gg, 'rwth');\n",
    "        ax.set_xlabel(r'$\\rightarrow \\tau$', bbox=ient_wbbox); \n",
    "        ax.set_ylabel(r'$\\uparrow \\varphi_{gg}(\\tau)$', bbox=ient_wbbox); ient_axis(ax);\n",
    "        \n",
    "        ax = axs[1, 1]; ax.plot(t, n, 'rwth'); \n",
    "        ax.set_xlabel(r'$\\rightarrow t$', bbox=ient_wbbox); ax.set_ylabel(r'$\\uparrow n(t)$', bbox=ient_wbbox);\n",
    "        ient_update_ylim(ax,n,.25,1000); ient_axis(ax); fig.tight_layout();\n",
    "    else:\n",
    "        axs[0,0].lines[0].set_ydata(g); axs[0,1].lines[0].set_ydata(s); axs[1,0].lines[0].set_ydata(phi_gg); \n",
    "        \n",
    "    axs[0,0].set_xlim([-2.1*T,2.1*T]); ient_update_ylim(axs[0,0], g, .5*np.max(np.abs(g)), 1e6);\n",
    "    axs[0,1].set_xlim(axs[0,0].get_xlim()); ient_update_ylim(axs[0,1], s, .5*np.max(np.abs(s)), 1e6)\n",
    "    axs[1,0].set_xlim(axs[0,0].get_xlim()); ient_update_ylim(axs[1,0], phi_gg[int(len(phi_gg)/2+1):-int(len(phi_gg)/4)], .5*np.max(np.abs(phi_gg[int(len(phi_gg)/2+1):-int(len(phi_gg)/4)])), 1e6)\n",
    "    axs[1,1].set_xlim(axs[0,0].get_xlim()); "
   ]
  },
  {
   "cell_type": "markdown",
Iris Heisterklaus's avatar
Iris Heisterklaus committed
184
185
186
   "metadata": {},
   "source": [
    "## Aufgaben\n",
Iris Heisterklaus's avatar
Iris Heisterklaus committed
187
188
189
190
191
192
193
194
195
196
    "* Betrachte $g(t)$ und $\\varphi_{gg}(\\tau)$ für die voreingestellten Startwerte. Vergleiche den Bereich, in dem sich $s(t)$ befindet. Wie stellt sich dies in der Korrelationsfunktion dar?\n",
    "* Variiere nun die Frequenz $F$. Wie ändern sich $g(t)$ und $\\varphi_{gg}(\\tau)$?\n",
    "* Was passiert, wenn $D$ sehr große Werte annimmt? Warum?\n",
    "* Welchen Einfluss hat die Periode $T$?\n",
    "\n",
    "Abschließend wird nun der Einfluss des Signal-zu-Rauschverhältnisses betrachtet. \n",
    "\n",
    "* Starte mit kleinen Werten für das SNR und erhöhe es schrittweise. Was passiert mit dem Signal? Was passiert mit der Korrelationsfunktion?\n",
    "\n",
    "* Probiere aus, für welche Konstellationen von $F$, $D$, $T$ und $SNR$ aus dem Korrelationssignal noch genügend Information gewonnen werden kann um Position und Dauer des Originalsignals zu identifizieren. "
Iris Heisterklaus's avatar
Iris Heisterklaus committed
197
198
199
200
   ]
  },
  {
   "cell_type": "markdown",
201
202
   "metadata": {},
   "source": [
203
    "____\n",
204
205
206
    "This notebook is provided as [Open Educational Resource](https://en.wikipedia.org/wiki/Open_educational_resources) (OER). Feel free to use the notebook for your own purposes. The code is licensed under the [MIT license](https://opensource.org/licenses/MIT). \n",
    "\n",
    "Please attribute the work as follows: \n",
207
    "*Christian Rohlfing, Übungsbeispiele zur Vorlesung \"Grundgebiete der Elektrotechnik 3 - Signale und Systeme\"*, gehalten von Jens-Rainer Ohm, 2020, Institut für Nachrichtentechnik, RWTH Aachen University."
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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",
227
   "version": "3.8.1"
228
229
230
  }
 },
 "nbformat": 4,
231
 "nbformat_minor": 4
232
}