Mooving Averagge Filter(이동평균필터)

이준혁·2025년 10월 23일

신호처리에서 가장 기본적이고 널리 사용되는 저역통과 필터중 하나로 노이즈가 포함된 데이터의 단기변동을 완화하는데 사용함

average filter는 현재까지 측정된 데이터 들을 모두 더해서 갯수만큼 나누는 방식으로 과거의 값을 전체의 평균이라면 이 것은 현재 시점에서 과거의 일부분만 보면서 계속 평균을 구해내는 것

이 경우 input volt 값이 1씩 증가하는 경우를 예시를 보여드리면

average filter

1
2 : (1+2)/2 = 1.5
3 : (1+2+3)/3 = 2
4 : (1+2+3+4)/4 = 2.5
5 : (1+2+3+4+5)/5 = 3

Moving Average Filte
1
2 : (1+2)/2 = 1.5
3 : (2+3)/2 = 2.5
4 : (3+4)/2 = 3.5
5 : (4+5)/2 = 4.5

값을 보면 알듯이 average filter같은 경우 measured 값과 차이가 나는 것을 알수 있음

avg = preavg + (x- xbuf(1)) / n;

해당 파트에서 중요한것은 전에 있는값에다가 새로운 값이 들어오면 그밧이 가중치에 오래된값만 영향이 가게 하는 식이 중요

movavgfiltertest.m

Nsamples = 100;

xsaved = zeros(Nsamples,1);
xmsaved = zeros(Nsamples,1);

for k = 1:Nsamples
    xm = getvolt();
    x = Movavgfilter(xm);
    
    xsaved(k) = x;
    xmsaved(k) = xm;
end

dt = 1;
t = 0:dt:Nsamples*dt-dt; %100개로 개수를 똑같이 위해서


figure
hold on
plot(t,xmsaved,'r-');

plot(t,xsaved,'b');
legend('Measured','Moving average');

movavgfilter.m

function avg = Movavgfilter(x)

persistent preavg n xbuf
%preavg 이전 평균값 저장
%n 이동평균 윈도우 크기
%xbuf 최근 입력값을 저장하는 버퍼(길이 n+1)

persistent firstrun
% 초기화 여부 플래그


if isempty(firstrun)
    n = 5; %이동평균의 계산할 샘플수 5개 선정
    xbuf = x*ones(n+1,1); %1인 6행 1열
    preavg = x; %초기 평균값은 첫 입력값으로 설정
    firstrun = 1; %이후에는 초기화가 재실행되지 않음

end

for m = 1:n %한칸씩 앞으로 이동 FIFO
    xbuf(m) = xbuf(m+1);
end

xbuf(n+1) = x; %새입력 삽입

avg = preavg + (x- xbuf(1)) / n;
%가장 오래된것의 값은 가중치에 밀리고 다음것에 값과 최신것을 가중치에 힘을 들이는것
%n은 현재 윈도우 값으로 현재까지 있는 개수를 측정해서 작성

preavg = avg;

getvolt_movavg.m

function x = getvolt_movavg(k)

x_true = k + 1;               % 이상적인 선형 신호 (기울기 1, 절편 1)
noise = randn(1,1) * 1.5;     % 표준편차 1.5의 Gaussian 노이즈
x = x_true + noise;           % 노이즈가 섞인 신호


그래서 현재 값을 보면 1씩증가하면 moving average값이 따라가는것을 볼수 있음


참조

https://limitsinx.tistory.com/70

profile
#자기공부 #틀린것도많음 #자기개발 여러분 인생이 힘들다 하더라도 그것을 깨는 순간 큰 희열감으로 옵니다~

0개의 댓글