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



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

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


살짝, 이렇게 바꾸구요

 
라플라스 역변환을 했습니다. 여기서 x(t)는 입력이고, y(t)는 저역통과필터를 거쳐 나오는 출력입니다. 이 정도 라플라스 역변환은 공업수학[관련글]만 해도 충분하니(^^) 넘어가죠.^^

그런데. 미분으로 나타나는 저 첫 항 말이죠. 우리가 보통 MCU에서 미분한다고 하면, 통상 차분을 많이 쓰죠. (현재값 -이전값)/샘플링타임... 그렇게 표현하겠습니다.

 
되었죠? 다시 좀 전개하고

 
마지막.. 정리를 하면

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

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

끝났습니다. 쉽죠...^^ 저역통과필터의 결과는 y이고, pre_y는 이전의 결과(미리 저장해두어야겠죠.), x는 저역통과필터를 통과시키고자 하는 입력입니다.^^



그럼 동일한 방법으로 고역통과필터도 가능합니다.


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

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

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

여기서 pre_x는 이전의 입력값입니다.

비오는 꿀꿀한날... 그래도 한주의 시작이니 좋은 한주 열어가세요^^ 
 




http://pinkwink.kr/trackback/437 관련글 쓰기
  • 모피우스 2011/06/01 10:01

    블로그의 아이슈타인... 등장하셨습니다.^^*

    좋은 하루되세요.

    • PinkWink 2011/06/01 18:37

      아.. 네.. 감사합니다. 아인슈타인같은 헤어스타일은 싫은데요.. 흑흑

  • 핑구야 날자 2011/06/01 12:27

    C 언어 오랜만에 들어봅니다. 점심 맛있게 드세요

  • Masker 2011/07/21 00:22

    전에 했던 질문에 답해주신거 정말 감사드립니다.
    이번에 상보필터설계에서 가속도와 자이로센서의 각도출력까지 성공하였고,
    본격적으로 필터설계에 들어갔습니다.
    우선 자이로에 하이패스필터를 설계하는데 한가지 궁금증이 들었습니다.
    차단주파수를 임의적으로 설정하고 Z-Transform 한후 코딩하여 출력을 보니
    차단주파수에 따라 반응이 다르더군요. 차단주파수가 높을수록 각도는 잘 나오지 않지만 대신 적분오차가 일어나지 않았고, 반대로 낮을수록 각도는 잘 나오나 적분오차가 점점 심해지는 것을 확인했는데 제가 처음 만들다 보니 이게 정상적인건지 의문이 들더군요. 그리고 데이터시트에 보면 차단주파수가 10hz로 되있는데 이것은 상보필터설계에 있어 중요하지 않은건지 그것이 궁금합니다. 질문을 너무 길게 드려서 죄송합니다.^^;;;

    • PinkWink 2011/07/21 07:53

      어떤 데이터시트를 말씀하시는지 잘 모르겠습니다.ㅠㅠ
      일단, 말씀하신 현상은 일반적으로 나타날 수 있는 현상입니다.
      물론 실험환경에 따라 조금씩 다르긴 하지만, 그냥 손으로 흔들거나 자유운동시키거나 하신거라면, 아마 말씀하신 현상이 관찰되었을걸로 생각됩니다.^^

  • Masker 2011/07/22 16:12

    아 그렇군요. 답변주셔서 정말 감사합니다. 죄송하지만 한가지 더 질문드리겠습니다. 다름이 아니라 현재 각각의 센서에 필터를 적용시켜서 합쳤는데 출력을 보니 따라가는건 잘 따라가는데 노이즈가 심해서 차단주파수를 계속 바꿔주고 있는데요. 이상하게 여러가지로 바꿨는데도 변화가 거의 없네요.
    혹시 차단주파수는 구하는 공식이나 방법은 없는건지요?

    • PinkWink 2011/08/12 15:44

      각각의 센서에 필터를 설계해서 단순히 합치는 것이 상보필터가 아닙니다. 위 결과를 보시면 아시겠지만, 각각의 필터에서 시작하긴 했지만, 결과를 따로 제시하고 있습니다. 각 센서에 적용되는 필터들은 합쳤을때 1의 결과를 가져야합니다.
      그리고, 차단주파수를 구하는 공식이 있긴합니다. 음... 댓글로는 좀 설명이 힘들고, 아무 제어관련책에서 2차계시스템을 설명한 부분에 나와있습니다.

  • mather 2011/10/19 15:46

    혹시 2차 로우패스필터는 어떻게 구하는지요?
    ws와 제타를 어떻게 해야하나요?

    • PinkWink 2011/10/20 12:36

      이부분은 댓글로 해설하기가 아주 어렵습니다. (긴데다 수식도 있어서 말이죠)
      그러나 DORF의 자동제어책을 보시면 그 부분에 대한 설명이 나타나있습니다.
      책에서 찾아보기에서 2차계시스템을 확인하시면 됩니다.

  • 지나가는공부하는학생 2012/06/15 17:54

    안녕하세요
    비주얼베이직을 공부하는 학생입니다.
    비주얼 베이직으로 저역통과필터와 고역통과필터를 나타내려고하는데
    위의 식이 정확히 어떤것을 나타내는지 이해가 되지 않고 어떻게 사용하여서 나타내어야 하는지..
    위의 식으로는 무엇을 얻을 수 있는지 배울수 있을지 해서 이렇게 댓글을 남깁니다.
    시간이 되신다면 꼭 좀 답변 부탁드립니다!

    • PinkWink 2012/06/16 11:52

      http://pinkwink.kr/246 에서 간단히 회로적으로 설명했습니다.
      위의 수식은 저역통과/고역통과필터를 라플라스의 표현법을 따른 것으로
      라플라스변환에 대한 기초지식이 있으셔야합니다.
      그러나 그것이 없다 하더라도
      간단히 아래에 있는 C문법의 식을 적절히 변환하시면 당장 사용하시는것에는 무리는 없을듯합니다.

  • 비청 2014/01/29 16:31

    안녕하세요 글 잘보고 갑니다!
    참 심플하게 잘 구현하신거 같은데 혹 차단주파수는 어떻게 넣어야 하나요??

    • PinkWink 2014/01/29 18:21

      이 글 본문에서는 tau는 시정수이고 시정수와 차단 주파수와의 관계는 http://pinkwink.kr/246 를 보시면 차단주파수에 대한 이야기가 있습니다. 아 그리고 위키의 http://en.wikipedia.org/wiki/Time_constant 를 확인해보시면 좀 더 자세한 내용을 볼 수 있답니다.

  • hs 2014/06/18 00:04

    여기서 pre_y 값은 어떻게 정하나요 ?? 1이나 0을 넣으면 다음 값에 영향을 끼치지 않나요 ???

    • PinkWink 2014/06/18 08:57

      본문에도 나와있지만 이전 값입니다.
      계속 반복적으로 실행될때 이전값이죠.
      이런경우 통상 '0'을 초기값으로 해둡니다.

1 2 3 4 5 6 7 ... 80