2017-02-02 4 views
0

Ich habe Beschleunigungsdaten (10240x31), die ich filtern möchte, indem ich jeden Datenpunkt, der den Schwellenwert der vierfachen Standardableitung jeder Spalte überschreitet, durch den Mittelwert der zwei benachbarten Datenpunkte ersetze .Filterdaten mit Standardableitung in Schleife

Zuerst wollte ich jeden Datenpunkt durch eine Null ersetzen, wenn sie den Maximalwert überschreitet. Dies ist meine Schleife:

for w = 1:31 
    Sigma(w) = std(zacceleration(:,w)); 
    zacceleration(zacceleration<(-4*Sigma(w))) = 0; 
    zacceleration(zacceleration>(4*Sigma(w))) = 0; 
end 

Dieser Code funktioniert, wenn w ist nur eine Zahl, zum Beispiel:

w = 1; 

Aber wenn w Änderungen jeder Iteration, enthält die gefilterten Daten nur die Werte, die nicht tun Überschreiten Sie den Schwellenwert des letzten Datensatzes, Sigma (31). Also, ich schätze, dass ich meine Daten überschreibe oder so ähnlich, aber ich kann anscheinend keine Lösung finden.

Kann mir bitte jemand einen Tipp geben?

Vielen Dank im Voraus und mit freundlichen Grüßen.

+0

Was ist, wenn Sie zwei aufeinander folgende Datenpunkte haben, die diesen Bereich überschreiten? Es kann auch sinnvoll sein, einen Median-Filter zu verwenden, um die Spikes zu entfernen. – Suever

+0

Ich habe nicht darüber nachgedacht, weil dies nie passiert ist. Danke für den Hinweis. Was meinst du mit einem Medianfilter? Ich möchte immer noch alle meine Datenpunkte haben, ich möchte sie nicht zusammenführen. – Tierce

+0

Ein Medianfilter soll Impulsgeräusche entfernen, wie Sie es beschrieben haben https://www.mathworks.com/help/signal/ref/medfilt1.html – Suever

Antwort

0

Ich denke, ich habe es jetzt.

Sigma = std(zacceleration); 
for a = 1:10240; 
    for b = 1:31; 
     if zacceleration(a,b)<(-4*Sigma(b)) 
      zacceleration(a,b) = 0; 
     end 
     if zacceleration(a,b)>(4*Sigma(b)) 
      zacceleration(a,b) = 0; 
     end 
    end 
end 
Verwandte Themen