본문 바로가기

Theory/ControlTheory

저역통과필터와 고역통과필터를 C로 구현

오늘은 비가 많이 오네요. 날씨가 좀 꿉꿉합니다.^^. 어제는 제가 입사한지 123일만에 쳤던 대형사고의 마지막 심사인 프리젠테이션 발표를 했습니다. 분명 다친 다리[관련글]의 철심을 제거하는게 예상으로는 지지난주였어야하는데요. 우리의 쿨~한 의사선생님께서 좀 더 있어야겠다... 라는 한마디에 아직도 철심을 제거를 못한채, 휠체어를 타고 대전까지 내려갔었네요.ㅠㅠ 발표하려는 다른 분들도 많아서 차를 건물안에 주차를 못해서 이 무거운 몸이 앉은 휠체어를 같이간 연구원이 끄느라 참... 미안했습니다.ㅠㅠ ... 하여간 이제 심사결과를 기다리는 처지가 되었네요^^. 뭐.. 안되면 다음에 또 하면 되죠.. 

클클.. 비오는 오늘은... 흔히들 MATLAB에서 많이들 사용하는 저역통과필터와 고역통과필터를 C로 구현하는 것에 대해 이야기를 할려고 합니다. 그 중에서도 1차 저역/고역통과필터를 다뤄볼려구요. 1차 저역필터의 상세한 설명과 아래 식에서 사용하는 tau에 대해서 좀 더 자세한 설명은 이전의 저의 RC회로 포스팅[관련글]에 넘겨두겠습니다.

 저역통과필터의 라플라스 표현입니다. 저걸.. 어떻게 C로 바꿀까요??? 뭐 디지털 필터를 쓰면 좋지만, 요즘처럼 MCU가 빨라진 세상에 간단한 1차 로우패스필터나 하이패스필터를 복잡하게 생각할 필요는 없으니... 그냥 "당장 사용"에 목적을 두고 쿨~하게 진행하겠습니다.

살짝, 이렇게 바꾸구요

라플라스 역변환을 했습니다. 여기서 x(t)는 입력이고, y(t)는 저역통과필터를 거쳐 나오는 출력입니다. 이 정도 라플라스 역변환은 공업수학[관련글]만 해도 충분하니(^^) 넘어가죠.^^ 그런데. 미분으로 나타나는 저 첫 항 말이죠. 우리가 보통 MCU에서 미분한다고 하면, 통상 차분을 많이 쓰죠. (현재값 -이전값)/샘플링타임... 그렇게 표현하겠습니다.

되었죠? 다시 좀 전개하고

마지막.. 정리를 하면

이렇게 됩니다. 좋네요... ㅋㅋ.. 이걸 그냥 코드로 바꾸면 됩니다.

y = ( tau * pre_y + ts * x ) /(tau + ts) ;

끝났습니다. 쉽죠...^^ 저역통과필터의 결과는 y이고, pre_y는 이전의 결과(미리 저장해두어야겠죠.), x는 저역통과필터를 통과시키고자 하는 입력입니다.^^ 그럼 동일한 방법으로 고역통과필터도 가능합니다.

요렇게... 진행한 결과가

이렇게 되는거죠^^. 요걸 다시 코드로 바꿔보면 

y = tau/(tau + ts) * pre_y + tau/(tau + ts) * (x - pre_x);

여기서 pre_x는 이전의 입력값입니다. 비오는 꿀꿀한날... 그래도 한주의 시작이니 좋은 한주 열어가세요^^ 

반응형