아두이노 코딩-30: 아두이노 PM 미세먼지 측정기 Low Pass Filtering 기법 적용 I

in #kr6 years ago (edited)

noname03.png

위 그림은 디지털 Low Pass Filtering 기법을 적용하면 노이즈에 해당하는 고주파 신호가 어떻게 걸러지는를 보여 주는 예제이다.

미세먼지 데이터 측정 결과를 보면 불규칙성이 있음을 볼 수 있다. 아래위로 요동 범위가 상당히 넓다. 통계적으로 평균값과 표준 편차를 결정하기도 쉽지 않다.

noname01.png

이러한 데이터의 불규칙한 성격은 어디서 오는 것일까? 샤프사의 PM 센서 GP2Y1010AU 의 측정 원리는 다음과 같이 의외로 간단하다. 즉 LED에서 방출된 적외선이 흘러 지나가는 미세먼지 입자들에 의해 산란된 광을 포토다이오드가 수신하여 전압 데이터를 생성한다.

noname02.png

그렇다면 데이터의 불규칙하면서 급격히 변동하는 패턴은 결국 미세먼지를 포함한 공기의 난류적인(Turbulence) 성격인 듯하다. 따라서 변동성이 극심한 데이터를 어떻게 안정적으로 읽어낼 것인지에 대한 소프트웨어적인 처리 방법을 전자공학에서 사용하는 Low Pass Fitering 기법을 사용해 결과를 시리얼 플로터에 의해 관찰해 보자.
Low Pass Filtering 기법의 수학적인 배경은 너무 복잡하므로 여기서 다룰 필요성은 없어 보인다. 단지 불규칙해 보이는 데이터를 필터링하여 좀 더 완만하면서 평균적인 값을 보여 줄 수 있는지 코딩 방법을 적용해 보기로 하자.

우선 디지털 필터의 효과를 알아보기 위해서 2가지 서로 다른 주파수를 합성한 파형 사례에
적용해 보자.

noname03.png

위와 같이 큰 진폭을 가지는 저주파와 작은 진폭을 가지는 고주파를 합성하면 저주파에 노이즈가 낀것처럼 보이는 데 필터링을 거치면 고주파 성분이 어는 정도 제거가 됨을 알 수 있다.

LPF 효과를 줄 수 있는 알고리듬을 간단하게 설명해 보자. 샘플링 시간 별로 측정되는 실제센서 값을 s[n] 이라고 두자. 물론 이 측정값을 최종 데이터로 삼는다면 극심한 변동성을 피치 못할 것이다.
따라서 우리가 보려는 필터링된 데이터 값을 X[n] 이라고 한다면 이 X[n] 은 이전 샘플링 단계에서의 필터링 값 X[n-1]과 현재 샘플한 값 s[n]을 사용하여 다음과 같이 환산한다.
X[n] = αX[n-1] +(1-α)s[n]
여기서 주의할 점은 X[n-1]과 s[n] 계수의 합이 1.0 이란 점이다.
이러한 형태의 디지털 LPF 공식을 recursive 하다고 한다.
위 그래프에서 울퉁불퉁한 점이 강조된 전반 부분 파형에 α= 0.9 인 LPF 공식을 적용한 결과가 뒷부분의 매끈한 sine 파 형상이다. 위 결과 재생을 위해서는 아래의 예제 코드를 실행해 보기 바란다.

noname04.png

아울러 위 결과에서 보듯이 이 디지털 Low Pass Filtering 기법을 적용해도 데이터의 불규칙성은 전혀 해소가 되지 않아 이어지는 다음 편에서는 샘플되는 데이터 50 개의 평균값을 취한 후에 이들을 대상으로 다시 디지털 Low pass Filtering 기법을 적용해 보기로 한다.

//Low_Pass_Filtering_01

float pi =3.1415629543;
float freqLow = 1.0;//Hz
float freqHigh = 20.0;//Hz
float sensorV[200];
float X[200];
float alpha =0.90;

void setup() {
Serial.begin(9600);
X[0] = 0.0;
for ( int i=1; i<201; i++ ) {
sensorV[i] = 2.0sin(2.0pifreqLowi/100.0)+0.5sin(2.0pifreqHighi/100.0);
Serial.println(sensorV[i]);
}

for ( int i=201; i<401; i++ ) {
X[i-200] =alphaX[i-201]+(1.0-alpha)sensorV[i-200];
Serial.println(X[i-200]);
}
}

void loop() {
}//끝

Coin Marketplace

STEEM 0.16
TRX 0.16
JST 0.030
BTC 59391.37
ETH 2525.88
USDT 1.00
SBD 2.47