вычисление скользящих средних в MATLAB - PullRequest
2 голосов
/ 11 августа 2010

Вычисление скользящего среднего для простого 1-D вектора данных кажется достаточно простым.Действительно, документация MATLAB для FILTER радует что-то вроде:

. Вы можете использовать фильтр, чтобы найти скользящее среднее без использования цикла for.Этот пример находит скользящее среднее для вектора из 16 элементов, используя размер окна 3:

D = [1:0.2:4]';
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = filter(F,1,D);

Результат:

Изображение необработанных и отфильтрованных данныхграфик из приведенного выше примера http://www.tc.umn.edu/~vande642/pictures/untitled.png

Для моих целей в этом результате есть две досадные вещи: выходная точка n является средним значением входных точек n- (windowSize-1) .. n (т.е. не центрировано, о чем свидетельствуетгоризонтальный сдвиг) и точки слева от доступных данных рассматриваются как нули.

FILTFILT решает обе проблемы, но имеет и другие недостатки.Он является частью набора инструментов для обработки сигналов и плохо работает с NaN (которые я бы хотел исключить из среднего).

Некоторые люди вОчевидно, что у FEX были те же разочарования, но мне кажется странным, что что-то такое простое требует специального кода.Что-то мне здесь не хватает?

1 Ответ

4 голосов
/ 11 августа 2010

Вы также можете получить скользящее среднее, используя свертка .Таким образом, вам не нужно беспокоиться о FilterFilt.

Например, вы можете использовать

D = [1:0.2:4];
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = conv(D,F);
%# if you didn't use 'valid', Df is larger than D. To correct:
halfSize = floor(windowSize/2);
Df = Df(halfSize+1:end-halfSize);

Конечно, вам все равно придется иметь дело с краем, поэтому вы должнысначала наберите D или запустите conv с аргументом 'valid'.Например, вы можете использовать PADARRAY , если у вас есть набор инструментов для обработки изображений.

Простейшим способом заполнения будет дублирование первого и последнего значений.Если вы знаете больше о ваших данных, другие подходы могут оказаться более подходящими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...