Verfasst am: 14.07.2011, 10:11
Titel: Filtern von Kraftsensordaten
Hallo!
Ich möchte die Daten eines Kraftsensors filtern, um das Rauschen loszuwerden. Diesbezüglich hab ich mir den "smooth" Filter angeschaut. Das Ergebnis von bereits aufgezeichneten Daten sieht sehr vielversprechend aus, jedoch nun die Frage an euch, liebe Forumuser: Kann ich den "smooth" Filter x_filter = smooth(data,windowSize,'lowess') auch als Echtzeit/Real time Filter verwenden. Dh. eingehende Sensordaten direkt und ohne großen Zeitverlust filtern?
bzw. wie sieht es mit einem Savitzky-Golay FIR filter aus? kann dieser zur realtime auswertung herangezogen werden? oder ist auch dieser nur zur nachträglichen bearbeitung von daten zu gebrauchen?
Richtig echtzeitfähig sind diese Filter nicht, da du ja über die Segmentlänge (Windowsize) die Güte der Filterung bestimmst. Dieses Segment muss du ja aber erstmal mit Messwerten gefüllt haben. Ich habe das mal versucht zu testen. Kann natürlich sein, dass ich noch Fehler drin habe...aber bei der smooth() Funktion stimmt die "Realtime" Filterung mit der Offline Filterung bei Segmentlänge f = 3 noch überein. Ab 5 dann schon nicht mehr. Es kann aber sein, dass ich beim Zusammensetzen der Segmente einen Fehler mache. Da bin ich mir noch nicht sicher. Es könnte aber auch an der Initialisierung des Segements mit Nullen und dem ersten Messwert bei der Startsequenz liegen (was ja für Realtime erforderlich ist).
Ihr könnt es ja mal selber testen...einfach vor dem starten des m-file im Command Window "load mtlb" eingeben, damit ihr einen Datenvektor habt.
% Fifo mit der Länge f % Initialisierung mit Nullen und 1. Messwert
Fifo = fliplr(Data(1:f));
%Fifo = Data(1:f);
% "Realtime" Filterung for i=1:length(Data)-f
% Segment in Fifo filtern if(typ == 1) % Savitzky-Golay filtering
smtlb(1:f) = sgolayfilt(Fifo,k,f);
else % Smooth -> Methode = Lowess
smtlb(1:f) = smooth(Fifo,f,'lowess');
end % aktuelle Werte um eine Position nach rechts schieben % f. Element fällt raus
Fifo(end:-1:2)=Fifo(end-1:-1:1);
% neuen Messwert an Position 1 laden
Fifo(1) = Data(f+i);
% gefiltertes Segment speichern
Data_filt(i:i+f-1)=smtlb(1:f);
end
Ich habe es nun zumindest geschafft bei der Savitzky-Golay Filterung 1. Ordnung (k=1) das gleiche Ergebnis bei Realtime und Offline Filterung zu bekommen. Man darf nicht einfach das gefilterte Segment abspeichern, sondern muss den Mittelwert davon bilden. Es gibt lediglich ein Filterdelay bei der Realtimefilterung. Es macht auch keinen Unterschied ,ob das Fifo mit Nullen und dem ersten Messwert, oder nur mit dem ersten Messwert initialisiert wird.
Allerdings glaube ich dennoch nicht, dass das Filter echtzeitfähig ist, da ja immer komplette Segmente berechnet werden. Bei einem IIR oder FIR Filter erhalte ich ja immer nur einen gefilterten Wert pro Abtastzeit. Die Frage ist eben auch, ob die Matlab Funktion überhaupt innerhalb der Abtastzeit ein Ergebnis liefert. Sollte das nicht der Fall sein, ist ohnehin alles hinfällig. Ich weiß zwar, dass diese Funktionen immenses Filterpotential haben, wenn die Segmentlänge aber nicht zu lang gewählt wird, kann man sicherlich das gleiche Ergebnis auch mit einem herkömmlichen Tiefpassfilter schaffen.
Code:
% "Realtime" Filterung for i=1:length(Data)-f
% Segment in Fifo filtern if(typ == 1) % Savitzky-Golay filtering
smtlb(1:f) = sgolayfilt(Fifo,k,f);
else % Smooth -> Methode = Lowess
smtlb(1:f) = smooth(Fifo,f,'lowess');
end % aktuelle Werte um eine Position nach rechts schieben % f. Element fällt raus
Fifo(end:-1:2)=Fifo(end-1:-1:1);
% neuen Messwert an Position 1 laden
Fifo(1) = Data(f+i);
% Mittelwert über gefiltertes Segment bilden und speichern
Data_filt(i)=mean(smtlb(1:f));
end
wow, vielen dank für deine bemühungen. ich werde deine antworten am montag dann analysieren.
ich denke dann werd ich wohl ein butterworth TP nehmen, um realtime fähig zu sein. bzw. chebychev liefert auch ganz passable ergebnisse.
Versuch das mit dem Tiefpassfilter mal. Kleiner Tip...falls das Filter nicht die gewünschte Dämfung erreicht, kann man das Filter auch kaskadieren (z.B. einzelnes FIR mit 64 Tabs -> 2 x 32 Tabs in Reihe) Dadurch steigt zwar die Eckfrequenz etwas, im Sperrbereich habe ich dann aber annähernd die doppelte Dämpfung gegenüber dem Einzelfilter. Die Einschwingzeit bleibt dennoch gleich.
ich bin bei einem butterworth tiefpass filter 2. ordnung geblieben. liefert passable ergebnisse, welche ich gut in meinem regler wiederverwenden kann.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.