also ich hab ne beschleunigun-zeit kennlinie aber mitm rauschen.um damit arbeiten zu können muss ich das rauschen filtern. nur das problem ist das die zeit nicht äquidistant ist. zb 0ms 202ms, 450ms, 600ms usw.
Du könntest ein einfaches PT1-Filter programmieren, das funktioniert auch mit variablen Schrittweiten:
Code:
zeitkonstante = 0.010; %z.B. 10ms
output = zeros(size(messung));
output(1) = 0; %Anfangswert des Filters, bei einer halbwegs konstanten Messung kannst Du hier direkt den Mittelwert eintragen, dann hast du auch im Zeitbereich bis 3...5*Zeitkonstante schon brauchbare Werte
for iCount = 2:length(messung)
schrittweite = zeitvektor(iCount) - zeitvektor(iCount - 1);
T_Stern = schrittweite / zeitkonstante;
output(iCount) = T_Stern * messung(iCount-1) + (1-T_Stern)*output(iCount-1);
end
Ja, filtern würde es Deine Messung. Falls Du irgendwelche speziellen Anforderungen an die Filterung hast, werden die womöglich nicht erfüllt, aber die Messungen werden gefiltert.
Im Prinzip werden alle Frequenzen, die über f_grenz = 1/(T*2*pi) ([Hz]) liegen mindestens auf die halbe Amplitude runtergedämpft. Je höher die Frequenzen, desto stärker werden sie gedämpft. Dabei sind hohe Frequenzen mit schnellen Änderungen im Signal gleichzusetzen (z.B. sprunghafte Änderungen).
Die Grenzfrequenz musst Du deutlich unter die Frequenz deines Nutzsignals legen, da Du sonst dein Nutzsignal zu sehr verschleifst. Einerseits stimmt dann die Amplitude nicht mehr und andererseits bewirkt das Filter eine Zeitverzögerung (daher der Name "Verzögerungsglied"). Das kann sehr unangenehme Folgen haben.
Am besten einfach ein bisschen damit rumspielen und das gefilterte und ungefilterte Signal in ein Achsensystem plotten (-> hold on) und angucken, ob das noch brauchbar ist.
wäre es nicht möglich erstmal sgolay anzuwenden, als wäre es äquidistant.danach den zeitvektor (die nicht äquidistant ist) zuordnen.
Sollte man das lieber vermeiden?
Die Daten sind in beiden Fällen die selben, nur die Zeitvektoren unterscheiden sich. Im ersten Fall ist die Änderung des Signals relativ schnell (1s), im zweiten Fall (selber Datenvektor) aber sehr langsam (8s). Dein Filter würde aber keinen Unterschied machen.
Mit falscher Zeit-Information (z.B. konstante Abtastzeit) tut das Filter zwar etwas, aber nicht so 100% das richtige. Wenn die Zeitabstände im Zeitvektor sich nur sehr wenig voneinander unterscheiden, ist es nicht so dramatisch, wenn aber Faktor 10 zwischen den verschiedenen Zeitschritten liegt, wird das Ergebnis eher Murks sein.
Wenn Du unbedingt einen digitalen Filter aus Matlab auf deine Daten werden willst, könntest Du die Daten auch per Interpolation so aufbereiten, dass sie mit konstanter Abtastzeit vorliegen. Aber so ganz hübsch ist das auch nicht.
wie wäre es denn deine werte zu averagen. d.h. deinen Beschleunigungsvektor in sagen wir 1s Abschnitte zu unterteilen und den Mittelwert (mean) dieser Teilstücke zu bilden.
2. Variante: Du bildest die Fourierkoeffizienten, schneidest die letzen alle raus und transformierst zurück
3. Variante, die mir noch einfällt: wenn die Kurve einem Muster (einer Funktion) folgt, kannst du die Kurve auch mittels einer Modelfunktion fitten.
PS.: vielleicht ist es noch hilfreich zu wissen, was du mit diesen Datensätzen vorhast.
2. Variante: Du bildest die Fourierkoeffizienten, schneidest die letzen alle raus und transformierst zurück
Auch dafür müsste die Messreihe erstmal so aufbereitet werden, dass die Messungen in konstanten Zeitschritten vorliegen. Dann kann man auch gleich filtern...
Würde sowas in ordnung sein :
Beschleunigungsvektor a
Zeit (nicht äquidistant) t
mein zeitvektor in 0.2ms zeitschritten t_neu
Code:
ts=timeseries(a,t)
ts=transpose(ts)
res_ts=resample(ts,t_neu)
Beschleunigung=res_ts.data' % jetzt hab ich doch meine beschleunigung in konstanten Zeitschritten
gefiltert_Beschleunigung = sgolayfilt(Beschleunigung,3,41);
ts_1=timeseries(gefiltert_Beschleunigung,t_neu)
ts_1=transpose(ts_1)
res_ts1=resample(t_neu,t)
Beschleunigung1=res_ts1.data'; % jetzt habe ich doch die gefilterte Beschleunigung mit NICHT äqudistanten Zeitintervall./code
geht sowas oder war das nur ne blöde erfindung von mir
Wenn ich das richtig sehe, dann nimmt resample auch 3 Argumente entgegen - Du hast nur 2 übergeben. Läuft der Code denn so, wie Du ihn gepostet hast? Falls ja: was läuft denn falsch?
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.