본문으로 바로가기

오늘은 비가 많이 오네요. 날씨가 좀 꿉꿉합니다.^^. 어제는 제가 입사한지 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는 이전의 입력값입니다. 비오는 꿀꿀한날... 그래도 한주의 시작이니 좋은 한주 열어가세요^^ 


댓글을 달아 주세요

  1. BlogIcon 모피우스 2011.06.01 10:01 신고

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

    좋은 하루되세요.

  2. BlogIcon 핑구야 날자 2011.06.01 12:27 신고

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

  3. BlogIcon Masker 2011.07.21 00:22 신고

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

    • BlogIcon PinkWink 2011.07.21 07:53 신고

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

  4. BlogIcon Masker 2011.07.22 16:12 신고

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

    • BlogIcon PinkWink 2011.08.12 15:44 신고

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

  5. mather 2011.10.19 15:46 신고

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

    • BlogIcon PinkWink 2011.10.20 12:36 신고

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

  6. 지나가는공부하는학생 2012.06.15 17:54 신고

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

    • BlogIcon PinkWink 2012.06.16 11:52 신고

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

  7. 비청 2014.01.29 16:31 신고

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

    • BlogIcon PinkWink 2014.01.29 18:21 신고

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

  8. hs 2014.06.18 00:04 신고

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

    • BlogIcon PinkWink 2014.06.18 08:57 신고

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

  9. GB 2014.11.24 17:39 신고

    안녕하세요. 글이 참 좋네요. ^^
    내내 눈으로만 보다가 궁금한 점이 생겨서...
    만약 대역(Band) 필터를 C로 구현한다면요.
    BPF에 대한 전달함수를 새로 모델링 할 필요 없이
    저 두 필터를 한꺼번에 써서 대역을 만들어 주는 것 만으로도 대역필터가 될 수 있는 건가요?

    • BlogIcon PinkWink 2014.11.25 12:35 신고

      안타깝지만..... 위 두 필터는 각각 저역 통과 고역 통과 필터입니다. 그러나 합치면 저역과 고역만 통과시키니까 일종의 밴드스탑처럼 보일겁니다. 말씀하신 밴드패스필터는 안되는거죠....ㅠㅠ

  10. bu1779 2015.11.18 11:29 신고

    간단한제어기를 구성하던 도중에 시뮬링크에서 사용하던 필터를 어떻게 구현하는지 찾고 있었는데 선생님 설명을 들으니 매우 간단하네요..;
    도움받고갑니다 감사합니다~

  11. jchy1119 2015.11.18 15:28 신고

    라플라스 변환에서 s를 한번 미분한 d/dt, [Y(n)-Y(n-1)]/ts 로 표현 하셨는데 예를 들어 다른 복잡한 필터를 정현파 응답 구하기 위해서 식을 쓸때 s^2이나 1/s 는 어떤식으로 표현하나요 s^2은 d^2/dt^2으로 표현하는것 같긴한데 그다음 ts를 사용하여서 표현을 못하겠어요 ㅠㅠ s^2과 1/s를 ts를 가지고 표현하는것좀 알려주세요 ㅜㅜㅜ

    • BlogIcon PinkWink 2015.11.20 09:40 신고

      한 번 미분이 식으로 표현된 것을 아셨다면 두 번 미분도 마찬가지 입니다.^^. 분모는 시간의 제곱이 들어가고... 분자에는 아마 계산해보시면 두 샘플이 고려되어야할 겁니다.

  12. 개구리 2016.04.20 20:16 신고

    감사합니다. 매트랩에서 내장 함수 안쓰고, 직접 로우패스 필터를 해야 됬었는데, 글 보고 쉽게 해결할 수 있었습니다.

  13. 원쏠 2018.04.02 03:16 신고

    안녕하세요! 필요한 정보를 찾다가 보게 되었습니다. 자이로스코프를 이용해서 받은 각속도를 적분하고, 이 값을 하이패스필터를 통과 시키니 0으로 수렴하는데 뭐가 문제일까요..ㅠ.ㅠ

    • BlogIcon PinkWink 2018.04.02 14:32 신고

      통과주파수 대역값을 바꾸어도 그런가요???

    • 원쏠 2018.04.03 14:30 신고

      네 통과주파수 값을 변경해가면서 해봤는데도 0으로 수렴하네요ㅠㅠ 궁금한게 한 가지 더 있는데 자이로의 각속도를 필터하는게 맞나요? 아니면 적분한 각도값을 필터 해야하나요?

    • BlogIcon PinkWink 2018.04.05 00:14 신고

      목적에 따라 다르겠죠..
      자이로값 자체를 사용할 거면 당연히 출력에서 적용을...
      자이로로 만든 각도에 관심이 있으시다면 각도에 필터를...
      상보필터의 경우는 적분한 결과에 하이패스를 달았습니다
      적분자체가 약간 로우패스필터의 역할도 있거든요^^