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

- cleaning up

parent 1d4359ec
%% Cell type:code id: tags:
``` python
# Copyright 2019 Institut für Nachrichtentechnik, RWTH Aachen University
%matplotlib widget
from ient_nb.ient_signals import *
from ient_nb.ient_plots import *
from ient_nb.ient_transforms import *
from src.z_transform.z_transform import zPlot
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
```
%% Cell type:markdown id: tags:
<div>
<img src="ient_nb/figures/rwth_ient_logo@2x.png" style="float: right;height: 5em;">
</div>
# z-Transformation
Zum Starten: Im Menü: Run <span class="fa-chevron-right fa"></span> Run All Cells auswählen.
%% 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
%% Cell type:code id: tags:
``` python
fig = plt.figure(figsize=(10, 10/16*9))
zp = zPlot(fig)
```
%% Cell type:markdown id: tags:
### 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.
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.
### 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?
* 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 ein Pol-/Nullstellendiagram mit mehreren möglichen Polstellen. Ändere den Konvergenzbereich. Wann existiert eine Übertragungsfunktion?
%% 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:
*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():
class zPlot():
pp = np.array([])
pz = np.array([])
roc = {'sigma': [0, 0], 'zroc' : None, 'inf': 12}
roc = {'sigma': [0, 0], 'zroc': None, 'inf': 12}
qdelta = 0.1
qthresh = 0.1
fig = None
......@@ -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([])):
self.H0 = 1
#self.filter = 'unit'
# self.filter = 'unit'
self.H0_txt = None
self.systemIsStable = True
......@@ -107,7 +107,7 @@ class zPlot():
self.update_point(p, self.mode)
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'
def onkeyrelease(event):
......@@ -130,17 +130,12 @@ class zPlot():
self.handles['axH'].set_xlabel(r'$\rightarrow f$')
self.handles['axH'].set_ylabel(r'$\uparrow |H(f)|$ [dB]')
self.stabilitytxt = self.handles['axH'].text(-6, 0,
'Das System is nicht stabil!',
fontsize=12, color='rot', visible=False, bbox=ient_wbbox)
'Das System is nicht stabil!',
fontsize=12, color='rot', visible=False, bbox=ient_wbbox)
self.handles['lineH'], = self.handles['axH'].plot(self.f, self.f)
ient_axis(self.handles['axH'])
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
self.w_filter_type = interactive(self.update_filter,
filtr=widgets.Dropdown(options=list(self.filter_types.keys()),
......@@ -218,14 +213,13 @@ class zPlot():
# Quantize point to grid and find closest point
p = self.qdelta * round(p.real / self.qdelta) + 1j * self.qdelta * round(p.imag / self.qdelta)
pPoint, ind = self.find_closest_point(p, mode)
if p == 0:
return
# Add new or delete point or update order
if pPoint is None:
if self.action == 'add': # add new point
pPoint = pzPoint(p, neword)
if mode == 'p':
if p == 0: return
self.pp = np.append(self.pp, pPoint)
ind = self.pp.size - 1
plotstyle = ient_style_poles
......@@ -244,7 +238,7 @@ class zPlot():
else: # delete / update order
if self.action == 'add': # increase order
#pPoint.order += 1
# pPoint.order += 1
pass
elif self.action == 'del':
......@@ -301,15 +295,12 @@ class zPlot():
self.roc['sigma'][1] = right
xx = np.array([self.roc['sigma'][0], self.roc['sigma'][1]])
if self.roc['zroc'] is None:
self.roc['zroc'] = ient_plot_zroc(self.ax, xx)
else:
if self.roc['zroc'] is not None:
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()
# path = pzp.roc['hatch'].get_paths()[0]
# path.vertices[path.vertices[:,0] == 1,0] = 2
def update_mode(self, mode):
self.mode = self.mode_types[mode]
......@@ -365,13 +356,8 @@ class zPlot():
self.pp = self.pz = np.array([])
def update_widgets(filtr):
if filtr == "Manuell":
b = False
else:
b = True
self.w_action_type.children[0].disabled = b
self.w_point_type.children[0].disabled = b
self.w_action_type.children[0].disabled = filtr != 'Manuell'
self.w_point_type.children[0].disabled = filtr != 'Manuell'
# add default filter poles and zeroes to plot
def def_points():
......@@ -425,7 +411,7 @@ class zPlot():
ient_stem_set_ydata(self.handles['containerh'], np.real(h_n))
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
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