2010-08-10 133 views
2

計算簡單一維數據向量的運行平均值似乎很簡單。事實上,FILTER MATLAB的文檔高興地宣稱是這樣的:在MATLAB中計算運行平均數

您可以使用過濾器來查找正在運行的平均無 使用for循環。本示例查找的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

'filtfilt'不依賴於其他信號處理工具箱的功能,並且是m代碼。因此,您可以簡單地將其複製粘貼到代碼中,以便根據需要進行更改。 – Mikhail 2010-08-11 07:15:04

+0

如果您不擁有SP工具箱,則無法確定版權。我的直覺告訴我這是違法的。 – Jonas 2010-08-11 20:35:26

回答

4

您還可以使用convolution做一個運行平均值。因此,你不需要擔心filtilted。

例如,你可以使用

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與「有效」的說法。例如,如果您有圖像處理工具箱,則可以使用PADARRAY

最簡單的方法是複製第一個和最後一個值。如果你對數據有更多瞭解,其他方法可能更適合。

+0

true ..但是如果你希望結果是可用數據的平均值(所以對於windowSize = 3,第一個數據點的輸出是點1和2的平均值),填充會變得棘手!如果你畫出你給的例子,conv.m似乎也有滯後性。當然這一切都是可行的,但似乎還有更多的工作要比它應有的更多! – 2010-08-10 21:56:55

+0

啊,'有效'的參數是有用的 - 看起來是時候升級我的MATLAB,我目前的版本沒有它! – 2010-08-10 22:19:16

+0

@Matt:默認情況下,Df大於D.如果你繪製(Df(2:end-1))',你會看到邊緣效應,但沒有滯後。 – Jonas 2010-08-10 22:49:20