2010-08-10 9 views
2

간단한 1 차원 데이터 벡터의 이동 평균 계산은 간단합니다. 없이MATLAB에서 계산 실행 평균

당신은 실행 평균을 찾기 위해 필터를 사용할 수는 루프를 사용하여 : 사실, FILTER에 대한 MATLAB 문서를 행복하게 같은 것을 주장하고있다.

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

, 짜증나는 두 가지가 있습니다이 예는 3의 창 크기를 사용하여 16 요소 벡터의 실행 평균 발견 이 결과에 관한 사항 : 출력 포인트 n은 입력 포인트 n- (windowSize-1) .. n의 평균입니다 (즉, 수평 시프트에 의해 입증 된 중심 맞춤이 없음). 그리고 사용 가능한 데이터의 왼쪽에있는 포인트는 0으로 처리됩니다.

FILTFILT은 두 가지 문제를 모두 다루지 만 다른 단점이 있습니다. 이것은 Signal Processing Toolbox의 일부이며, NaN을 다루지 않습니다 (평균에서 제외하고 싶습니다).

Somepeople FEX에서 분명히 같은 좌절감을 겪었지 만,이 간단한 것은 사용자 정의 코드가 필요하다는 것이 이상한 것처럼 보입니다. 여기에 놓친 게 없니?

+0

'filtfilt'는 다른 Signal Processing Toolbox 기능에 의존하지 않으며 m 코드입니다. 따라서 코드에 복사하여 붙여 넣기 만하면 필요에 맞게 변경할 수 있습니다. – Mikhail

+0

SP 도구 상자를 소유하고 있지 않은 저작권에 대해 확실하지 않습니다. 내 직감은 이것이 불법 일 것이라고 알려줍니다. – Jonas

답변

4

convolution을 사용하여 평균을 수행 할 수도 있습니다. 따라서 filtfilt에 대해 걱정할 필요가 없습니다. 당신이 '유효'인수와 함께 첫번째 패드 D, 또는 실행 전환해야하므로

예를 들어, 당신은, 당신은 여전히 ​​가장자리에 대처해야 할 것이다, 물론

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

사용할 수 있습니다. 예를 들어 이미지 처리 도구 상자가있는 경우 PADARRAY을 사용할 수 있습니다.

가장 간단한 패드 방법은 처음과 마지막 값을 복제하는 것입니다. 데이터에 대해 더 많이 알고 있다면 다른 접근 방식이 더 적합 할 수 있습니다.

+0

true ..하지만 결과를 사용 가능한 데이터의 평균으로 만들려면 (즉, windowSize = 3 인 경우 첫 번째 데이터 요소의 출력은 점 1과 2의 평균값입니다.) 패딩이 까다로워집니다! conv.m은 또한 예제를 작성하면 지연이있는 것으로 보입니다. 물론 그것은 모두 가능하지만 다시해야 할 일보다 더 많이 보인다! –

+0

아, '유효한'인수가 유용합니다 - 내 MATLAB을 업그레이드 할 때처럼 보입니다. 현재 버전에는 없습니다. –

+0

@Matt : 기본적으로 Df는 D보다 큽니다. 'plot (Df (2 : end-1))'을 선택하면 가장자리 효과가 표시되지만 지연은 없습니다. – Jonas