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
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
Danke. Mit filter Ordnung und co kriegt ich das zwar schon hin. Aber ich hätte nur gern verstanden was da passiert.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.