본문 바로가기

이론/DSP

1차 Low-Pass Filter(저주파 통과필터), High-Pass Filter(고주파 통과 필터) 구현하기, 코드

728x90
반응형

 

 

 

저주파 통과필터(Low-Pass Filter), 고주파 통과필터 (High-Pass Filter)를 이하 lpf, hpf라 부르겠습니다.

신호 처리를 함에 있어 원하는 신호를 뽑아내기 위해 lpf와 hpf를 사용하여 지지고 볶았습니다.

어느정도 원리를 깨달았죠.. 코드만 원하시면 밑으로 가면 됩니다. ㅎㅎ

<칼만필터는 어렵지 않아> 책을 참고하였습니다.

 

1차 Low-Pass Filter

lpf는 말그대로 신호의 낮은 주파수 부분을 통과시키는 건데요, 즉 신호의 높은 주파수(예를 들어 진동이나 노이즈)를 없애 신호를 좀더 매끄럽게 만들어 줍니다. 그러므로 자주 사용되죠.

이런식으로 효과를 볼 수 있습니다.

Smoothing이라고도 하죠. 그냥 lpf입니다.

단순히 생각하면 lpf를 만들기 위해선 이전 측정값과 현재 측정값에 가중치를 두어 계산하면 됩니다.

다시말하면, 이전 값을 고려하여 현재값을 정하고, 이전값에 어느정도 비중을 둔 현재값을 계산하면 됩니다.

α는 1에서 0사이의 값이고, x_k는 k번째 측정값, x바는 계산된 값(추정값, lpf 필터된 값)입니다.

α가 클수록 이전 값에 비중이 커져 더 그래프가 부드러워지고, 잡음이 줄어듭니다. 하지만 반대로 실제 값과는 달라지게 되겠죠.

하지만 시간 영역에서 α를 설계하기는 쉽지 않습니다. 보통 차단주파수를 정해 lpf를 사용하는데, 이를 위해 시간영역의 식을 주파수 영역의 식으로 바꾸어 주면 됩니다.

이는 라플라스 변환 식을 사용하면 됩니다.

위의 식이 라플라스 변환 식입니다. 간단히 대입만 해주면 됩니다.

 

lpf의 시간영역식과 라플라스 변환한 주파수 영역의 식은 다음과 같이 나타낼 수 있습니다.

여기서 G(s)는 output/iniput의 형태로 나타내고, 전달함수라고 부릅니다.

 

간단한 lpf 필터 전달함수는 다음과 같이 나타낼 수 있습니다.

 

이 식은 1차 lpf 회로에서 나왔습니다.

키르히호프 전압법칙에 의해 미분방정식이 나옵니다.

 

주파수 영역으로 바꾸어줍니다.

 

전달함수를 구합니다.

또한 전달함수의 s(주파수)가 0이나 무한대로 갈때 어디로 수렴하는지 보면 lpf인지, hpf인지 알 수 있습니다.

낮은 주파수를 통과하는 저주파 통과 필터인 것을 알 수 있습니다.

 

위의 전달 함수를 다시 다음과 같이 써줍니다.

위의 식을 라플라스 역변환 합니다. s가 곱해지면 미분함수가 되므로, 다음과 같이 쓸 수 있습니다.

이산 신호인것을 고려하여 다음과 같이 바꾸어 줍니다.

위와 같이 1차 lpf 식을 만들 수 있습니다.

// lowpass filter
float lpf(float x_k, float y_km1, float Ts, float tau) 
{
   float y_k;
   y_k = (tau * y_km1 + Ts * x_k) / (Ts + tau);
   return y_k;
   
}

 

위 식을 보면, 알파는 다음과 같음을 알 수 있습니다.

 

τ(tau)는 다음과 같이 정해집니다.

w_cut은차단 각주파수(rad/s), f_cut은 차단주파수(Hz)입니다.

 

1차 High-Pass Filter

hpf는 신호의 변화만 캐치하는데 효과적입니다.

예를들어 적분시 발생하는 적분 상수를 제거한다던지, 0Hz의 전압이나 offset 등을 제거하는데 사용하곤 했습니다.

 lpf처럼 hpf도 다음과 같이 전달함수를 쓸 수 있습니다.

높은 주파수의 신호만 통과하는 것을 확인할 수 있습니다.

이제 라플라스 역변환후, 이산신호의 식으로 바꾸어 줍니다.

// highpass filter
float hpf(float x_k, float x_km1, float y_km1, float Ts, float tau) 
{
   float y_k;
    y_k = (tau/(tau + Ts) * y_km1) + (tau/(tau + Ts)) * (x_k - x_km1);
   return y_k;
   
}

 

끝!^^

 

 

 

 

 

 

728x90
반응형