add some filter stuff
This commit is contained in:
parent
18bf1c2bf3
commit
ccdbc4bf17
85
plots/04_filters.py
Normal file
85
plots/04_filters.py
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
# %%
|
||||||
|
import logging
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Tuple, Union
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from matplotlib.animation import FuncAnimation
|
||||||
|
from matplotlib.axes import Axes
|
||||||
|
from matplotlib.figure import Figure
|
||||||
|
from matplotlib.gridspec import GridSpec
|
||||||
|
from scipy import signal
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
def db20(x):
|
||||||
|
return 20 * np.log10(x)
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
wpass = 20 * 2 * np.pi
|
||||||
|
wstop = 30 * 2 * np.pi
|
||||||
|
gpass = 2
|
||||||
|
gstop = 30
|
||||||
|
|
||||||
|
o, wn = signal.cheb1ord(
|
||||||
|
wpass,
|
||||||
|
wstop,
|
||||||
|
2,
|
||||||
|
30,
|
||||||
|
analog=True,
|
||||||
|
)
|
||||||
|
zpk_cheb1 = signal.cheby1(o, gpass, wn, analog=True, output="zpk", btype="lowpass")
|
||||||
|
|
||||||
|
o, wn = signal.cheb2ord(
|
||||||
|
wpass,
|
||||||
|
wstop,
|
||||||
|
gpass,
|
||||||
|
gstop,
|
||||||
|
analog=True,
|
||||||
|
)
|
||||||
|
zpk_cheb2 = signal.cheby2(o, gpass, wn, analog=True, output="zpk", btype="lowpass")
|
||||||
|
|
||||||
|
o, wn = signal.buttord(wpass, wstop, gpass, gstop, analog=True)
|
||||||
|
zpk_butter = signal.butter(o, wn, btype="lowpass", analog=True, output="zpk")
|
||||||
|
|
||||||
|
o, wn = signal.ellipord(wpass, wstop, gpass, gstop, analog=True)
|
||||||
|
zpk_ellip = signal.ellip(o, gpass, gstop, wn, btype="lowpass", analog=True, output="zpk")
|
||||||
|
|
||||||
|
# %%
|
||||||
|
fig = plt.figure(layout="constrained")
|
||||||
|
gs = GridSpec(2, 2, figure=fig)
|
||||||
|
ax_zp = fig.add_subplot(gs[:, 0])
|
||||||
|
ax_f = fig.add_subplot(gs[0, 1])
|
||||||
|
ax_t = fig.add_subplot(gs[1, 1])
|
||||||
|
|
||||||
|
for z, p, k in [
|
||||||
|
zpk_cheb1,
|
||||||
|
# zpk_cheb2,
|
||||||
|
zpk_butter,
|
||||||
|
zpk_ellip,
|
||||||
|
]:
|
||||||
|
lines_z = ax_zp.plot(np.real(z), np.imag(z), "o", mfc="none")
|
||||||
|
lines_p = ax_zp.plot(np.real(p), np.imag(p), "x", color=lines_z[0].get_color())
|
||||||
|
# plt.xlim(-150, 150)
|
||||||
|
ax_zp.grid(True)
|
||||||
|
ax_zp.set_xlabel("Real(s)")
|
||||||
|
ax_zp.set_ylabel("Imag(s)")
|
||||||
|
|
||||||
|
f = np.linspace(0.1 * np.max([wpass, wstop]), 10 * np.max([wpass, wstop]), 1001) / (2 * np.pi)
|
||||||
|
ax_f.semilogx(f, db20(signal.freqs_zpk(z, p, k, f * 2 * np.pi)[1]))
|
||||||
|
ax_f.grid(True)
|
||||||
|
ax_f.set_xlabel("Frequnecy [Hz]")
|
||||||
|
ax_f.set_ylabel("Gain [dB]")
|
||||||
|
ax_f.set_xlim(f[0], f[-1])
|
||||||
|
|
||||||
|
# t = np.arange(101)
|
||||||
|
# x = np.zeros(len(t))
|
||||||
|
# x[int(len(x) / 2)] = 1
|
||||||
|
# ax_t.plot(t, signal.lfilter(*ba, x))
|
||||||
|
# ax_t.set_ylim(-10, 100)
|
||||||
|
# ax_t.grid(True)
|
||||||
|
|
||||||
|
# %%
|
Loading…
Reference in New Issue
Block a user