Implementierung eines Low pass Filters

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

Ich habe Daten von einem IMU-Sensor. Die Daten habe ich exportiert in Excel. In der Excel Datei ist eine Spalte "Euklidische Norm", in dieser Spalte sind die Daten des Signals. Jedoch möchte ich das Rauschen am Signal reduzieren, dafür habe ich mich für den Low Pass Filter entschieden.

Ich habe den Code in Jupyter Notebook geschrieben:

Code: Alles auswählen


import numpy as np
from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
 
 
def butter_lowpass(cutoff, fs, order=5):
    nyq = fs/2
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a
 
 
def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y
 
 
data=pd.read_csv('samplesdata.csv',sep=";", decimal=",",encoding='latin-1')
sensor_data=data[['Euclidian Norm']]
sensor_data=np.array(sensor_data)
 
# Filter requirements.
order = 10
fs = 100  # sample rate, Hz
cutoff = 30 
 
y = butter_lowpass_filter(sensor_data, cutoff, fs, order)
b, a = butter_lowpass(cutoff, fs, order)
 
plt.figure()
plt.subplot(211)
plt.plot(sensor_data, color='green')
plt.grid(color='green', linestyle='--', linewidth=0.5)
plt.title('original signal')
 
plt.subplot(212)
plt.plot(y, color='red')
plt.title('Filtered')
plt.grid(color='green', linestyle='--', linewidth=0.5)
plt.show(block=True)

Jedoch zeigt es mir meine originalen bzw. die ungefilterten Daten zwei mal an, wie auf dem bild zu erkennen ist.

https://ibb.co/PCNsrs1

Ich habe die Parameter verändert, ob es was an den Daten ändert, jedoch ändert sich nichts und es zeigt mir immer dasselbe an.

Ich habe gedacht es liegt vielleicht die Code-Konventionen, also vielleicht muss ich an irgendeiner Stelle im Code ein Tab machen, weil Jupyter Notebook da sehr empfindlich ist.

Hat jemand vielleicht eine Idee woran es liegt, das meine Daten nicht gefiltert werden bzw. die gefilterteren Daten nicht angezeigt werden?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sie sind doch gefiltert. Schau doch mal auf die Skala. Die gefilterten Daten sind doch nur auf einem Bruchteil des Wertebereich verteilt.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Dienstag 8. November 2022, 19:49 Sie sind doch gefiltert. Schau doch mal auf die Skala. Die gefilterten Daten sind doch nur auf einem Bruchteil des Wertebereich verteilt.
Wie meinst du das? Müssten nicht eigentlich alle Daten gefiltert sein und die gefilterten Daten müssten doch auf den gesamten Bereich verteilt sein.

Editt: Also ich möchte die Daten glätten, mache ich da was falsch?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du glättest die doch. Ein Tiefpass verringert hoch frequente Anteile. Er eliminiert die nicht- üblicherweise. Du musst deine Daten schon in der gleichen Skalierung betrachten. Auch ein Lineal auf atomarer ebene ist ein Gebirge.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Dienstag 8. November 2022, 22:22 Du glättest die doch. Ein Tiefpass verringert hoch frequente Anteile. Er eliminiert die nicht- üblicherweise. Du musst deine Daten schon in der gleichen Skalierung betrachten. Auch ein Lineal auf atomarer ebene ist ein Gebirge.
Wie verändere ich die Skalierung, damit ich es sehe und auf was muss es die Skalierung geändert werden? Ich habe erwartet, das ich eher hügelförmige Signale sehe.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kannst du bei matplotlib nachschlagen. Oder es auch einfach lassen, weil die Tatsache, dass die geglätteten Daten so viel weniger Wertebereich haben aussagt, dass du einfach uninteressante Daten hast. Beweg die IMU mal ein bisschen, und schau dann, was passiert. Denn der LP soll ja auch nicht alles totglätten.

Wenn du aber immer noch mehr Filterung willst, muss der Filter einen geringeren cutoff haben.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Dienstag 8. November 2022, 23:53 Das kannst du bei matplotlib nachschlagen. Oder es auch einfach lassen, weil die Tatsache, dass die geglätteten Daten so viel weniger Wertebereich haben aussagt, dass du einfach uninteressante Daten hast. Beweg die IMU mal ein bisschen, und schau dann, was passiert. Denn der LP soll ja auch nicht alles totglätten.

Wenn du aber immer noch mehr Filterung willst, muss der Filter einen geringeren cutoff haben.
Die Skalierung ändert sich, wenn ich den Cutoff und den Order ändere. Beispielsweise habe ich den order auf 5 gesetzt und den cutoff auf 4. Da geht die Skala auf der y-Achse von 0,0003-0,0005 und wenn ich die Zahlen vertausche, sprich order auf 4 setzen und den cutoff auf 5, da geht die y-Achse von 1,5-2,5.
Aber beim glätten dachte ich das ich sowas sehe:

https://ibb.co/h8h3j40

Ich habe auf meine samplesdata den Moving-Average-Filter eingesetzt, was nicht der optimale Filter ist. Da sieht man das die Daten geglättet sind und der Graph stark abweicht vom Originalen.

Das richtige Bewegungen mit dem IMU Sensor, es sind Bizepcurls die aufgenommen wurden.

Wo liegt der Fehler das der Low Pass Filter in dem Fall die Daten nicht wirklich glättet? Liegt es an meinem Code?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich liegt das an deinem Code, wenn nicht das passiert, was du willst. Woran sonst?


Wenn du einen anderen Filter hast, der etwas liefert, was du willst - warum ist der nicht ideal? Und wenn dieser Filter nicht das gewünschte Ergebnis liefert, was macht den dann besser?
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Mittwoch 9. November 2022, 00:25 Natürlich liegt das an deinem Code, wenn nicht das passiert, was du willst. Woran sonst?


Wenn du einen anderen Filter hast, der etwas liefert, was du willst - warum ist der nicht ideal? Und wenn dieser Filter nicht das gewünschte Ergebnis liefert, was macht den dann besser?
Also ich würde gerne es am Low-Pass-Filter machen, da dieser Filter desöfteren benutzt wurde um IMU-Daten zu glätten. Gerne würde ich auch wissen wie der Unterschied ist zum Moving-Average-Filter, da der nicht beliebt ist.

Jedoch weiß ich nicht warum es nicht mit dem Low-pass-Filter klappt. Die Daten werden auch mit dem Bandpass-Filter geglättet, jedoch muss man beim Bandpass-Filter zusätzlich den Highcut einstellen. Da habe ich, aber leider keine Erkläung was es macht und wie man den einstellt. Ich weiß nur das es funktioniert.
Hier habe auf die samplesdata den Bandpass-Filter angesetzt:

https://ibb.co/JRF16Vd

Es klappt nur nicht mit dem Lowpass-Filter, was ich aber gerne hätte.

Ich weiß leider auch nicht an welcher Stelle, was nicht richtig im Code ist.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es ist nichts falsch an deinem Code. Was falsch ist, ist dein Verständnis, oder der Mangel daran, was ein Filter ist, und wie er wirkt. Ein moving average ist ein low pass Filter. Dein butter Filter ist eine andere Art low pass Filter. Keiner von beiden ist inhärent besser oder schlechter als der andere. Wenn der eine tut, was er soll, und der andere nicht - warum ist das ein Problem?

Wobei „tun was er soll“ natürlich relativ ist. Der Bandpass ist kompletter Murks. Nur weil da eine Art Sinus bei rumkommt, ist der nicht gut.

Was ist das konkrete Problem, das du lösen willst?
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Mittwoch 9. November 2022, 00:45 Es ist nichts falsch an deinem Code. Was falsch ist, ist dein Verständnis, oder der Mangel daran, was ein Filter ist, und wie er wirkt. Ein moving average ist ein low pass Filter. Dein butter Filter ist eine andere Art low pass Filter. Keiner von beiden ist inhärent besser oder schlechter als der andere. Wenn der eine tut, was er soll, und der andere nicht - warum ist das ein Problem?

Wobei „tun was er soll“ natürlich relativ ist. Der Bandpass ist kompletter Murks. Nur weil da eine Art Sinus bei rumkommt, ist der nicht gut.

Was ist das konkrete Problem, das du lösen willst?

Das Problem, was ich lösen möchte ist: Das ich durch Machine Learning richtig und falsche Wiederholungen von Bizepcurls unterscheiden möchte, also binär. Ich gehe nach dem Activity Recognition Chain. Was 5 verschiedene Phasen hat: Die Datenerhebung, Preprocessing, Segmentierung, Feature Extraction und Classification. Ich bin gerade in der Phase der Datenvorbereitung sprich Preprocessing. Ich möchte die Daten glätten um sie segmentieren zu können und die Feature extraction zu durchzuführen.

Die Daten wurden mit einem IMU-Sensor aufgenommen nach kriterien die zu einem richtigen Bizepcurl gehören und vorhern festgehalten wurden, damit die Daten vergleichbar sind.

Die Datenerhebung ist somit, zum großteil abgeschlossen. Ich habe mich verschiedenen Filtern auseinander gesetzt. Der Lowpass-Filter wurde, für IMU-Sensoren sehr oft benutzt. Anscheinend scheint es gut geeignet zu sein, besonders für Daten von Sportübungen.

Das wurde uns auch empfohlen, den Filter zu benutzen.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber moving average ist doch ein Low pass. Und wenn der dein Problem löst, dann ist der auch gut. Der Butter verhält sich eben anders.

Dein Code ist insofern korrekt, als das er den Filter anwendet. Wenn dir das Ergebnis nicht passt, dann musst du daran Schrauben. Aber hier kann keiner dir magische Werte nennen, die gut für deine Daten sind.

Sinn und Zweck einer solchen Pipeline ist am Ende ja auch, sie so aufzusetzen, dass man damit wiederholt das Problem durchrechnet. Und schaut, welche Parameter denn das Ergebnis zum bessern oder schlechteren verändern. Bis man (hoffentlich) zufrieden ist. Und damit kannst du ja auch mit verschiedenen Filtern und Einstellungen spielen. Bis es passt. Statt „es muss aber der sein“.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier der Artikel zum Filter: https://de.wikipedia.org/wiki/Butterworth-Filter - und hier https://dsp.stackexchange.com/questions ... ers-in-dsp eine Gegenüberstellung der beiden Verfahren. Daraus seiht man, dass der BW eine deutlich steilere Übertragungsfunktion hat. Also bis zur Grenzfrequenz (cutoff) das Signal wenig beeinflusst. Der MA hingegen hat eine viel schwächere ÜF, die schon deutlich vorher anfängt, Frequenzen abzusenken.

Welcher nun besser für deine Daten ist, musst du wissen. Oder eher ausprobieren. Denn am Ende geht es ja um die Frage, ob das ML Verfahren auf features nahe der GF achten muss, oder ob die relevante Information in niedrigeren Bändern lebt, und es sonst eher stört, wenn das höher Frequenzanteile drin sind. Aber: das musst nicht du nach Anschauung unterscheiden. Sondern eben deine ML Pipeline auf ihre Qualität prüfen.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Mittwoch 9. November 2022, 09:56 Hier der Artikel zum Filter: https://de.wikipedia.org/wiki/Butterworth-Filter - und hier https://dsp.stackexchange.com/questions ... ers-in-dsp eine Gegenüberstellung der beiden Verfahren. Daraus seiht man, dass der BW eine deutlich steilere Übertragungsfunktion hat. Also bis zur Grenzfrequenz (cutoff) das Signal wenig beeinflusst. Der MA hingegen hat eine viel schwächere ÜF, die schon deutlich vorher anfängt, Frequenzen abzusenken.

Welcher nun besser für deine Daten ist, musst du wissen. Oder eher ausprobieren. Denn am Ende geht es ja um die Frage, ob das ML Verfahren auf features nahe der GF achten muss, oder ob die relevante Information in niedrigeren Bändern lebt, und es sonst eher stört, wenn das höher Frequenzanteile drin sind. Aber: das musst nicht du nach Anschauung unterscheiden. Sondern eben deine ML Pipeline auf ihre Qualität prüfen.
Danke für die Artikel und Erklärung.

Uns wurde vom Professor der Low-Pass-Filter empfohlen, daher möchte ich es ausprobieren. Den Moving-Average-Filter ist bei ihm nicht beliebt, da es nicht genau sein soll und weniger geeignet für IMU-Daten.

Aber um die Daten zu segmentieren, muss ich wissen wo ein Segment aufhört und wo es anfängt. Zum Beispiel beim MA und beim Bandpass hat es die richtige Anzahl an Ausschläge gegeben. Ich hatte 18 Bizepcurls gemacht und soviele Ausschläge waren zu sehen.

Wenn ich jetzt den Low Pass Filter in dem Zustand nehme, wie sollte ich Segmentieren? Das ist der Grund warum ich viele auch auf die Anschauung achte. Weil nach welchem Verfahren sollte ich jetzt beim Lowpass-Filter segmentieren? Da erkenne ich kein Muster in den Ausschlägen bzw. man erkennt nicht wo eine Bizepcurl anfängt und aufhört, weil zu viele Zacken drin sind. Ich habe sehr viele Datenreihen gemacht und bei allen Datenreihen sehen die gefilterten Daten genau gleich aus wie die originalen.

Was würdest du empfehlen zum Lowpass filter und für die Segmentierung?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich zähle ja 19 curls. Und der Bandpass ist einfach Quatsch. Der kann nur “funktionieren”, wenn du vorher die Grundfrequenz deiner curls kennst. Tust du aber nicht. Mal sind die schneller, mal langsamer. Und er schmeißt alles mögliche weg.

Und ich empfehle, was funktioniert. Du hast ein Verfahren, das für dich funktioniert. Aber aus esoterischen Gründen willst du das nicht einsetzen. Da weiß ich jetzt auch nicht, was ich dazu sagen soll. Wenn es der BW sein muss, dann spiel hat mit dem rum, bis was rauskommt. Vielleicht hast du Glück. Oder nicht.

Die Segmentierung kann im übrigen ja auch mit anders gefilterten Daten erfolgen, als das Training. Mit dem MA Segmente finden, und die ermittelten Abschnitte auf die Rohdatan (oder nur leichter gefilterten Daten) anwenden geht auch.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Mittwoch 9. November 2022, 12:16 Ich zähle ja 19 curls. Und der Bandpass ist einfach Quatsch. Der kann nur “funktionieren”, wenn du vorher die Grundfrequenz deiner curls kennst. Tust du aber nicht. Mal sind die schneller, mal langsamer. Und er schmeißt alles mögliche weg.

Und ich empfehle, was funktioniert. Du hast ein Verfahren, das für dich funktioniert. Aber aus esoterischen Gründen willst du das nicht einsetzen. Da weiß ich jetzt auch nicht, was ich dazu sagen soll. Wenn es der BW sein muss, dann spiel hat mit dem rum, bis was rauskommt. Vielleicht hast du Glück. Oder nicht.

Die Segmentierung kann im übrigen ja auch mit anders gefilterten Daten erfolgen, als das Training. Mit dem MA Segmente finden, und die ermittelten Abschnitte auf die Rohdatan (oder nur leichter gefilterten Daten) anwenden geht auch.
Ah okay, ja das mit dem Bandpass ist sehr random gewesen, was die Einstellungen angeht. Ich dachte der Lowpass filter macht im Grunde genommen dasselbe wie der Bandpass nur ohne den Highcut zu cutten.

Was den BW angeht, soll ich mit den Parametern rumspielen? Weil so macht es wenig Sinn wie der jetzt aussieht für die Segmentierung oder ? Bekommt man eine Sinuskurve oder ähnlich anschauliches hin mit den Lowpass filter?

Warum ich den fs auf 100 gesetzt habe, ist weil der Accelerometer des IMU-Sensors auf 100 Hz eingestellt ist. Ist das richtig so?

Meinst du die Daten mit dem MA finden und die Abschnitte auf die BW anwenden, oder wie sollte in der Segmentierung vorgegangen werden?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also da fehlen aber noch eine meeenge Grundlagen. ZB das sampling theorem. Wenn du mit 100 Hz abtastetest, kannst du Frequenzen bis maximal 50Hz Erfassen. Eine low pass mit 100Hz cutoff anzulegen ist dann natürlich kompletter Quatsch - der lässt dann ja alles durch. Kein Wunder, dass der dann nix macht.

Du solltest das mal mit deinem Prof besprechen. Denn der sollte dir sowas beibringen. Nicht ich.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

__deets__ hat geschrieben: Mittwoch 9. November 2022, 13:18 Also da fehlen aber noch eine meeenge Grundlagen. ZB das sampling theorem. Wenn du mit 100 Hz abtastetest, kannst du Frequenzen bis maximal 50Hz Erfassen. Eine low pass mit 100Hz cutoff anzulegen ist dann natürlich kompletter Quatsch - der lässt dann ja alles durch. Kein Wunder, dass der dann nix macht.

Du solltest das mal mit deinem Prof besprechen. Denn der sollte dir sowas beibringen. Nicht ich.
Ne ich meine die fs, also die sample rate ist auf 100 eingestellt, nicht der cutoff. Den cutoff habe ich mittlerweile auf 5 gestellt, jedoch ändert sich nichts. Oder wie sollte ich die Parameter einstellen?

Wenn ich eine ordentliche Sinuskurve hinbekommen würde mit dem BW wo man die Bizepcurls erkennt, könnte ich die Segmentierung direkt mit den BW gefilterten Daten machen. Das ist mein Ziel.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann - schraub an deinem BW rum. Ich halte das nicht für zielführend, weil du dann zu wenig Informationen erhältst, aber du willst durch diese Wand, viel Erfolg dabei.

Technische Anmerkung: bitte nicht immer den kompletten Post von mir zitieren, der steht da ja schon.
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

Also sollte ich den BW nicht in dem Fall benutzen, da ich zu wenig Informationen erhalte oder an den Parameter weiter rumspielen? Weil selbst wenn ich die Parameter verändere passiert nicht viel. Wie würde ich denn mehr Informationen bekommen?

Also ist es nicht möglich mit einem von BW gefilterten Daten zu segmentieren in dem Fall?
Antworten