import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqs, bilinear, freqz
In [49]:
In [51]:
# Analoger Biquad Filter
# Bilinear Transformation basierend auf dem Experiment 4 der
# Biquad Schaltung aus Analog System Lab Kit PRO
= 1000
R = 100e-9
C = 1 / (R * C)
w0 = 4.7
Q = 44100
fs
# Nenner
= [1, w0/Q, w0**2]
dens # Tiefpass Zähler
= [0, 0, w0**2]
TP_nums = freqs(TP_nums, dens, worN = 512)
ws_TP, Hs_TP # Hochpass Zähler
= [1, 0, 0]
HP_nums = freqs(HP_nums, dens, worN = 512)
ws_HP, Hs_HP # Bandpass Zähler
= [0, -w0, 0]
BP_nums = freqs(BP_nums, dens, worN = 512)
ws_BP, Hs_BP # Bandstop Zähler
= [1, 0, w0**2]
BS_nums = freqs(BS_nums, dens, worN = 512) ws_BS, Hs_BS
In [53]:
# Plots der analogen Filter
1)
plt.figure(# Plot des analogen Frequenzgangs
2, 1, 1)
plt.subplot(/(2*np.pi), 20*np.log10(abs(Hs_TP)), label = 'Tiefpass')
plt.plot(ws_TP/(2*np.pi), 20*np.log10(abs(Hs_HP)), label = 'Hochpass')
plt.plot(ws_HP/(2*np.pi), 20*np.log10(abs(Hs_BP)), label = 'Bandpass')
plt.plot(ws_BP/(2*np.pi), 20*np.log10(abs(Hs_BS)), label = 'Bandstop')
plt.plot(ws_BSTrue)
plt.grid('Analoge Biquad Frequenzgänge')
plt.title('Frequenz in [Hz]')
plt.xlabel('Amplitude in [dB]')
plt.ylabel(0, 4000])
plt.xlim([-30, 15])
plt.ylim([='lower right')
plt.legend(loc
# Plot der analogen Phase
2, 1, 2)
plt.subplot(/(2*np.pi), np.unwrap(np.angle(Hs_TP))*(180/np.pi), label = 'Tiefpass')
plt.plot(ws_TP/(2*np.pi), np.unwrap(np.angle(Hs_HP))*(180/np.pi), label = 'Hochpass')
plt.plot(ws_HP/(2*np.pi), np.unwrap(np.angle(Hs_BP))*(180/np.pi), label = 'Bandpass')
plt.plot(ws_BP/(2*np.pi), np.unwrap(np.angle(Hs_BS))*(180/np.pi), label = 'Bandstop')
plt.plot(ws_BSTrue)
plt.grid('Analoge Biquad Phase')
plt.title('Frequenz in [Hz]')
plt.xlabel('Phase in [Grad]')
plt.ylabel(0, 4000])
plt.xlim([-300, 200])
plt.ylim([='lower right')
plt.legend(loc
plt.tight_layout() plt.show()
In [55]:
# Bilineartransformation
# Tiefpass
= bilinear(TP_nums, dens, fs = fs)
TP_numz, TP_denz = freqz(TP_numz, TP_denz, worN = 512, fs = fs)
wz_TP, Hz_TP # Hochpass
= bilinear(HP_nums, dens, fs = fs)
HP_numz, HP_denz = freqz(HP_numz, HP_denz, worN = 512, fs = fs)
wz_HP, Hz_HP # Bandpass
= bilinear(BP_nums, dens, fs = fs)
BP_numz, BP_denz = freqz(BP_numz, BP_denz, worN = 512, fs = fs)
wz_BP, Hz_BP # Bandstop
= bilinear(BS_nums, dens, fs = fs)
BS_numz, BS_denz = freqz(BS_numz, BS_denz, worN = 512, fs = fs) wz_BS, Hz_BS
In [57]:
# Plot der digitalen Filter
2)
plt.figure(# Plot des digitalen Frequenzgangs
2, 1, 1)
plt.subplot(20*np.log10(abs(Hz_TP)), label = 'Tiefpass')
plt.plot(wz_TP, 20*np.log10(np.maximum(abs(Hz_HP), 1e-10)), label = 'Hochpass')
plt.plot(wz_HP, 20*np.log10(np.maximum(abs(Hz_BP), 1e-10)), label = 'Bandpass')
plt.plot(wz_BP, 20*np.log10(abs(Hz_BS)), label = 'Bandstop')
plt.plot(wz_BS, True)
plt.grid('Digitale Biquad Frequenzgänge')
plt.title('Frequenz in [Hz]')
plt.xlabel('Amplitude in [dB]')
plt.ylabel(0, 4000])
plt.xlim([-30, 15])
plt.ylim([='lower right')
plt.legend(loc
# Plot der digitalen Phase
2, 1, 2)
plt.subplot(*(180/np.pi), label = 'Tiefpass')
plt.plot(wz_TP, np.unwrap(np.angle(Hz_TP))*(180/np.pi), label = 'Hochpass')
plt.plot(wz_HP, np.unwrap(np.angle(Hz_HP))*(180/np.pi), label = 'Bandpass')
plt.plot(wz_BP, np.unwrap(np.angle(Hz_BP))*(180/np.pi), label = 'Bandstop')
plt.plot(wz_BS, np.unwrap(np.angle(Hz_BS))True)
plt.grid('Digitale Biquad Phase')
plt.title('Frequenz in [Hz]')
plt.xlabel('Phase in [Grad]')
plt.ylabel(0, 4000])
plt.xlim([-300, 200])
plt.ylim([='lower right')
plt.legend(loc
plt.tight_layout() plt.show()
In [59]:
# Vergleich analog vs digital
plt.figure()2, 1, 1)
plt.subplot(/(2*np.pi), 20*np.log10(abs(Hs_TP)), label = 'Tiefpass')
plt.plot(ws_TP/(2*np.pi), 20*np.log10(abs(Hs_HP)), label = 'Hochpass')
plt.plot(ws_HP/(2*np.pi), 20*np.log10(abs(Hs_BP)), label = 'Bandpass')
plt.plot(ws_BP/(2*np.pi), 20*np.log10(abs(Hs_BS)), label = 'Bandstop')
plt.plot(ws_BS20*np.log10(abs(Hz_TP)), '--', label = 'Tiefpass')
plt.plot(wz_TP, 20*np.log10(np.maximum(abs(Hz_HP), 1e-10)), '--', label = 'Hochpass')
plt.plot(wz_HP, 20*np.log10(np.maximum(abs(Hz_BP), 1e-10)), '--', label = 'Bandpass')
plt.plot(wz_BP, 20*np.log10(abs(Hz_BS)), '--', label = 'Bandstop')
plt.plot(wz_BS, True)
plt.grid('Vergleich: Digital vs. Analog - Frequenzgang')
plt.title('Frequenz in [Hz]')
plt.xlabel('Amplitude in [dB]')
plt.ylabel(0, 4000])
plt.xlim([-30, 15])
plt.ylim([
plt.legend()
2, 1, 2)
plt.subplot(/(2*np.pi), np.unwrap(np.angle(Hs_TP))*(180/np.pi), label = 'Tiefpass')
plt.plot(ws_TP/(2*np.pi), np.unwrap(np.angle(Hs_HP))*(180/np.pi), label = 'Hochpass')
plt.plot(ws_HP/(2*np.pi), np.unwrap(np.angle(Hs_BP))*(180/np.pi), label = 'Bandpass')
plt.plot(ws_BP/(2*np.pi), np.unwrap(np.angle(Hs_BS))*(180/np.pi), label = 'Bandstop')
plt.plot(ws_BS*(180/np.pi), '--', label = 'Tiefpass')
plt.plot(wz_TP, np.unwrap(np.angle(Hz_TP))*(180/np.pi), '--', label = 'Hochpass')
plt.plot(wz_HP, np.unwrap(np.angle(Hz_HP))*(180/np.pi), '--', label = 'Bandpass')
plt.plot(wz_BP, np.unwrap(np.angle(Hz_BP))*(180/np.pi), '--', label = 'Bandstop')
plt.plot(wz_BS, np.unwrap(np.angle(Hz_BS))True)
plt.grid('Vergleich: Digital vs. Analog - Phase')
plt.title('Frequenz in [Hz]')
plt.xlabel('Phase in [Grad]')
plt.ylabel(0, 4000])
plt.xlim([-300, 200])
plt.ylim([
plt.legend()
plt.tight_layout() plt.show()
In [61]:
# Filterkoeffizienten ausgeben
def print_coefficients(name, num, den):
print(f'\nKoeffizienten {name}:')
print('Zähler:', np.round(num, 7))
print('Nenner:', np.round(den, 7))
'Digitaler Tiefpass', TP_numz, TP_denz)
print_coefficients('Digitaler Hochpass', HP_numz, HP_denz)
print_coefficients('Digitaler Bandpass', BP_numz, BP_denz)
print_coefficients('Digitaler Bandstop', BS_numz, BS_denz) print_coefficients(
Koeffizienten Digitaler Tiefpass:
Zähler: [0.0123963 0.0247927 0.0123963]
Nenner: [ 1. -1.9038888 0.9534742]
Koeffizienten Digitaler Hochpass:
Zähler: [ 0.9643408 -1.9286815 0.9643408]
Nenner: [ 1. -1.9038888 0.9534742]
Koeffizienten Digitaler Bandpass:
Zähler: [-0.1093357 0. 0.1093357]
Nenner: [ 1. -1.9038888 0.9534742]
Koeffizienten Digitaler Bandstop:
Zähler: [ 0.9767371 -1.9038888 0.9767371]
Nenner: [ 1. -1.9038888 0.9534742]