Forum: Digitale Signalverarbeitung / DSP / Machine Learning Filter Design Frage


von Mat. K. (matthias_kornfield)


Angehängte Dateien:

Lesenswert?

Hi

ich habe ein Bandstop um 50 Hz. Wenn der Input des Filters eine 
Konstante ist(400000) fängt der output zu oszilieren.
Warum? geht es da um "infinite impulse response"? Oder Quantisierungs 
Effekte?


hier noch der python code dazu:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import iirnotch, filtfilt, lfilter
from scipy.signal import iirnotch, freqz, lfilter, impulse, iirfilter

# Parameters
fs = 1000  # Sampling frequency (Hz)
duration = 20  # Signal duration in seconds

# Generate the IIR notch filter
cutoff = 50
lc_freq = (cutoff - 2) / 500
hc_freq = (cutoff + 2) / 500
b_new, a_new = iirfilter(5, [lc_freq, hc_freq], btype='bandstop', 
ftype='butter')

# Generate the sinusoidal signal
t = np.linspace(0, duration, int(fs * duration), endpoint=False)
original_signal = [400000] * (fs * duration)

# Apply the notch filter
filtered_signal = lfilter(b_new, a_new, original_signal)

# Plot the results
plt.figure(figsize=(12, 6))

# Unfiltered signal
plt.subplot(2, 1, 1)
plt.plot(t, original_signal, label='Original Signal')
plt.title('Original Signal constant 400 000')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.ylim(400000-200, 400000+200)
plt.legend()


plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal, label='Filtered Signal new', color='pink')
plt.title('Filtered Signal (50 Hz band pass Applied)')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.ylim(400000-200, 400000+200)
plt.legend()
plt.tight_layout()
plt.show()

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Mat. K. schrieb:
> Warum? geht es da um "infinite impulse response"? Oder Quantisierungs
> Effekte?

Ich hab kein Pythongedoense da, um das nachzuvollziehen, aber so 
allgemein kann's schon gut sein, dass das Instabilitaeten durch 
Rundungsfehler (evtl. auch schon im Filterdesign) sind.
Wirds denn besser, wenn du die Ordnung erhoehst oder's Notch breiter 
machst?

Gruss
WK

von Mat. K. (matthias_kornfield)


Lesenswert?

Danke.
Mit filter Ordnung und co kriegt ich das zwar schon hin. Aber ich hätte 
nur gern verstanden was da passiert.

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

Moin,

Irgendwas numerisches wird's wohl sein.
Wenn ich Octave nach sowas befrage:
1
[b, a] = butter (5, [48/500, 52/500], "stop");
2
plot(cumsum(impz(b,a))(1:1000));
Dann kommt noch was vernuenftiges raus, bei hoeheren Filterordnungen 
sieht's aber auch schon hochverdaechtig nach Quatsch aus.

Gruss
WK

von Lars (rezyy)


Lesenswert?

Python rechnet in doubles. Wenn man dein Filter nimmt, liegen die Pole 
sehr nah am Einheitskreis, aber das Filter selbst ist schonmal noch 
stabil.. Nun rechnest du aber und "rundest" jedes mal -> 
Quantisierungseffekte. Diese "Rundungsfehler" werden rekursiv wieder 
eingespeist und werden wahrscheinlich eben zu diesen Fehlern führen. 
Wenn du die Ordnung erhöhst (davon ausgehend, dass das Filter stabil 
bleibt, ist ja auch nicht sicher..), kommen noch mehr Rundungsfehler 
hinzu und es könnte schlimmer werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.