신호처리에서 가장 기본적이고 널리 사용되는 저역통과 필터중 하나로 노이즈가 포함된 데이터의 단기변동을 완화하는데 사용함
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;
해당 파트에서 중요한것은 전에 있는값에다가 새로운 값이 들어오면 그밧이 가중치에 오래된값만 영향이 가게 하는 식이 중요
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');
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;
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값이 따라가는것을 볼수 있음