2010-08-10 4 views
2

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

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

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

Результат:

Image of raw and filtered data plot from above example http://www.tc.umn.edu/~vande642/pictures/untitled.png

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

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

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

+0

'filterfilt' не зависит от других функций Signal Processing Toolbox и является m-кодом. Поэтому вы можете просто скопировать его в свой код, изменив его для своих нужд. – Mikhail

+0

Не знаете об авторских правах, если вы не являетесь владельцем панели инструментов SP. Моя кишка говорит мне, что это было бы незаконно. – Jonas

ответ

4

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

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

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 первый, или запустить конв с «действительной» аргумент. Например, вы можете использовать PADARRAY, если у вас есть панель инструментов обработки изображений.

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

+0

true .., но если вы хотите, чтобы результат был средним из доступных данных (поэтому для windowSize = 3 вывод для первой точки данных является средним значением точек 1 и 2), заполнение становится сложным! и conv.m также, похоже, имеет отставание, если вы приводите пример, который вы даете. конечно, все это выполнимо, но снова кажется, что больше работы, чем должно быть! –

+0

ah, аргумент «valid» полезен - похоже, пришло время обновить мой MATLAB, в моей текущей версии его нет! –

+0

@Matt: Df по умолчанию больше D. Если вы построите (Df (2: end-1)) ', вы увидите эффект края, но нет отставания. – Jonas