[Matlab 개발] Moving Average Filter (이동 평균 필터)

2020. 6. 25. 19:0003. Resources/Matlab & Simulink

728x90
반응형

Moving average filter (이동 평균 필터)

센서의 노이즈를 제거할 때 많이 이용되는 필터

특정 윈도우 사이즈를 정해두고, 해당 윈도우 만큼의 데이터를 평균내어 현재 값으로 이용하는 필터

프로그램에서 제공해주는 센서의 데이터가 너무 노이즈가 많이 껴서, 이를 처리하는 방법을 찾아보던 중 이 필터가 노이즈 처리하기 좋고, 개발하기 쉽다는 후기를 봐서 직접 짜봤다.

 

윈도우 사이즈란 평균을 낼 데이터의 갯수를 의미한다. 몇 개의 데이터를 이용해서 특정 시점의 값을 만들어낼 것인지가 이 필터의 핵심이라고 생각된다.

 

윈도우 사이즈 만큼의 데이터가 주어지지 않았을 경우에는 현재까지 가지고 있는 데이터의 수 만큼을 이용하여 평균을 내도록 코드를 작성했다.

윈도우 사이즈 만큼의 데이터가 있다면, 필터링 된 값을 넣을 부분 주위의 윈도우 사이즈 만큼의 데이터를 모아서 평균을 내도록 코드를 작성했다.

Test = LineL1Xp1top10.LineL1p2X;
MovAvgWindowSize = 100;

MovAvgTest = zeros(size(Test));

for idx = 1:length(Test)
   if idx < MovAvgWindowSize
       MovAvgTest(idx) = sum(Test(1:idx))/idx;
   else
       MovAvgTest(idx) = sum(Test(idx-MovAvgWindowSize+1:idx))/MovAvgWindowSize;
   end
end

figure;plot(Test,'k'); grid on; hold on; plot(MovAvgTest,'r')

그림에서 검은색 선이 노이즈가 가득한 센서 데이터이고, 빨간색 선이 이동평균 필터를 거친 센서 데이터이다.

 

센서 원본 데이터(검은 선)과 이동 평균 필터를 거친 뒤의 센서 데이터(빨간 선)

 

확실히 센서데이터가 정제되어 경향성이 잘 보인다. 윈도우 사이즈에 따라 필터링된 결과도 달라지기 때문에 경향성을 도출하기에 적합한 윈도우 사이즈를 설정하는 것이 제일 중요한 문제인 것 같다.

 

 

짜고나서 보니 매트랩에도 이미 예제로 주어져있었다.

 

filter라는 함수를 이용해서 위에서 내가 직접 작성한 내용과 거의 비슷한 결과를 얻을 수 있다고 한다.

링크: https://www.mathworks.com/help/signal/examples/signal-smoothing.html

반응형