Commit bb5be608 authored by Hafiz Emin Kosar's avatar Hafiz Emin Kosar
Browse files

- splitted Verteilungsfunktion to explanation and demo notebooks

parent 526059eb
%% Cell type:code id: tags:
``` python
# Copyright 2020 Institut für Nachrichtentechnik, RWTH Aachen University
%matplotlib widget
from ipywidgets import interact, interactive, Layout
import ipywidgets as widgets
import numpy as np
import scipy as sp
import scipy.special # erfc(x)
from ient_nb.ient_plots import *
from ient_nb.ient_signals import *
from ient_nb.ient_audio import *
import matplotlib
from matplotlib.patches import ConnectionPatch
highlight_args = {'color':'rot', 'marker':'o'}; arrow_args = {'width':1,'headlength':10,'headwidth':10,'fc':'rot'}
anno_args = {'color':'rot', 'linestyle':'--', 'arrowstyle':"-", 'coordsA':'data', 'coordsB':'data'}
```
%% Cell type:markdown id: tags:
<div>
<img src="ient_nb/figures/rwth_ient_logo@2x.png" style="float: right;height: 5em;">
</div>
# Verteilungsfunktion und Verteilungsdichtefunktion
Zum Starten: Im Menü: Run <span class="fa-chevron-right fa"></span> Run All Cells auswählen.
%% Cell type:markdown id: tags:
## Interaktive Demo
Die folgende interaktive Demo soll veranschaulichen, wie sich Musterfunktionen eines Zufallsprozesses verhalten.
Es können verschiedene Signaltypen (Gauß-verteilt, gleichverteilt, sinusförmig oder dreieckförmig) ausgewählt werden. In der Grafik werden dann jeweils die zugehörigen Verteilungsfunktionen $P_s(x)$ und die Verteilungsdichtefunktion $p_s(x)$ angezeigt.
Das Verhalten der einzelnen Signale kann dann zusätzlich über die Schieberegler beeinflusst werden. Es ist möglich, den Mittelwert $m_s$, die Standardabweichung $\sigma_s$ und die Frequenz $F$ zu verändern.
Durch Klicken kann das Histogram der aktuellen Musterfunktion zusätzlich zur Verteilungsdichtefunktion angezeigt werden.
%% Cell type:code id: tags:
``` python
fs = 44100;
(t, deltat) = np.linspace(-10, 10, 20*fs, retstep=True) # t axis in seconds
Amax = 6 # limit of histogram (the total range would be from -Amax to Amax)
(x, deltax) = np.linspace(-Amax, Amax, 4001, retstep=True) # x axis (corresponds to amplitude)
rect_sum = lambda t: unitstep(np.cos(np.pi*t))
tri_sum = lambda t: np.abs(np.mod(t,2)-1)
gaussian_pdf = lambda x, ms, sigmas: 1/(sigmas*np.sqrt(2*np.pi)) * np.exp(-(x-ms)**2/(2*sigmas**2))
gaussian_pf = lambda x, ms, sigmas: 0.5*sp.special.erfc((ms-x)/np.sqrt(2*sigmas**2))
uniform_pdf = lambda x, ms, a: 1/a* rect((x-ms)/a)
uniform_pf = lambda x, ms, a: rect((x-ms)/a)*((x-ms)/a+1/2)+unitstep(x-(ms+a/2))
```
%% Cell type:code id: tags:
``` python
fig, axs = plt.subplots(2, 2, **ient_landscape, gridspec_kw = {'width_ratios':[3, 1]}); global ps, Ps;
def update_plot(sig, ms, sigmas, F, show_hist):
global ps, Ps
# Sample from given distribution
if sig == 'Gauß-verteilt':
s = np.random.normal(ms, sigmas, len(t));
ps = gaussian_pdf(x, ms, sigmas); Ps = gaussian_pf(x, ms, sigmas);
elif sig == 'Gleichverteilt':
a = np.sqrt(12*sigmas**2); smin = -0.5*a+ms; smax = 0.5*a+ms;
s = np.random.uniform(smin, smax, len(t));
ps = uniform_pdf(x, ms, a); Ps = uniform_pf(x, ms, a);
elif sig == 'Sinus':
A = sigmas*np.sqrt(2);
s = A*(np.sin(2*np.pi*t*F)) + ms;
ps = np.zeros_like(x); Ps = np.zeros_like(x); mask = np.abs(x-ms) < A;
ps[mask] = 1/np.pi*1/np.sqrt(A**2-(x[mask]-ms)**2);
Ps[mask] = 0.5 + 1/np.pi*np.arcsin((x[mask]-ms)/A); Ps += unitstep(x-A-ms);
elif sig == 'Dreieck':
A = np.sqrt(12)*sigmas;
s = A*tri_sum(t*F)- A/2 + ms;
ps = uniform_pdf(x, ms, A); Ps = uniform_pf(x, ms, A);
# Calculate histogram to estimate p_s(x) and P_s(x)
ps_hist, bins = np.histogram(s, bins='auto', range=(-Amax, Amax), density=True)
Ps_hist = np.cumsum(ps_hist)*np.mean(np.diff(bins))
x_hist = (bins[:-1] + bins[1:])/2 # x-axis
# Plot
if not axs[0,0].lines:
# First axis displays stoch. process s(t) in time-domain
ax = axs[0,0]; ax.plot(t*1000, s, 'rwth');
ax.set_xlabel(r'$\rightarrow t$ [ms]', bbox=ient_wbbox);
ax.set_ylabel(r'$\uparrow {}^k s(t)$');
ax.set_yticks(np.arange(-Amax,Amax+1,2)); ax.lines[0].zorder = 0;
ax.set_xlim([-8.5,8.5]); ax.set_ylim([-5.5,5.5]); ient_grid(ax); ient_axis(ax)
# Second axis displays prob. function P_s(x) vertical
ax = axs[0,1]; ax.plot(Ps, x, 'rwth'); ient_stem(ax, Ps_hist, x_hist, 'black-50', markerfmt=" "); #ax.plot(Ps_hist, x_hist, 'k--');
ax.set_xlabel(r'$\rightarrow P_s(x)$'); ax.set_ylabel(r'$\uparrow x$');
ax.set_yticks(axs[0,0].get_yticks());
ax.set_xlim([-0.05,1.49]); ax.set_ylim(axs[0,0].get_ylim()); ient_grid(ax); ient_axis(ax);
# Third axis displays prob. density function p_s(x)
ax = axs[1,0]; ax.plot(x, ps, 'rwth'); ient_stem(ax, x_hist, ps_hist, 'black-50', markerfmt=" ");# ax.plot(x_hist, ps_hist, 'k--');
ax.set_xlabel(r'$\rightarrow x$'); ax.set_ylabel(r'$\uparrow p_s(x)$');
ax.set_xticks(axs[0,0].get_yticks());
ax.set_xlim(axs[0,0].get_ylim()); ax.set_ylim([-0.05, 1.25]); ient_grid(ax); ient_axis(ax);
axs[1,1].set_visible(False); fig.tight_layout();
else:
axs[0,0].lines[0].set_ydata(s);
axs[0,1].lines[0].set_xdata(Ps); ient_stem_set_data(axs[0,1].containers[0], Ps_hist, x_hist)
axs[1,0].lines[0].set_ydata(ps); ient_stem_set_data(axs[1,0].containers[0], x_hist, ps_hist)
list(map(lambda x: x.set_visible(show_hist), axs[0,1].containers[0])); list(map(lambda x: x.set_visible(show_hist), axs[1,0].containers[0]))
#axs[0,1].lines[1].set_visible(show_hist); axs[1,0].lines[1].set_visible(show_hist);
# Widgets
w_sig = widgets.Dropdown(options=['Gauß-verteilt', 'Gleichverteilt', 'Sinus', 'Dreieck'], description='Signal:')
w_ms = widgets.FloatSlider(min=-2, max=2, step=0.1, value=0, description='$m_s$:', continuous_update=False)
w_sigmas = widgets.FloatSlider(min=0.1, max=2, step=0.1, value=1, description='$\sigma_s$:', continuous_update=False)
w_F = widgets.FloatSlider(min=200, max=1000, step=10, value=440, description='Frequenz $F$', style=ient_wdgtl_style, continuous_update=False)
w_show_hist = widgets.Checkbox(value=False, description='Zeige Histogramm', style=ient_wdgtl_style)
w = widgets.interactive(update_plot, sig=w_sig, ms=w_ms, sigmas=w_sigmas, F=w_F, show_hist=w_show_hist)
display(widgets.HBox((widgets.VBox((w_sig, w_ms, w_sigmas)), widgets.VBox((w_F, w_show_hist), layout=Layout(margin='0 0 0 100px'))))); w.update();
# Update red x line
@widgets.interact(xsel = widgets.FloatSlider(min=-5.5, max=5.5, step=0.1, value=-5.5, description='$x$:', continuous_update=True))
def update_x(xsel):
global ps, Ps
ind = find_ind_least_diff(x, xsel)
Pssel = Ps[ind]; pssel = ps[ind]
if len(axs[0,0].lines) < 2:
ax = axs[0,0]; ax.axhline(xsel,ax.get_xlim()[0],ax.get_xlim()[1], color='rot',linestyle='-',lw=1)
axs[0,1].plot(Pssel, xsel, **highlight_args)
axs[1,0].plot(xsel, pssel, **highlight_args)
else:
axs[0,0].lines[1].set_ydata(xsel); axs[0,1].lines[-1].set_data(Pssel, xsel); axs[1,0].lines[-1].set_data(xsel, pssel)
```
%% Cell type:markdown id: tags:
## Aufgaben
Betrachte zunächst ein Gauß-verteiltes Signal.
* Ändere den Mittelwert $m_s$. Was passiert mit dem Signal? Wie verhält sich die Verteilungsfunktion, wie die Verteilungsdichtefunktion?
* Verändere nun die Standardabweichung. Welche Auswirkungen kannst du in den Plots beobachten?
* Nun verändere die Frequenz. Was passiert?
Ändere nun den Signaltyp auf gleichverteilt.
* Was kann beobachtet werden, wenn $m_s$ und $\sigma_s$ geändert werden?
* Aktiviere nun das Histogramm, welches die Werte der aktuellen Musterfunktion zusätzlich mitplottet. Verändere die Standardabweichung. Wie verhält sich das Histogramm gegenüber der idealen Verteilungs- und Verteilungsdichtefunktion? Woher kommen die Unterschiede?
Wähle nun ein sinusförmiges Signal.
* Variiere die Frequenz. Welche Auswirkungen hat dies auf die Verteilungs- und Verteilungsdichtefunktion?
* Aktiviere wieder das Histogramm. Was passiert bei Veränderung der Standardabweichung?
Abschließend wird ein dreieckförmiges Signal betrachtet.
* Was fällt dir an der Verteilungsdichtefunktion auf?
* Verändere die Standardabweichung und betrachte, wie sich das Histogramm verhält. Was ist hier anders als beim gleichverteilten Signal? Warum?
Für beliebige Signale:
* Wie lassen sich die Verteilungs- und die Verteilungsdichtefunktion aus dem Signal bestimmen?
%% Cell type:markdown id: tags:
----
%% Cell type:markdown id: tags:
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).
Please attribute the work as follows:
*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.
......@@ -58,11 +58,11 @@
Der Mittelwert $m_s$ eines Signals ist der Erwartungswert:
$$m_s=\mathcal{E}\{s(t)\}=\int_{-\infty}^{\infty}xp_s(x)\mathrm{d}x$$
Der Mittelwert eines ergodischen Prozesses entspricht dem Gleichanteil des Signals.
Die Leistung $L_s$ eines Signals ist definiert als
$$m_s=\mathcal{E}\{s^2(t)\}=\int_{-\infty}^{\infty}x^2p_s(x)\mathrm{d}x\text{.}$$
$$L_s=\mathcal{E}\{s^2(t)\}=\int_{-\infty}^{\infty}x^2p_s(x)\mathrm{d}x\text{.}$$
Die Standardabweichung $\sigma_s$ kann nun aus Mittelwert und Leistung berechnet werden:
$$\sigma_s=\sqrt{L_s-m_s^2}$$
In der Formelsammlung können die Zusammenhänge zwischen Verteilungsdichtefunktion, Mittelwert, Leistung und Standardabweichung für Gauß- und gleichverteilte stationäre Prozesse gefunden werden.
......@@ -131,124 +131,13 @@
ient_audio_play(s, fs)
```
%% Cell type:markdown id: tags:
## Interaktive Demo
Eine ausführlichere Demo zur Verteilungs- und Verteilungsdichtefunktion findet man [hier](GDET3%20Verteilungsfunktion%20GUI.ipynb).
Die folgende interaktive Demo soll veranschaulichen, wie sich Musterfunktionen eines Zufallsprozesses verhalten.
Es können verschiedene Signaltypen (Gauß-verteilt, gleichverteilt, sinusförmig oder dreieckförmig) ausgewählt werden. In der Grafik werden dann jeweils die zugehörigen Verteilungsfunktionen $P_s(x)$ und die Verteilungsdichtefunktion $p_s(x)$ angezeigt.
Das Verhalten der einzelnen Signale kann dann zusätzlich über die Schieberegler beeinflusst werden. Es ist möglich, den Mittelwert $m_s$, die Standardabweichung $\sigma_s$ und die Frequenz $F$ zu verändern.
Durch Klicken kann das Histogram der aktuellen Musterfunktion zusätzlich zur Verteilungsdichtefunktion angezeigt werden.
%% Cell type:code id: tags:
``` python
fig, axs = plt.subplots(2, 2, **ient_landscape, gridspec_kw = {'width_ratios':[3, 1]}); global ps, Ps;
def update_plot(sig, ms, sigmas, F, show_hist):
global ps, Ps
# Sample from given distribution
if sig == 'Gauß-verteilt':
s = np.random.normal(ms, sigmas, len(t));
ps = gaussian_pdf(x, ms, sigmas); Ps = gaussian_pf(x, ms, sigmas);
elif sig == 'Gleichverteilt':
a = np.sqrt(12*sigmas**2); smin = -0.5*a+ms; smax = 0.5*a+ms;
s = np.random.uniform(smin, smax, len(t));
ps = uniform_pdf(x, ms, a); Ps = uniform_pf(x, ms, a);
elif sig == 'Sinus':
A = sigmas*np.sqrt(2);
s = A*(np.sin(2*np.pi*t*F)) + ms;
ps = np.zeros_like(x); Ps = np.zeros_like(x); mask = np.abs(x-ms) < A;
ps[mask] = 1/np.pi*1/np.sqrt(A**2-(x[mask]-ms)**2);
Ps[mask] = 0.5 + 1/np.pi*np.arcsin((x[mask]-ms)/A); Ps += unitstep(x-A-ms);
elif sig == 'Dreieck':
A = np.sqrt(12)*sigmas;
s = A*tri_sum(t*F)- A/2 + ms;
ps = uniform_pdf(x, ms, A); Ps = uniform_pf(x, ms, A);
# Calculate histogram to estimate p_s(x) and P_s(x)
ps_hist, bins = np.histogram(s, bins='auto', range=(-Amax, Amax), density=True)
Ps_hist = np.cumsum(ps_hist)*np.mean(np.diff(bins))
x_hist = (bins[:-1] + bins[1:])/2 # x-axis
# Plot
if not axs[0,0].lines:
# First axis displays stoch. process s(t) in time-domain
ax = axs[0,0]; ax.plot(t*1000, s, 'rwth');
ax.set_xlabel(r'$\rightarrow t$ [ms]', bbox=ient_wbbox);
ax.set_ylabel(r'$\uparrow {}^k s(t)$');
ax.set_yticks(np.arange(-Amax,Amax+1,2)); ax.lines[0].zorder = 0;
ax.set_xlim([-8.5,8.5]); ax.set_ylim([-5.5,5.5]); ient_grid(ax); ient_axis(ax)
# Second axis displays prob. function P_s(x) vertical
ax = axs[0,1]; ax.plot(Ps, x, 'rwth'); ient_stem(ax, Ps_hist, x_hist, 'black-50', markerfmt=" "); #ax.plot(Ps_hist, x_hist, 'k--');
ax.set_xlabel(r'$\rightarrow P_s(x)$'); ax.set_ylabel(r'$\uparrow x$');
ax.set_yticks(axs[0,0].get_yticks());
ax.set_xlim([-0.05,1.49]); ax.set_ylim(axs[0,0].get_ylim()); ient_grid(ax); ient_axis(ax);
# Third axis displays prob. density function p_s(x)
ax = axs[1,0]; ax.plot(x, ps, 'rwth'); ient_stem(ax, x_hist, ps_hist, 'black-50', markerfmt=" ");# ax.plot(x_hist, ps_hist, 'k--');
ax.set_xlabel(r'$\rightarrow x$'); ax.set_ylabel(r'$\uparrow p_s(x)$');
ax.set_xticks(axs[0,0].get_yticks());
ax.set_xlim(axs[0,0].get_ylim()); ax.set_ylim([-0.05, 1.25]); ient_grid(ax); ient_axis(ax);
axs[1,1].set_visible(False); fig.tight_layout();
else:
axs[0,0].lines[0].set_ydata(s);
axs[0,1].lines[0].set_xdata(Ps); ient_stem_set_data(axs[0,1].containers[0], Ps_hist, x_hist)
axs[1,0].lines[0].set_ydata(ps); ient_stem_set_data(axs[1,0].containers[0], x_hist, ps_hist)
list(map(lambda x: x.set_visible(show_hist), axs[0,1].containers[0])); list(map(lambda x: x.set_visible(show_hist), axs[1,0].containers[0]))
#axs[0,1].lines[1].set_visible(show_hist); axs[1,0].lines[1].set_visible(show_hist);
# Widgets
w_sig = widgets.Dropdown(options=['Gauß-verteilt', 'Gleichverteilt', 'Sinus', 'Dreieck'], description='Signal:')
w_ms = widgets.FloatSlider(min=-2, max=2, step=0.1, value=0, description='$m_s$:', continuous_update=False)
w_sigmas = widgets.FloatSlider(min=0.1, max=2, step=0.1, value=1, description='$\sigma_s$:', continuous_update=False)
w_F = widgets.FloatSlider(min=200, max=1000, step=10, value=440, description='Frequenz $F$', style=ient_wdgtl_style, continuous_update=False)
w_show_hist = widgets.Checkbox(value=False, description='Zeige Histogramm', style=ient_wdgtl_style)
w = widgets.interactive(update_plot, sig=w_sig, ms=w_ms, sigmas=w_sigmas, F=w_F, show_hist=w_show_hist)
display(widgets.HBox((widgets.VBox((w_sig, w_ms, w_sigmas)), widgets.VBox((w_F, w_show_hist), layout=Layout(margin='0 0 0 100px'))))); w.update();
# Update red x line
@widgets.interact(xsel = widgets.FloatSlider(min=-5.5, max=5.5, step=0.1, value=-5.5, description='$x$:', continuous_update=True))
def update_x(xsel):
global ps, Ps
ind = find_ind_least_diff(x, xsel)
Pssel = Ps[ind]; pssel = ps[ind]
if len(axs[0,0].lines) < 2:
ax = axs[0,0]; ax.axhline(xsel,ax.get_xlim()[0],ax.get_xlim()[1], color='rot',linestyle='-',lw=1)
axs[0,1].plot(Pssel, xsel, **highlight_args)
axs[1,0].plot(xsel, pssel, **highlight_args)
else:
axs[0,0].lines[1].set_ydata(xsel); axs[0,1].lines[-1].set_data(Pssel, xsel); axs[1,0].lines[-1].set_data(xsel, pssel)
```
%% Cell type:markdown id: tags:
## Aufgaben
Betrachte zunächst ein Gauß-verteiltes Signal.
* Ändere den Mittelwert $m_s$. Was passiert mit dem Signal? Wie verhält sich die Verteilungsfunktion, wie die Verteilungsdichtefunktion?
* Verändere nun die Standardabweichung. Welche Auswirkungen kannst du in den Plots beobachten?
* Nun verändere die Frequenz. Was passiert?
Ändere nun den Signaltyp auf gleichverteilt.
* Was kann beobachtet werden, wenn $m_s$ und $\sigma_s$ geändert werden?
* Aktiviere nun das Histogramm, welches die Werte der aktuellen Musterfunktion zusätzlich mitplottet. Verändere die Standardabweichung. Wie verhält sich das Histogramm gegenüber der idealen Verteilungs- und Verteilungsdichtefunktion? Woher kommen die Unterschiede?
Wähle nun ein sinusförmiges Signal.
* Variiere die Frequenz. Welche Auswirkungen hat dies auf die Verteilungs- und Verteilungsdichtefunktion?
* Aktiviere wieder das Histogramm. Was passiert bei Veränderung der Standardabweichung?
Abschließend wird ein dreieckförmiges Signal betrachtet.
* Was fällt dir an der Verteilungsdichtefunktion auf?
* Verändere die Standardabweichung und betrachte, wie sich das Histogramm verhält. Was ist hier anders als beim gleichverteilten Signal? Warum?
Für beliebige Signale:
* Wie lassen sich die Verteilungs- und die Verteilungsdichtefunktion aus dem Signal bestimmen?
----
%% Cell type:markdown id: tags:
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).
......
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