[Matlab 개발] Moving Average Filter (이동 평균 필터)
2020. 6. 25. 19:00ㆍ03. 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
반응형
'03. Resources > Matlab & Simulink' 카테고리의 다른 글
[Simulink 개발] Moving Average Filter (이동 평균 필터) (0) | 2021.04.02 |
---|---|
[Simulink 개발] 시뮬링크 센서 축 회전변환 (0) | 2021.03.30 |
[Simulink 개발] C언어로 작성된 코드를 Simulink에서 실행시키는 방법 (2) (0) | 2020.08.19 |
[Simulink 개발] C언어로 작성된 코드를 Simulink에서 실행시키는 방법 (1) (0) | 2020.08.19 |