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

- cleaning up

parent 1d4359ec
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Copyright 2019 Institut für Nachrichtentechnik, RWTH Aachen University # Copyright 2019 Institut für Nachrichtentechnik, RWTH Aachen University
%matplotlib widget %matplotlib widget
from ient_nb.ient_signals import * from ient_nb.ient_signals import *
from ient_nb.ient_plots import * from ient_nb.ient_plots import *
from ient_nb.ient_transforms import * from ient_nb.ient_transforms import *
from src.z_transform.z_transform import zPlot from src.z_transform.z_transform import zPlot
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec import matplotlib.gridspec as gridspec
import numpy as np import numpy as np
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<div> <div>
<img src="ient_nb/figures/rwth_ient_logo@2x.png" style="float: right;height: 5em;"> <img src="ient_nb/figures/rwth_ient_logo@2x.png" style="float: right;height: 5em;">
</div> </div>
# z-Transformation # z-Transformation
Zum Starten: Im Menü: Run <span class="fa-chevron-right fa"></span> Run All Cells auswählen. Zum Starten: Im Menü: Run <span class="fa-chevron-right fa"></span> Run All Cells auswählen.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### plotting pole zero plot in z-plane
%% Cell type:code id: tags:
``` python
n = np.linspace(-5, 5, 11)
pp = np.array([0.5, 2]); pz = np.array([0])
roc = np.array([0.5, 2])
#roc = np.array([-b, np.inf])
fig, axs = plt.subplots(1, 2, figsize=(8, 8/ient_fig_aspect))
ax = axs[0]
ax.set_aspect('equal', adjustable='datalim')
zroc = ient_plot_zroc(ax, roc)
ax.plot(np.real(pp), np.imag(pp), **ient_style_poles); ax.plot(np.real(pp), -np.imag(pp), **ient_style_poles)
ax.plot(np.real(pz), np.imag(pz), **ient_style_zeros); ax.plot(np.real(pz), -np.imag(pz), **ient_style_zeros)
ax.set_xlabel(r'$\rightarrow \mathrm{Re}$'); ax.set_ylabel(r'$\uparrow \mathrm{Im}$');
ax.set_xlim(np.min(n), np.max(n)); ax.set_ylim(ax.get_xlim()); ient_grid(ax); ient_axis(ax)
ax = axs[1]
h_n = ient_iz_ht(n, 1, pp, pz, roc= roc)
ax.set_xlabel(r'$\rightarrow \mathrm{n}$'); ax.set_ylabel(r'$\uparrow \mathrm{h(n)}$');
ax.set_xlim(np.min(n), np.max(n)); ient_update_ylim(ax, h_n, 0.19, 1e05); ient_grid(ax); ient_axis(ax)
ient_stem(ax, n, np.real(h_n))
```
%% Cell type:markdown id: tags:
## Interaktive Demo ## Interaktive Demo
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
fig = plt.figure(figsize=(10, 10/16*9)) fig = plt.figure(figsize=(10, 10/16*9))
zp = zPlot(fig) zp = zPlot(fig)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Anleitung ### Anleitung
Es können vier verschiedene Filter (Butterworth, Sprungfunktion, Sinus und Cosinus) voreingestellt werden. Über den Schieberegler kann der Wert für $H_0$ angepasst werden. Wird der Butterworthfilter gewählt, ist hier der Grad $P$ einstellbar. Es können vier verschiedene Filter (Butterworth, Sprungfunktion, Sinus und Cosinus) voreingestellt werden. Über den Schieberegler kann der Wert für $H_0$ angepasst werden. Wird der Butterworthfilter gewählt, ist hier der Grad $P$ einstellbar.
Bei *Modus* kann die Position des Konvergenzbereichs geändert werden, indem die entsprechende Option eingestellt und im Pol-/Nullstellendiagramm auf den Bereich geklickt wird, der der neue Konvergenzbereich sein soll. Bei *Modus* kann die Position des Konvergenzbereichs geändert werden, indem die entsprechende Option eingestellt und im Pol-/Nullstellendiagramm auf den Bereich geklickt wird, der der neue Konvergenzbereich sein soll.
Ähnlich können auch Pol- und Nullstellen hinzugefügt oder gelöscht werden. Bei *Typ* wird eingestellt, ob es sich um eine Pol- oder Nullstelle handeln soll und unter *Modus* wird dann *hinzufügen* oder *löschen* ausgewählt. Durch Klicken im Pol-/Nullstellendiagramm können nun Pol- und Nullstellen hinzugefügt oder gelöscht werden. Entsprechend ändern sich dann auch die zugehörige Impulsantwort und Übertragungsfunktion. Ähnlich können auch Pol- und Nullstellen hinzugefügt oder gelöscht werden. Bei *Typ* wird eingestellt, ob es sich um eine Pol- oder Nullstelle handeln soll und unter *Modus* wird dann *hinzufügen* oder *löschen* ausgewählt. Durch Klicken im Pol-/Nullstellendiagramm können nun Pol- und Nullstellen hinzugefügt oder gelöscht werden. Entsprechend ändern sich dann auch die zugehörige Impulsantwort und Übertragungsfunktion.
### Aufgaben ### Aufgaben
* Teste verschiedene Einstellungen und ihre Auswirkungen auf Impulsantwort und Übertragungsfunktion. Welche Auswirkung hat das Ändern von $H_0$? Wie sehen die voreingestellten Funktionen aus? * Teste verschiedene Einstellungen und ihre Auswirkungen auf Impulsantwort und Übertragungsfunktion. Welche Auswirkung hat das Ändern von $H_0$? Wie sehen die voreingestellten Funktionen aus?
* Entferne alle Pole und Nullstellen. Wie sieht die Impulsantwort aus? Welche Auswirkung hat das Ändern von $H_0$? * Entferne alle Pole und Nullstellen. Wie sieht die Impulsantwort aus? Welche Auswirkung hat das Ändern von $H_0$?
* Erstelle eine Polstelle auf der imaginären Achse. Welche Auswirkung hat diese auf die Übertragungsfunktion? * Erstelle eine Polstelle auf der imaginären Achse. Welche Auswirkung hat diese auf die Übertragungsfunktion?
* Erstelle ein Pol-/Nullstellendiagram mit mehreren möglichen Polstellen. Ändere den Konvergenzbereich. Wann existiert eine Übertragungsfunktion? * Erstelle ein Pol-/Nullstellendiagram mit mehreren möglichen Polstellen. Ändere den Konvergenzbereich. Wann existiert eine Übertragungsfunktion?
%% 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). 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: Please attribute the work as follows:
*Emin Kosar, Christian Rohlfing, Übungsbeispiele zur Vorlesung "Grundgebiete der Elektrotechnik 3 - Signale und Systeme"*, gehalten von Jens-Rainer Ohm, 2019, Institut für Nachrichtentechnik, RWTH Aachen University. *Emin Kosar, Christian Rohlfing, Übungsbeispiele zur Vorlesung "Grundgebiete der Elektrotechnik 3 - Signale und Systeme"*, gehalten von Jens-Rainer Ohm, 2019, Institut für Nachrichtentechnik, RWTH Aachen University.
......
...@@ -26,7 +26,7 @@ class pzPoint(): ...@@ -26,7 +26,7 @@ class pzPoint():
class zPlot(): class zPlot():
pp = np.array([]) pp = np.array([])
pz = np.array([]) pz = np.array([])
roc = {'sigma': [0, 0], 'zroc' : None, 'inf': 12} roc = {'sigma': [0, 0], 'zroc': None, 'inf': 12}
qdelta = 0.1 qdelta = 0.1
qthresh = 0.1 qthresh = 0.1
fig = None fig = None
...@@ -45,7 +45,7 @@ class zPlot(): ...@@ -45,7 +45,7 @@ class zPlot():
def __init__(self, fig, pp=np.array([0]), pz=np.array([]), ord_p=np.array([1]), ord_z=np.array([])): def __init__(self, fig, pp=np.array([0]), pz=np.array([]), ord_p=np.array([1]), ord_z=np.array([])):
self.H0 = 1 self.H0 = 1
#self.filter = 'unit' # self.filter = 'unit'
self.H0_txt = None self.H0_txt = None
self.systemIsStable = True self.systemIsStable = True
...@@ -107,7 +107,7 @@ class zPlot(): ...@@ -107,7 +107,7 @@ class zPlot():
self.update_point(p, self.mode) self.update_point(p, self.mode)
def onkeypress(event): def onkeypress(event):
self.action_locked = True if self.action == 'del' else False self.action_locked = self.action == 'del'
self.w_action_type.children[0].value = 'Löschen' self.w_action_type.children[0].value = 'Löschen'
def onkeyrelease(event): def onkeyrelease(event):
...@@ -130,17 +130,12 @@ class zPlot(): ...@@ -130,17 +130,12 @@ class zPlot():
self.handles['axH'].set_xlabel(r'$\rightarrow f$') self.handles['axH'].set_xlabel(r'$\rightarrow f$')
self.handles['axH'].set_ylabel(r'$\uparrow |H(f)|$ [dB]') self.handles['axH'].set_ylabel(r'$\uparrow |H(f)|$ [dB]')
self.stabilitytxt = self.handles['axH'].text(-6, 0, self.stabilitytxt = self.handles['axH'].text(-6, 0,
'Das System is nicht stabil!', 'Das System is nicht stabil!',
fontsize=12, color='rot', visible=False, bbox=ient_wbbox) fontsize=12, color='rot', visible=False, bbox=ient_wbbox)
self.handles['lineH'], = self.handles['axH'].plot(self.f, self.f) self.handles['lineH'], = self.handles['axH'].plot(self.f, self.f)
ient_axis(self.handles['axH']) ient_axis(self.handles['axH'])
self.handles['axH'].spines['bottom'].set_position(('outward', 0)) self.handles['axH'].spines['bottom'].set_position(('outward', 0))
# initial dirac plot
(self.cp, self.cn) = ient_plot_dirac(self.handles['axh'], [-1, 1], [-1, 1], 'rwth')
ient_dirac_set_data((self.cp, self.cn), [], [])
fig.tight_layout();
# Widgets # Widgets
self.w_filter_type = interactive(self.update_filter, self.w_filter_type = interactive(self.update_filter,
filtr=widgets.Dropdown(options=list(self.filter_types.keys()), filtr=widgets.Dropdown(options=list(self.filter_types.keys()),
...@@ -218,14 +213,13 @@ class zPlot(): ...@@ -218,14 +213,13 @@ class zPlot():
# Quantize point to grid and find closest point # Quantize point to grid and find closest point
p = self.qdelta * round(p.real / self.qdelta) + 1j * self.qdelta * round(p.imag / self.qdelta) p = self.qdelta * round(p.real / self.qdelta) + 1j * self.qdelta * round(p.imag / self.qdelta)
pPoint, ind = self.find_closest_point(p, mode) pPoint, ind = self.find_closest_point(p, mode)
if p == 0:
return
# Add new or delete point or update order # Add new or delete point or update order
if pPoint is None: if pPoint is None:
if self.action == 'add': # add new point if self.action == 'add': # add new point
pPoint = pzPoint(p, neword) pPoint = pzPoint(p, neword)
if mode == 'p': if mode == 'p':
if p == 0: return
self.pp = np.append(self.pp, pPoint) self.pp = np.append(self.pp, pPoint)
ind = self.pp.size - 1 ind = self.pp.size - 1
plotstyle = ient_style_poles plotstyle = ient_style_poles
...@@ -244,7 +238,7 @@ class zPlot(): ...@@ -244,7 +238,7 @@ class zPlot():
else: # delete / update order else: # delete / update order
if self.action == 'add': # increase order if self.action == 'add': # increase order
#pPoint.order += 1 # pPoint.order += 1
pass pass
elif self.action == 'del': elif self.action == 'del':
...@@ -301,15 +295,12 @@ class zPlot(): ...@@ -301,15 +295,12 @@ class zPlot():
self.roc['sigma'][1] = right self.roc['sigma'][1] = right
xx = np.array([self.roc['sigma'][0], self.roc['sigma'][1]]) xx = np.array([self.roc['sigma'][0], self.roc['sigma'][1]])
if self.roc['zroc'] is None: if self.roc['zroc'] is not None:
self.roc['zroc'] = ient_plot_zroc(self.ax, xx)
else:
self.roc['zroc'].remove() self.roc['zroc'].remove()
self.roc['zroc'] = ient_plot_zroc(self.ax, xx)
self.roc['zroc'] = ient_plot_zroc(self.ax, xx)
self.update_plot() self.update_plot()
# path = pzp.roc['hatch'].get_paths()[0]
# path.vertices[path.vertices[:,0] == 1,0] = 2
def update_mode(self, mode): def update_mode(self, mode):
self.mode = self.mode_types[mode] self.mode = self.mode_types[mode]
...@@ -365,13 +356,8 @@ class zPlot(): ...@@ -365,13 +356,8 @@ class zPlot():
self.pp = self.pz = np.array([]) self.pp = self.pz = np.array([])
def update_widgets(filtr): def update_widgets(filtr):
if filtr == "Manuell": self.w_action_type.children[0].disabled = filtr != 'Manuell'
b = False self.w_point_type.children[0].disabled = filtr != 'Manuell'
else:
b = True
self.w_action_type.children[0].disabled = b
self.w_point_type.children[0].disabled = b
# add default filter poles and zeroes to plot # add default filter poles and zeroes to plot
def def_points(): def def_points():
...@@ -425,7 +411,7 @@ class zPlot(): ...@@ -425,7 +411,7 @@ class zPlot():
ient_stem_set_ydata(self.handles['containerh'], np.real(h_n)) ient_stem_set_ydata(self.handles['containerh'], np.real(h_n))
ient_update_ylim(self.handles['axh'], h_n, 0.19, ymax=1e5) ient_update_ylim(self.handles['axh'], h_n, 0.19, ymax=1e5)
self.systemIsStable = np.min(roc) < 1 and np.max(roc) > 1 self.systemIsStable = np.min(roc) < 1 < np.max(roc)
# update f-domain # update f-domain
if self.systemIsStable: if self.systemIsStable:
......
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