2017-02-23 112 views
1

У меня есть следующий код:Применяя медианный фильтр к данным с 2 осями

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

Где VarName3 и VarName4 являются 3000x1. Я хотел бы применить в MATLAB медианный фильтр. Однако проблема заключается в том, что если я использую medfilt1, тогда я могу ввести только один массив переменных в качестве первого аргумента. А для medfilt2 я могу ввести матрицу только в качестве первого аргумента. Но данные выглядят очень затененными, если я конвертирую x и y в матрицу.

x is time and y - это список целых чисел. Я бы хотел отфильтровать всплески и провалы. Как мне это сделать? Я думал просто устранить ошибочные точки данных, непосредственно манипулируя файлом данных. Но тогда я действительно не получаю эффект медианного фильтра.

+0

В вашем вопросе есть 2 фильтра. Средний фильтр не фильтрует значения выше и ниже диапазона. Какой из них вам нужен? –

+0

Но разве медианный фильтр не помогает мне избавиться от всплесков данных? –

+0

Да, но не «значения выше или ниже диапазона» –

ответ

0

Я нашел решение, используя sort.

Median - это центральный элемент, поэтому вы можете сортировать три элемента и принимать средний элемент как медиану.
sort Функция также возвращает индекс предыдущих синтаксисов.
Я использовал индексную информацию для восстановления значения совпадений X.

Вот мой пример кода:

%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)); 

Результат:

medX = 

    1  2  2  3  6  7  7  8  9  9 

>> medY 

medY = 

    0  1  1  2  1  1  1  1  2  2 
0

Использование скользящего окна на векторе данных по центру в определенное время. Значение вашего отфильтрованного вывода в это время является медианным значением данных в скользящем окне. Размер скользящего окна является нечетным значением, не обязательно фиксированным до 3.