2017-02-23 3 views
1

Ich habe den folgenden Code:Anwenden Medianfilter, um Daten mit 2 Achsen

x = VarName3; 
y = VarName4; 
x = (x/6000)/60; 
plot(x, y) 

Wo VarName3 und VarName43000x1 sind. Ich möchte in MATLAB einen Median-Filter anwenden. Das Problem, das ich habe, ist jedoch, dass, wenn ich medfilt1 verwende, dann kann ich nur ein einzelnes Array von Variablen als erstes Argument eingeben. Und für medfilt2 kann ich nur eine Matrix als erstes Argument eingeben. Aber die Daten sehen sehr verdeckt aus, wenn ich x und y in eine Matrix umwandle.

Die x ist Zeit und y ist eine Liste von ganzen Zahlen. Ich würde gerne Spikes und Dips ausfiltern können. Wie gehe ich dabei vor? Ich dachte daran, die fehlerhaften Datenpunkte durch direkte Manipulation der Datei zu beseitigen. Aber ich bekomme nicht wirklich den Effekt eines Medianfilters.

+0

Es gibt 2 Filter in Ihrer Frage erwähnt. Ein Medianfilter filtert keine Werte über und unter einem Bereich heraus. Welches von beiden brauchst du? –

+0

Aber hilft mir ein Median-Filter nicht, die Datenspitzen zu entfernen? –

+0

Ja, aber nicht die "Werte höher oder niedriger als ein Bereich" –

Antwort

0

Ich fand eine Lösung mit sort.

Median ist das zentrale Element, also können Sie drei Elemente sortieren und das mittlere Element als Median verwenden.
sort Funktion gibt auch den Index der vorherigen Syntaxen zurück.
verwendete ich die Indexinformationen für die Wiederherstellung der Übereinstimmungswert von X.

Hier mein Codebeispiel ist:

%X - simulates time. 
X = [1 2 3 4 5 6 7 8 9 10]; 

%Y - simulates data 
Y = [0 1 2 0 100 1 1 1 2 3]; 

%Create three vectors: 
Y0 = [0, Y(1:end-1)]; %Left elements [0 0 1 2 0 2 1 1 1 2] 
Y1 = Y;    %Center elements [0 1 2 0 2 1 1 1 2 3] 
Y2 = [Y(2:end), 0]; %Right elements [1 2 0 2 1 1 1 2 3 0] 

%Concatenate Y0, Y1 and Y2. 
YYY = [Y0; Y1; Y2]; 

%Sort YYY: 
%sortedYYY(2, :) equals medfilt1(Y) 
%I(2, :) equals the index: value 1 for Y0, 2 for Y1 and 3 for Y2. 
[sortedYYY, I] = sort(YYY); 

%Median is the center of sorted 3 elements. 
medY = sortedYYY(2, :); 

%Corrected X index of medY 
medX = X + I(2, :) - 2; 

%Protect X from exceeding original boundries. 
medX = min(max(medX, min(X)), max(X)); 

Ergebnis:

medX = 

    1  2  2  3  6  7  7  8  9  9 

>> medY 

medY = 

    0  1  1  2  1  1  1  1  2  2 
0

Verwenden Sie ein Schiebefenster auf dem Datenvektor zentriert zu einer bestimmten Zeit. Der Wert Ihrer gefilterten Ausgabe zu diesem Zeitpunkt ist der Medianwert der Daten im gleitenden Fenster. Die Größe des gleitenden Fensters ist ein ungerader Wert, nicht unbedingt auf 3 festgelegt.

Verwandte Themen