임베디드 개발의 하드웨어 필터 설계 및 소프트웨어 필터 설계

필터링에는 어떤 유형이 있나요?

답변: 마이크로컴퓨터 제어 시스템의 아날로그 입력 신호에는 일반적으로 측정된 신호 소스 자체, 센서, 외부 간섭 등으로 인해 발생하는 다양한 소음과 간섭이 포함되어 있습니다. 정확한 측정 및 제어를 위해서는 측정되는 신호에서 잡음과 간섭을 제거해야 합니다.

필터링은 하드웨어 필터링과 소프트웨어 필터링으로 구분됩니다.

l 하드웨어 필터링: 필터링을 위해 특정 사양의 저항과 커패시터로 구성된 RC 필터 또는 인덕터와 커패시터로 구성된 LC 필터와 같은 아날로그 필터를 사용합니다.

l 소프트웨어 필터링: 디지털 필터링이라고도 하며 특정 계산 또는 판단 절차를 통해 노이즈의 영향을 줄이거나 약화시킵니다. 1. 필터링에는 어떤 유형이 있나요?

답변: 마이크로컴퓨터 제어 시스템의 아날로그 입력 신호에는 일반적으로 측정된 신호 소스 자체, 센서, 외부 간섭 등으로 인해 발생하는 다양한 소음과 간섭이 포함되어 있습니다. 정확한 측정 및 제어를 위해서는 측정되는 신호에서 잡음과 간섭을 제거해야 합니다.

필터링은 하드웨어 필터링과 소프트웨어 필터링으로 구분됩니다.

l 하드웨어 필터링: 필터링을 위해 특정 사양의 저항과 커패시터로 구성된 RC 필터 또는 인덕터와 커패시터로 구성된 LC 필터와 같은 아날로그 필터를 사용합니다.

l 소프트웨어 필터링: 디지털 필터링이라고도 하며 특정 계산 또는 판단 절차를 통해 노이즈의 영향을 줄이거나 약화시킵니다.

하드웨어 필터링

필터란 무엇입니까?

다양한 센서 신호는 어느 정도 노이즈 신호를 전달하므로 필터는 노이즈를 더 잘 줄이고 제거하며 실제적이고 유용한 신호를 복원할 수 있습니다.

필터는 특정 범위의 주파수 성분을 제거하거나 "필터링"하는 회로입니다. 즉, 신호의 주파수 스펙트럼을 통과할 주파수 성분과 차단할 주파수 성분으로 분리합니다.

주파수 영역 분석에 대한 경험이 많지 않다면 이러한 주파수 성분이 무엇인지, 동시에 여러 전압 값을 가질 수 없는 신호에서 이들이 어떻게 공존하는지 여전히 확신할 수 없습니다. 이 개념을 명확히 하는 데 도움이 되는 간단한 예를 살펴보겠습니다.

완벽한 5kHz 사인파로 구성된 오디오 신호가 있다고 가정해 보겠습니다. 우리는 시간 영역에서 사인파가 어떻게 보이는지 알고 있지만, 주파수 영역에서는 5kHz의 주파수 "스파이크"만 볼 수 있습니다. 이제 500kHz 발진기를 활성화하여 오디오 신호에 고주파수 잡음을 도입한다고 가정해 보겠습니다.

오실로스코프에 표시되는 신호는 여전히 매 순간 하나의 값을 갖는 일련의 전압이지만 이제 시간 영역 변경이 5kHz 사인파와 고주파수 노이즈 변동을 반영해야 하기 때문에 신호가 다르게 보일 것입니다.

그러나 주파수 영역에서 사인파와 잡음은 신호에 동시에 존재하는 별도의 주파수 성분입니다. 사인파와 잡음은 신호의 주파수 영역 표현에서 서로 다른 부분을 차지합니다. 즉, 신호를 저주파를 통해 전달하고 고주파수를 차단하는 회로를 통해 잡음을 필터링할 수 있습니다. 사인파 및 잡음 신호의 주파수 영역의 여러 부분 분포에 대한 개략도는 다음과 같습니다.

그림

필터 유형

필터는 필터 주파수 응답의 일반적인 특성에 해당하는 광범위한 범주로 분류될 수 있습니다. 낮은 주파수를 통과시키고 높은 주파수를 차단하는 필터를 저역통과 필터, 낮은 주파수를 차단하고 높은 주파수를 통과시키는 필터를 고역통과 필터라고 합니다. 상대적으로 좁은 범위의 주파수만 통과시키는 대역통과 필터와 상대적으로 좁은 범위의 주파수만 차단하는 대역저지 필터도 있습니다. 각 필터의 ​​주파수 영역 표현은 아래 그림에 나와 있습니다.

그림

필터는 회로를 구현하는 데 사용되는 구성 요소의 유형에 따라 분류될 수도 있습니다. 패시브 필터는 저항, 커패시터, 인덕터 등을 사용하는데, 이들 부품은 증폭 기능을 제공하지 않으므로 패시브 필터는 입력 신호의 진폭을 유지하거나 감소시키는 역할만 합니다. 반면에 능동 필터는 아래와 같이 트랜지스터나 연산 증폭기와 같은 능동 구성 요소를 포함하므로 신호를 필터링하고 이득을 적용합니다.

그림

이 능동 저역 통과 필터는 널리 사용되는 Sallen-Key 토폴로지를 기반으로 합니다. 관련 기사는 Sallen-Key 능동 필터를 참조하세요 .

RC 로우 패스 필터

수동 저역 통과 필터를 생성하려면 저항성 요소와 반응성 요소를 결합해야 합니다. 즉, 저항과 커패시터 또는 인덕터로 구성된 회로가 필요합니다. 이론적으로 저항기-인덕터(RL) 저역 통과 토폴로지는 필터링 기능 측면에서 저항기-커패시터(RC) 저역 통과 토폴로지와 동일합니다. 그러나 실제로는 저항-커패시터 방식이 더 일반적이므로 이 기사의 나머지 부분에서는 RC 저역 통과 필터에 중점을 둘 것입니다. RC 저역 통과 필터의 개략도는 다음과 같습니다.

그림

그림에 표시된 것처럼 신호 경로와 직렬로 저항을 배치하고 부하와 병렬로 커패시터를 배치하여 RC 저역 통과 응답을 생성할 수 있습니다. 다이어그램에서 부하는 단일 구성 요소이지만 실제 회로에서는 아날로그-디지털 변환기, 증폭기 또는 필터 응답을 측정하는 데 사용되는 오실로스코프의 입력 단계와 같이 더 복잡할 수 있습니다.

저항과 커패시터가 주파수 의존적인 전압 분배기를 형성한다는 것을 알면 RC 저역 통과 토폴로지의 필터링 동작을 직관적으로 분석할 수 있습니다. 아래와 같이 전압 분배기처럼 보이도록 RC 저역 통과 필터를 다시 그립니다.

그림

입력 신호의 주파수가 낮을 때 커패시터의 임피던스는 저항기의 임피던스에 비해 높으므로 대부분의 입력 전압은 커패시터 전체(및 커패시터와 병렬인 부하 전체)에서 떨어집니다. 입력 주파수가 높을수록 커패시터의 임피던스는 저항기의 임피던스에 비해 낮아집니다. 이는 저항기 양단의 전압이 감소하고 더 ​​적은 전압이 부하로 전달된다는 의미입니다. 따라서 저주파는 통과하고 고주파는 차단됩니다.

RC 저역통과 기능에 대한 이러한 정성적인 설명은 중요한 첫 번째 단계이지만, "고주파"와 "저주파"라는 용어가 매우 모호하기 때문에 실제로 회로를 설계해야 할 때는 그다지 유용하지 않습니다. 엔지니어는 특정 주파수를 통과시키고 차단하는 회로를 만들어야 합니다. 예를 들어, 위의 오디오 시스템에서 5kHz 신호를 보존하고 500kHz 신호를 억제하려고 합니다. 이는 5kHz와 500kHz 사이의 통과 전환을 차단하는 필터가 필요하다는 것을 의미합니다.

RC 필터 차단 주파수

필터가 상당한 감쇠를 유발하지 않는 주파수 범위를 통과대역이라고 하며, 필터가 상당한 감쇠를 유발하는 주파수 범위를 저지대역이라고 합니다. RC 저역 통과 필터와 같은 아날로그 필터는 항상 통과 대역에서 저지 대역으로 점진적으로 전환됩니다. 즉, 필터가 신호 전달을 중지하고 차단하기 시작하는 주파수를 식별할 방법이 없습니다. 그러나 엔지니어에게는 필터의 주파수 응답을 요약하는 편리하고 간결한 방법이 필요하며, 여기서 차단 주파수의 개념이 적용됩니다.

RC 필터의 주파수 응답 플롯을 보면 "차단 주파수"라는 용어가 그다지 정확하지 않다는 것을 알 수 있습니다. 신호 스펙트럼이 두 부분으로 "절단"되어 그 중 하나는 유지되고 다른 하나는 폐기되는 이미지는 주파수가 컷오프 아래에서 위로 이동함에 따라 감쇠가 점차 증가하기 때문에 적용할 수 없습니다.

RC 저역 통과 필터의 차단 주파수는 실제로 입력 신호 진폭이 3dB만큼 감소하는 주파수입니다(진폭의 3dB 감소는 전력의 50% 감소에 해당하기 때문에 이 값을 선택했습니다). 따라서 차단 주파수는 -3dB 주파수라고도 하는데, 실제로는 이 주파수가 더 정확하고 유익한 이름입니다. 대역폭이라는 용어는 필터 통과 대역의 폭을 의미하며, 저역 통과 필터의 경우 아래 그림에 표시된 것처럼 -3dB 주파수와 같습니다.

그림

위 그림은 -3dB 주파수와 동일한 대역폭을 갖는 RC 저역 통과 필터의 주파수 응답의 일반적인 특성을 보여줍니다.

위에서 언급한 것처럼 RC 필터의 저역 통과 동작은 저항의 주파수 독립적 임피던스와 커패시터의 주파수 종속 임피던스 사이의 상호 작용으로 인해 발생합니다. 필터의 주파수 응답의 세부 사항을 결정하려면 저항(R)과 정전 용량(C) 사이의 관계를 수학적으로 분석해야 하며, 이러한 값을 조작하여 정확한 사양을 충족하는 필터를 설계할 수도 있습니다. RC 저역 통과 필터의 차단 주파수(fC)는 다음과 같이 계산됩니다.

그림

간단한 디자인 예시를 살펴보겠습니다. 커패시터 값은 저항 값보다 더 제한적이므로 일반적인 커패시터 값(예: 10nF)으로 시작한 다음 해당 공식을 사용하여 필요한 저항 값을 결정합니다. 목표는 5kHz 오디오 파형을 보존하고 500kHz 잡음 파형을 억제하는 필터를 설계하는 것입니다. 우리는 100kHz의 차단 주파수를 시험해 볼 것이며, 이 기사의 뒷부분에서 이 필터가 두 주파수 구성 요소에 미치는 영향을 더 주의 깊게 분석할 것입니다. 공식은 다음과 같습니다.

그림

따라서 10nF 커패시터와 결합된 160Ω 저항은 원하는 주파수 응답에 매우 가까운 필터를 제공합니다.

필터 응답 시각화

신호에 대한 필터의 효과를 평가하는 가장 편리한 방법은 필터의 주파수 응답 플롯을 조사하는 것입니다. 종종 보드 플롯(Bode Plot)이라고 불리는 이 그래프는 세로 축에 진폭(데시벨 단위)이 있고 가로 축에 주파수가 있습니다. 가로 축은 일반적으로 1Hz와 10Hz 사이의 물리적 거리가 10Hz와 10Hz와 동일하도록 로그 스케일을 갖습니다. 100Hz 사이에서는 100Hz와 1kHz 사이의 물리적 거리가 동일합니다. 이 구성을 사용하면 넓은 주파수 범위에 걸쳐 필터의 동작을 빠르고 정확하게 평가할 수 있습니다. 아래 그림은 주파수 응답 다이어그램의 예입니다.

그림

곡선의 각 점은 입력 신호의 진폭이 1V이고 주파수가 가로축의 해당 값과 같을 경우 출력 신호의 진폭을 나타냅니다. 예를 들어, 입력 주파수가 1MHz이면 출력 진폭(입력 진폭이 1V라고 가정)은 0.1V가 됩니다(-20dB는 10배 감소 계수에 해당하므로).

이 주파수 응답 곡선의 일반적인 모양은 필터 회로를 다루는 데 더 많은 시간을 투자할수록 매우 익숙해질 것입니다. 곡선은 통과대역에서 거의 완전히 평평하며 입력 주파수가 차단 주파수에 가까워질수록 더 빠르게 떨어지기 시작합니다. 결국 감쇠 변화율(롤오프라고 함)은 20dB/10년으로 안정화됩니다. 즉, 입력 주파수가 10배 증가할 때마다 출력 신호의 진폭이 20dB씩 감소합니다.

저역 통과 필터 성능 평가

이 기사 앞부분에서 설계한 필터의 주파수 응답을 주의 깊게 플롯하면 5kHz에서의 진폭 응답은 기본적으로 0dB(즉, 감쇠가 거의 0임)이고 500kHz에서의 진폭 응답은 약 -14dB(0.2 게인에 해당)임을 알 수 있습니다. ). 이 값은 이전 섹션에서 수행한 계산과 일치합니다.

RC 필터는 항상 통과대역에서 저지대역으로 점진적으로 전환하고 감쇠가 무한대에 도달하지 않기 때문에 사인파에 영향을 주지 않고 잡음을 완전히 제거하는 "완벽한" 필터를 설계할 수 없습니다. 대신, 우리는 항상 절충을 해야 합니다. 차단 주파수를 5kHz에 가깝게 이동하면 소음 감쇠가 더 커지지만 스피커로 보내려는 사인파도 더 많이 감쇠됩니다. 차단 주파수를 500kHz에 가깝게 이동하면 사인파 주파수에서 감쇠가 줄어들고 잡음 주파수에서도 감쇠가 줄어듭니다.

이전에는 필터가 신호의 다양한 주파수 구성 요소의 진폭을 수정하는 방법에 대해 논의했습니다. 그러나 진폭 효과 외에도 반응성 회로 요소는 항상 위상 변이를 발생시킵니다.

저역 통과 필터 위상 편이

위상의 개념은 사이클 내 특정 순간의 주기적인 신호 값을 나타냅니다. 따라서 회로가 위상 변이를 일으킨다고 말할 때 입력 신호와 출력 신호 사이에 편차가 발생한다는 의미입니다. 입력 신호와 출력 신호는 더 이상 같은 순간에 주기를 시작하고 끝나지 않습니다. 위상 변이 값(예: 45° 또는 90°)은 생성된 편차의 양을 나타냅니다.

회로의 각 반응 요소는 90° 위상 변이를 일으키지만 이 위상 변이는 동시에 발생하지 않습니다. 출력 신호의 위상은 출력 신호의 진폭과 마찬가지로 입력 주파수가 증가함에 따라 점차적으로 변합니다. RC 저역 통과 필터에는 반응성 요소(커패시터)가 있으므로 회로는 결국 90° 위상 편이를 발생시킵니다.

진폭 응답과 마찬가지로 위상 응답은 대수 주파수를 나타내는 가로 축이 있는 플롯을 검토하여 가장 쉽게 평가됩니다. 다음 설명은 일반적인 패턴을 나타냅니다. 자세한 내용은 아래 이미지를 참조하세요.

  • 위상 변이는 초기에 0°입니다.
  • 위상 변이는 차단 주파수에서 45°에 도달할 때까지 점진적으로 증가하며, 이 응답 부분 동안 변화율은 점차 증가합니다.
  • 차단 주파수 이후에는 위상 변화가 계속 증가하지만 변화율은 점차 감소합니다.
  • 위상차가 점차 90°에 가까워질수록 변화율은 매우 작아집니다.

그림

실선은 진폭 응답이고 점선은 위상 응답입니다. 차단 주파수는 100kHz입니다. 차단 주파수에서의 위상 변이는 45°입니다.

2차 저역 통과 필터

지금까지 우리는 RC 저역 통과 필터가 저항기와 커패시터로 구성되어 있다고 가정했습니다. 이 구성은 1차 필터입니다. 관련 제안:

수동 필터의 "차수"는 회로의 반응성 부품(즉, 커패시터 또는 인덕터)의 수에 따라 결정됩니다. 고차 필터에는 더 많은 반응성 구성 요소가 있어 더 많은 위상 변이와 더 가파른 롤오프가 발생하며, 후자는 필터 차수를 늘리는 주요 동기입니다.

예를 들어 1차에서 2차로 또는 2차에서 3차로 필터에 반응 요소를 추가하면 최대 롤오프가 20dB/10년 증가합니다.

2차 필터는 일반적으로 인덕터와 커패시터로 구성된 공진 회로(RLC(저항-인덕터-커패시터))라는 토폴로지를 중심으로 구축됩니다. 그러나 2차 RC 필터를 생성하는 것도 가능합니다. 아래 그림에서 볼 수 있듯이 우리가 해야 할 일은 2개의 1차 RC 필터를 캐스케이드 연결하는 것뿐입니다.

그림

이 토폴로지는 확실히 2차 응답을 생성하지만 널리 사용되지 않으며 주파수 응답은 일반적으로 2차 능동 필터나 2차 RLC 필터만큼 좋지 않습니다.

2차 RC 필터의 주파수 응답

필요한 차단 주파수에 따라 1차 필터를 설계한 다음 그 중 두 개를 선택하여 직렬로 연결하여 2차 RC 저역 통과 필터를 형성할 수 있습니다. 이를 통해 필터는 20dB/decade가 아닌 40dB/decade의 최대 롤오프로 비슷한 전체 주파수 응답을 나타낼 수 있습니다.

그러나 응답을 더 자세히 살펴보면 -3dB 주파수가 감소한 것을 볼 수 있습니다. 2차 RC 필터는 두 필터링 단계가 독립적이지 않기 때문에 예상대로 동작하지 않으므로 단순히 두 필터를 함께 연결하고 동일한 저역 통과 필터링이 중첩된 1차 저역 통과 필터로 회로를 분석할 수 없습니다. .

또한 1차 RC와 2차 RC를 독립 필터로 사용할 수 있도록 두 단 사이에 버퍼를 삽입하더라도 원래 차단 주파수에서의 감쇠는 3dB가 아닌 6dB가 됩니다. 이는 두 단계가 독립적으로 작동하기 때문입니다. 첫 번째 필터는 차단 주파수에서 3dB의 감쇠를 가지며, 두 번째 필터는 아래와 같이 3dB의 감쇠를 추가합니다.

그림

2차 RC 저역통과 필터의 근본적인 한계는 설계자가 필터의 Q 인자를 조정하여 통과대역에서 저지대역으로의 전환을 미세 조정할 수 없다는 것입니다. 이 매개변수는 주파수 응답이 얼마나 감쇠되는지를 나타냅니다. 두 개의 동일한 RC 저역 통과 필터가 계단식으로 연결된 경우 전체 전달 함수는 2차 응답에 해당하지만 Q 인자는 항상 0.5입니다. Q=0.5일 때 필터는 과도하게 감쇠되기 직전이며, 이로 인해 전환 영역에서 주파수 응답이 "드루프"됩니다. 2차 능동 필터와 2차 공진 필터에는 이러한 제한이 없으며 설계자는 Q 인자를 제어하여 천이 영역의 주파수 응답을 미세 조정할 수 있습니다.

요약하다

모든 전기 신호에는 원하는 주파수 성분과 원치 않는 주파수 성분이 혼합되어 있습니다. 원치 않는 주파수 성분은 종종 잡음과 간섭으로 인해 발생하며 어떤 경우에는 시스템 성능에 부정적인 영향을 미칠 수 있습니다.

필터는 신호 스펙트럼의 다양한 부분에 다양한 방식으로 반응하는 회로입니다. 저역 통과 필터는 저주파 성분은 통과시키고 고주파 성분은 차단하도록 설계되었습니다.

저역 통과 필터의 차단 주파수는 필터가 낮은 감쇠에서 상당한 감쇠로 변경되는 주파수 영역을 나타냅니다.

RC 저역 통과 필터의 출력 전압은 회로를 (주파수 독립적) 저항과 (주파수 종속) 리액턴스로 구성된 전압 분배기로 간주하여 계산할 수 있습니다.

진폭(dB 단위, 세로 축) 대 로그 주파수(Hz 단위, 가로 축) 플롯은 필터의 이론적 동작을 확인하는 편리하고 효율적인 방법입니다. 위상 대 로그 주파수도 사용할 수 있습니다. 입력 신호에 적용될 위상 변이의 양을 결정합니다.

2차 필터는 더 가파른 롤오프를 가지며, 이 2차 응답은 신호가 원하는 주파수 성분과 원하지 않는 주파수 성분 사이의 광대역 분리를 제공하지 않는 경우에 유용합니다.

두 개의 동일한 1차 RC 저역 통과 필터를 구축한 다음 하나의 출력을 다른 것의 입력에 연결하여 2차 RC 저역 통과 필터를 생성할 수 있지만 결국 예상보다 전체 -3dB 주파수가 낮아집니다. .

소프트웨어 필터링

필터링 방법 방법 이점 결점 복잡성
제한 필터 방법 경험적 판단에 기초하여 두 번의 샘플링에 허용되는 최대 편차 값을 A로 결정하고 새로운 값이 검출될 때마다 판단하며, 이 값과 이전 값의 차이 <= A이면 유효하고, 현재 값이 이전 값과 다릅니다. 값의 차이가 >A인 경우 이 값은 유효하지 않으며 이 값을 버리고 이 값을 마지막 값으로 바꿉니다. 우발적 요인으로 인한 펄스 간섭을 효과적으로 극복할 수 있습니다. 주기적인 간섭을 억제할 수 없고 평활성이 좋지 않음 아직 계산되지 않았습니다.
중앙값 필터 방법 N번(N은 홀수) 연속적으로 샘플링하고, N개의 샘플값을 크기에 따라 배열하고, 이번에는 가운데 값을 유효값으로 취한다. 우발적인 요인으로 인한 변동 간섭을 효과적으로 극복할 수 있으며 온도와 액체 레벨이 천천히 변하는 측정된 매개변수에 대해 우수한 필터링 효과를 갖습니다. 유속, 속도 등 빠르게 변하는 매개변수에는 적합하지 않습니다.
산술 평균 필터링 방법 산술 평균 계산을 위해 N 값을 지속적으로 샘플링합니다. N 값이 큰 경우: 신호 평활도는 높지만 감도가 낮습니다. N 값이 작을 경우: 신호 평활도가 낮지만 감도가 높습니다. N 값 선택: 일반 유량, N = 12, 압력: N = 4 신호가 평균값으로 특성화되고 신호가 특정 값 범위 주위에서 변동하는 등 일반적으로 무작위 간섭이 있는 신호를 필터링하는 데 적합합니다. 느린 측정 속도나 빠른 데이터 계산 속도가 필요한 테스트 제어에는 적합하지 않아 RAM이 낭비됩니다.
재귀 평균 필터링 방법 N개의 연속 샘플링 값을 큐로 처리합니다. 큐의 길이는 N으로 고정됩니다. 새로운 데이터가 샘플링될 때마다 큐의 끝에 배치되고 큐의 선두에 있는 원래 데이터는 폐기됨(선입선출), 대기열의 데이터는 N 데이터의 산술 평균을 계산하여 새로운 필터링 결과를 얻습니다. N은 선택할 가치가 있습니다: 흐름: N = 12, 압력: N = 4, 액체 수준: N = 4-12, 온도: N = 1-4 주기적인 간섭에 대한 우수한 억제 효과와 높은 부드러움을 가지며 고주파 진동이 있는 시스템에 적합합니다. 낮은 감도, 간헐적인 펄스 간섭 억제 불량, 펄스 간섭으로 인한 샘플링 값 편차 제거 어려움, 심각한 펄스 간섭이 있는 경우에는 적합하지 않음, RAM 낭비
중앙값 평균 필터링 방법 "중앙 필터링 방식 + 산술 평균 필터링 방식"과 동일하며 N개의 데이터를 연속적으로 샘플링하고 최대값과 최소값을 제거한 후 N-2 데이터의 산술 평균을 계산합니다. N = 3-14 두 가지 필터링 유형의 장점을 결합하여 가끔 충동적인 필터링 간섭으로 인해 발생하는 샘플링 값 편차를 제거합니다. 측정 속도가 느리고 산술 평균 필터링과 마찬가지로 RAM을 낭비합니다.
잘린 평균 필터링 방법 "두 부분 제한 + 재귀 평균 필터링 방법"과 동일하며, 새로운 데이터가 샘플링될 때마다 먼저 클리핑 처리를 거친 후 재귀 평균 필터링 처리를 위해 큐로 전송됩니다. 두 가지 필터링 유형의 장점을 결합하여 가끔 충동적인 필터링 간섭으로 인해 발생하는 샘플링 값 편차를 제거합니다. RAM 낭비
1차 지연 필터링 방법 a = 0-1, (1-a) 이 샘플링 값 + 마지막 필터링 결과를 취합니다. 주기적인 간섭을 효과적으로 억제하며 주파수 변동이 큰 경우에 적합합니다. 위상 지연, 낮은 감도, 지연 정도는 a의 크기에 따라 달라지며 샘플링 주파수의 1/2보다 높은 필터링 주파수로는 간섭 신호를 제거할 수 없습니다.
가중 재귀 평균 필터링 방법 이는 재귀적 평균 필터링 방식을 개선한 것으로, 즉 시점에 따라 데이터에 서로 다른 가중치를 부여하는 방식으로, 일반적으로 현재 시점의 데이터에 가까울수록 가중치가 커진다. 새로운 샘플 값에 부여되는 가중치 계수가 클수록 감도는 높아지지만 신호의 부드러움은 낮아집니다. 순수 지연 시간 상수가 큰 시스템에 적합 순수 지연 시간 상수가 작고 샘플링 기간이 길며 신호 변화가 느린 신호의 경우 시스템의 현재 간섭 심각도를 신속하게 반영할 수 없으며 필터링 효과도 좋지 않습니다.
반송 방지 필터링 방법 각 샘플링 값을 현재 유효 값과 비교하기 위해 필터 카운터를 설정합니다. 샘플링 값 = 현재 유효 값이면 카운터가 지워지고, 샘플링 값 </>현재 유효 값이면 카운터 + 1이 되는지 여부를 결정합니다. 카운터 >= 상한 N(오버플로), 카운터가 오버플로되면 현재 유효한 값을 이 값으로 바꾸고 카운터를 지웁니다. 천천히 변화하는 측정 매개변수의 경우 더 나은 필터링 효과를 통해 임계값 근처에서 컨트롤러의 반복적인 켜짐/꺼짐 점프 또는 디스플레이의 수치 지터를 방지할 수 있습니다. 빠르게 변화하는 매개변수에는 적합하지 않으며, 카운터가 오버플로될 때 샘플링 값이 교란 값이 되는 경우 교란 값은 유효한 값으로 시스템에 가져옵니다.
디바운스 필터링 방법 제한 "제한 필터링 방법 + 디바운싱 필터링 방법"과 동일하며 먼저 제한한 다음 디바운싱합니다. 제한 및 디바운스의 장점을 계승하여 디바운스 필터링 방법의 결함을 개선하고 시스템에 간섭 값이 도입되는 것을 방지합니다. 빠르게 변화하는 매개변수에는 적합하지 않음
버터워스 필터 AD 샘플링에 적합하며 주기적인 펄스 변동이 발생합니다. RAM을 너무 많이 점유하고, 계산하는 데 시간이 오래 걸리며, 빠르게 변하는 매개변수에는 적합하지 않습니다.

편집 출처: https://www.jianshu.com/p/38ed6ff1b8c0

이름: 왕 키이(Wang Keyi)

학생번호: 20021110373T

재인쇄: http://www.wtoutiao.com/p/1fe9dPI.html

[Embedded Niu 소개] 일반적으로 사용되는 디지털 필터링 알고리즘의 특징과 적용 범위를 요약합니다.

[Embedded Bull's Nose] 1. 큰 펄스 간섭을 극복하기 위한 디지털 필터링 방법 2. 작은 진폭의 고주파 노이즈를 억제하기 위한 평균 필터링 방법 3. 복합 필터링 방법

[내장된 소 텍스트]

디지털 필터링: 디지털 장비를 사용하여 특정 알고리즘을 통해 신호를 처리하여 특정 주파수 대역의 신호를 필터링하고 새로운 신호를 얻는 과정을 디지털 필터링이라고 합니다.

디지털 필터는 클래식 필터와 현대 필터의 두 부분으로 나눌 수 있습니다. 고전적 필터는 입력 신호 x(n)에서 유용한 성분과 원하는 필터링된 성분이 서로 다른 주파수 대역에 위치한다고 가정하므로 선형 시스템을 통해 잡음을 필터링할 수 있습니다. 그러면 클래식 필터는 필터링 요구 사항을 충족할 수 없습니다. 일반적으로 고역통과 필터, 저역통과 필터, 대역통과 필터, 대역저지 필터가 있습니다. 최신 필터는 잡음이 있는 신호에서 유용한 신호와 잡음 신호를 추정합니다. 이 방법은 신호와 잡음 자체를 무작위 신호로 처리하고 자기 상관 함수, 상호 상관 함수, 자동 전력 스펙트럼, 교차 전력 스펙트럼 등과 같은 통계적 특성을 사용하여 신호 추정 알고리즘을 안내한 다음 다음을 사용합니다. 이를 구현하는 디지털 장비. 현재는 Wiener 필터, Kalman 필터, Adaptive 필터 등 디지털 필터가 주로 사용됩니다.

다음은 일반적으로 사용되는 8가지 필터링 방법을 소개합니다.

(1) 큰 펄스 간섭을 극복하기 위한 디지털 필터링 방법:

기기 외부 환경의 우발적 요인으로 인한 갑작스러운 교란이나 기기 내부 불안정으로 인한 비트 오류로 인한 날카로운 펄스 간섭을 극복하는 것은 기기 데이터 처리의 첫 번째 단계입니다. 일반적으로 간단한 비선형 필터링 방법이 사용됩니다.

1. 제한 필터링 방법(프로그램 판단 필터링 방법이라고도 함) 제한 필터링은 프로그램을 통해 측정된 신호의 변화 진폭을 판단하여 천천히 변화하는 신호에서 날카로운 펄스 간섭을 제거하는 것입니다.

A. 방법 : 경험적 판단에 기초하여 두 번의 샘플링에 허용되는 최대 편차 값을 결정(A로 설정) 새로운 값이 검출될 때마다 판단: 이 값과 이전 값의 차이가 A이면 이 값은 유효하지 않아 포기되었습니다. 이 값은 이 값을 마지막 값으로 바꿉니다.

B. 장점: 우발적인 요인으로 인한 펄스 간섭을 효과적으로 극복할 수 있습니다. 단점: 주기적인 간섭을 억제할 수 없고 매끄러움이 좋지 않습니다.

다. 적용범위 : 천천히 변하는 측정값

2. 중앙값 필터링 방법

메디안 필터는 일반적인 비선형 필터로 동작이 간단하고 임펄스 노이즈를 필터링하면서 신호의 세부 정보를 잘 보호할 수 있습니다.

A. 방법 : 연속적으로 N번(N은 홀수) 샘플링하고, N번의 샘플링 값을 크기에 따라 배열하고(주로 버블링 방식을 사용), 중간값을 이번의 유효값으로 한다.

B. 장점: 우발적 요인으로 인한 변동(펄스) 간섭을 효과적으로 극복할 수 있습니다. 단점: 유속, 속도 등 빠르게 변하는 매개변수에는 적합하지 않습니다.

C. 적용 범위: 온도와 액체 레벨의 느린 변화로 측정된 매개변수에 대해 우수한 필터링 효과가 있습니다.

(2) 작은 진폭의 고주파 잡음을 억제하기 위한 평균 필터링 방법

소진폭 고주파 전자 잡음: 전자 장치 열 잡음, A/D 양자화 잡음 등 저역 통과 특성을 갖는 선형 필터는 일반적으로 산술 평균 필터링 방법, 가중 평균 필터링 방법, 슬라이딩 가중 평균 필터링 방법, 1차 지연 필터링 방법 등을 사용합니다.

3. 산술 평균 필터링 방법 산술 평균 필터링 방법은 N개의 연속 샘플링 값을 더한 다음 산술 평균을 이 측정의 필터링된 값으로 사용하는 것입니다.

A. 방법: N개의 샘플값을 연속적으로 취하여 산술평균을 계산하며, N값이 클수록 신호 평활도는 높으나 감도가 낮고, N값이 작을 경우: 신호 평활도는 낮으나 감도가 떨어진다. 감도가 더 높습니다 N 값 선택: 일반 유량, N=12, 압력: N=4

B. 장점: 측정된 신호에 혼합된 무작위 간섭 신호를 필터링하는 데 매우 효과적입니다. 측정된 신호의 특성은 평균값을 가지며, 특정 값 범위를 중심으로 신호가 위아래로 변동한다는 것입니다. 단점: 펄스 간섭으로 인한 오류를 제거하는 것은 쉽지 않습니다. 샘플링 속도가 느리거나 높은 데이터 업데이트 속도가 필요한 실시간 시스템의 경우 산술 평균 필터링 방법을 사용할 수 없습니다. RAM 낭비

4. 순환 평균 필터링 방법(이동 평균 필터링 방법이라고도 함)

샘플링 속도가 느리거나 높은 데이터 업데이트 속도가 필요한 실시간 시스템의 경우 산술 평균 필터링 방법을 사용할 수 없습니다. 이동 평균 필터링 방식은 N개의 측정 데이터를 큐로 간주하고 큐의 길이를 N으로 고정합니다. 새로운 샘플링을 수행할 때마다 측정 결과는 큐의 꼬리에, 데이터는 맨 앞에 배치됩니다. 원래 대기열의 데이터가 제거되므로 대기열의 데이터는 항상 N개의 "최신" 데이터가 있습니다.

A. 방법: N개의 연속적인 샘플링 값을 큐로 취급하며 큐의 길이는 N으로 고정되어 있다. 새로운 데이터가 샘플링될 때마다 큐의 끝에 들어가고 원본 데이터는 맨 앞에 위치한다. (선입선출 원칙) 큐에 있는 N개의 데이터에 대해 산술 평균 연산을 수행하여 새로운 필터링 결과를 얻음 N 값 선택: 유량, N=12, 압력: N= 4, 액체 레벨, N=4 12, 온도, N= 1 4

B. 장점: 주기적인 간섭을 효과적으로 억제하고 평활도가 높으며 고주파 발진 시스템에 적합합니다. 단점: 낮은 감도, 가끔 펄스 간섭을 잘 억제하지 못함, 펄스 간섭으로 인한 샘플링 값 편차를 제거하기 어려움, 심각한 펄스 간섭이 있는 경우에는 적합하지 않음, RAM 낭비

5. 가중 재귀 평균 필터링 방법

A. 방법: 재귀적 평균 필터링 방식을 개선한 것으로, 즉 시점에 따라 데이터에 서로 다른 가중치를 부여하는 방식으로, 일반적으로 현재 시점의 데이터에 가까울수록 가중치가 커집니다. 새로운 샘플 값에 부여되는 가중치 계수가 클수록 감도는 높아지지만 신호의 평활도는 낮습니다.

B. 장점: 순수 지연 시간 상수가 큰 객체와 샘플링 기간이 짧은 시스템에 적합합니다. 단점: 순수 지연 시간 상수가 작고 샘플링 주기가 길며 신호 변화가 느린 신호의 경우 시스템에 대한 현재 간섭의 심각도를 신속하게 반영할 수 없으며 필터링 효과가 좋지 않습니다.

6. 1차 지연 필터링 방법 1차 저역 통과 디지털 필터는 소프트웨어를 사용하여 하드웨어 RC 필터링을 구현하여 간섭 신호를 억제합니다. 아날로그 입력 채널에서는 간섭을 억제하기 위해 일반적으로 1차 지연 RC 아날로그 필터가 사용됩니다.

저주파 간섭을 달성하기 위해 이 방법을 사용할 때 직면하게 되는 첫 번째 문제는 필터에 큰 시상수(시상수 = RC)와 고정밀 RC 네트워크가 필요하다는 것입니다. 시상수가 클수록 필요한 RC 값도 커지고, 누설 전류도 필연적으로 증가하여 RC 네트워크의 정확도가 떨어집니다. 1차 지연을 갖는 디지털 필터링 방법은 이 아날로그 필터의 단점을 잘 극복할 수 있으며, 필터 상수 요구 사항이 클 때 더 적합합니다.

A. 방법: a=Tf/(Tf+T)Tf는 필터링 시간 상수입니다. T는 샘플링 기간이며, 이 필터링 결과 = (1-a) 이 샘플링 값 + 마지막 필터링 결과입니다.

B. 장점: 주기적인 간섭에 대한 좋은 억제 효과가 있으며 변동 빈도가 높은 경우에 적합합니다. 단점: 위상 지연, 낮은 감도 지연 정도는 a 값에 따라 달라집니다. 샘플링 주파수의 1/2보다 높은 필터링 주파수를 갖는 간섭 신호는 제거할 수 없습니다.

(3) 복합 필터링 방법

실제 적용에서는 대규모 펄스 간섭을 제거하고 데이터 평활화를 달성해야 하는 경우가 있습니다. 따라서 이전에 소개된 두 가지 이상의 방법을 조합하여 복합 필터링을 구성하는 경우가 많습니다. 비극단 평균 필터링 알고리즘: 먼저 중앙값 필터 알고리즘을 사용하여 샘플링된 값에서 충격적인 간섭을 필터링한 다음 나머지 샘플링 값의 평균을 냅니다. N번 연속적으로 샘플링하고 최대값과 최소값을 제거한 후 나머지 N-2개 샘플의 평균을 구합니다. 분명히 이 방법은 무작위 간섭을 억제하고 명백한 펄스 간섭을 필터링할 수 있습니다.

7. 중앙 평균 필터링 방법(반펄스 간섭 평균 필터링 방법이라고도 함)

중앙값 필터링 방법은 "중앙값 필터링 방법" + "산술 평균 필터링 방법"과 동일합니다.

A. 방법 : N개의 데이터를 연속적으로 샘플링하여 최대값과 최소값을 제거한 후 N-2 데이터의 산술평균을 구함 N값 선택 : 3~14

B. 장점: 두 가지 필터링 방법의 장점을 결합한 방법으로 무작위 간섭을 억제할 수 있을 뿐만 아니라 명백한 펄스 간섭도 필터링할 수 있습니다. 단점: 측정 속도가 느리고 산술평균 필터링 방식과 마찬가지로 RAM을 낭비한다.

8. 제한 평균 필터링 방법

펄스 간섭이 심한 상황에서 일반 평균 방법을 사용하면 간섭이 평균화되어 결과에 나타납니다. 한계 평균 필터링 방법은 "제한 필터링 방법" + "재귀 평균 필터링 방법"과 동일합니다.

A. 방법: 각각의 새로운 샘플링 데이터는 먼저 제한 처리를 거친 후 순환 평균 필터링 처리를 위해 큐로 전송됩니다.

B. 장점: 두 가지 필터링 방법의 장점을 결합하여 간헐적인 펄스 간섭의 경우 펄스 간섭으로 인한 샘플 값 편차를 제거할 수 있습니다. 단점: RAM 낭비

C. 적용 범위: 천천히 변화하는 신호는 https://www.jianshu.com/p/38ed6ff1b8c0에서 편집되었습니다.

이름: 왕 키이(Wang Keyi)

학생번호: 20021110373T

재인쇄: http://www.wtoutiao.com/p/1fe9dPI.html

[Embedded Niu 소개] 일반적으로 사용되는 디지털 필터링 알고리즘의 특징과 적용 범위를 요약합니다.

[Embedded Bull's Nose] 1. 큰 펄스 간섭을 극복하기 위한 디지털 필터링 방법 2. 작은 진폭의 고주파 노이즈를 억제하기 위한 평균 필터링 방법 3. 복합 필터링 방법

[내장된 소 텍스트]

디지털 필터링: 디지털 장비를 사용하여 특정 알고리즘을 통해 신호를 처리하여 특정 주파수 대역의 신호를 필터링하고 새로운 신호를 얻는 과정을 디지털 필터링이라고 합니다.

디지털 필터는 클래식 필터와 현대 필터의 두 부분으로 나눌 수 있습니다. 고전적 필터는 입력 신호 x(n)에서 유용한 성분과 원하는 필터링된 성분이 서로 다른 주파수 대역에 위치한다고 가정하므로 선형 시스템을 통해 잡음을 필터링할 수 있습니다. 그러면 클래식 필터는 필터링 요구 사항을 충족할 수 없습니다. 일반적으로 고역통과 필터, 저역통과 필터, 대역통과 필터, 대역저지 필터가 있습니다. 최신 필터는 잡음이 있는 신호에서 유용한 신호와 잡음 신호를 추정합니다. 이 방법은 신호와 잡음 자체를 무작위 신호로 처리하고 자기 상관 함수, 상호 상관 함수, 자동 전력 스펙트럼, 교차 전력 스펙트럼 등과 같은 통계적 특성을 사용하여 신호 추정 알고리즘을 안내한 다음 다음을 사용합니다. 이를 구현하는 디지털 장비. 현재는 Wiener 필터, Kalman 필터, Adaptive 필터 등 디지털 필터가 주로 사용됩니다.

다음은 일반적으로 사용되는 8가지 필터링 방법을 소개합니다.

(1) 큰 펄스 간섭을 극복하기 위한 디지털 필터링 방법:

기기 외부 환경의 우발적 요인으로 인한 갑작스러운 교란이나 기기 내부 불안정으로 인한 비트 오류로 인한 날카로운 펄스 간섭을 극복하는 것은 기기 데이터 처리의 첫 번째 단계입니다. 일반적으로 간단한 비선형 필터링 방법이 사용됩니다.

1. 제한 필터링 방법(프로그램 판단 필터링 방법이라고도 함) 제한 필터링은 프로그램을 통해 측정된 신호의 변화 진폭을 판단하여 천천히 변화하는 신호에서 날카로운 펄스 간섭을 제거하는 것입니다.

A. 방법 : 경험적 판단에 기초하여 두 번의 샘플링에 허용되는 최대 편차 값을 결정(A로 설정) 새로운 값이 검출될 때마다 판단: 이 값과 이전 값의 차이가 A이면 이 값은 유효하지 않아 포기되었습니다. 이 값은 이 값을 마지막 값으로 바꿉니다.

B. 장점: 우발적인 요인으로 인한 펄스 간섭을 효과적으로 극복할 수 있습니다. 단점: 주기적인 간섭을 억제할 수 없고 매끄러움이 좋지 않습니다.

다. 적용범위 : 천천히 변하는 측정값

2. 중앙값 필터링 방법

메디안 필터는 일반적인 비선형 필터로 동작이 간단하고 임펄스 노이즈를 필터링하면서 신호의 세부 정보를 잘 보호할 수 있습니다.

A. 방법 : 연속적으로 N번(N은 홀수) 샘플링하고, N번의 샘플링 값을 크기에 따라 배열하고(주로 버블링 방식을 사용), 중간값을 이번의 유효값으로 한다.

B. 장점: 우발적 요인으로 인한 변동(펄스) 간섭을 효과적으로 극복할 수 있습니다. 단점: 유속, 속도 등 빠르게 변하는 매개변수에는 적합하지 않습니다.

C. 적용 범위: 온도와 액체 레벨의 느린 변화로 측정된 매개변수에 대해 우수한 필터링 효과가 있습니다.

(2) 작은 진폭의 고주파 잡음을 억제하기 위한 평균 필터링 방법

소진폭 고주파 전자 잡음: 전자 장치 열 잡음, A/D 양자화 잡음 등 저역 통과 특성을 갖는 선형 필터는 일반적으로 산술 평균 필터링 방법, 가중 평균 필터링 방법, 슬라이딩 가중 평균 필터링 방법, 1차 지연 필터링 방법 등을 사용합니다.

3. 산술 평균 필터링 방법 산술 평균 필터링 방법은 N개의 연속 샘플링 값을 더한 다음 산술 평균을 이 측정의 필터링된 값으로 사용하는 것입니다.

A. 방법: N개의 샘플값을 연속적으로 취하여 산술평균을 계산하며, N값이 클수록 신호 평활도는 높으나 감도가 낮고, N값이 작을 경우: 신호 평활도는 낮으나 감도가 떨어진다. 감도가 더 높습니다 N 값 선택: 일반 유량, N=12, 압력: N=4

B. 장점: 측정된 신호에 혼합된 무작위 간섭 신호를 필터링하는 데 매우 효과적입니다. 측정된 신호의 특성은 평균값을 가지며, 특정 값 범위를 중심으로 신호가 위아래로 변동한다는 것입니다. 단점: 펄스 간섭으로 인한 오류를 제거하는 것은 쉽지 않습니다. 샘플링 속도가 느리거나 높은 데이터 업데이트 속도가 필요한 실시간 시스템의 경우 산술 평균 필터링 방법을 사용할 수 없습니다. RAM 낭비

4. 순환 평균 필터링 방법(이동 평균 필터링 방법이라고도 함)

샘플링 속도가 느리거나 높은 데이터 업데이트 속도가 필요한 실시간 시스템의 경우 산술 평균 필터링 방법을 사용할 수 없습니다. 이동 평균 필터링 방식은 N개의 측정 데이터를 큐로 간주하고 큐의 길이를 N으로 고정합니다. 새로운 샘플링을 수행할 때마다 측정 결과는 큐의 꼬리에, 데이터는 맨 앞에 배치됩니다. 원래 대기열의 데이터가 제거되므로 대기열의 데이터는 항상 N개의 "최신" 데이터가 있습니다.

A. 방법: N개의 연속적인 샘플링 값을 큐로 취급하며 큐의 길이는 N으로 고정되어 있다. 새로운 데이터가 샘플링될 때마다 큐의 끝에 들어가고 원본 데이터는 맨 앞에 위치한다. (선입선출 원칙) 큐에 있는 N개의 데이터에 대해 산술 평균 연산을 수행하여 새로운 필터링 결과를 얻음 N 값 선택: 유량, N=12, 압력: N= 4, 액체 레벨, N=4 12, 온도, N= 1 4

B. 장점: 주기적인 간섭을 효과적으로 억제하고 평활도가 높으며 고주파 발진 시스템에 적합합니다. 단점: 낮은 감도, 가끔 펄스 간섭을 잘 억제하지 못함, 펄스 간섭으로 인한 샘플링 값 편차를 제거하기 어려움, 심각한 펄스 간섭이 있는 경우에는 적합하지 않음, RAM 낭비

5. 가중 재귀 평균 필터링 방법

A. 방법: 재귀적 평균 필터링 방식을 개선한 것으로, 즉 시점에 따라 데이터에 서로 다른 가중치를 부여하는 방식으로, 일반적으로 현재 시점의 데이터에 가까울수록 가중치가 커집니다. 새로운 샘플 값에 부여되는 가중치 계수가 클수록 감도는 높아지지만 신호의 평활도는 낮습니다.

B. 장점: 순수 지연 시간 상수가 큰 객체와 샘플링 기간이 짧은 시스템에 적합합니다. 단점: 순수 지연 시간 상수가 작고 샘플링 주기가 길며 신호 변화가 느린 신호의 경우 시스템에 대한 현재 간섭의 심각도를 신속하게 반영할 수 없으며 필터링 효과가 좋지 않습니다.

6. 1차 지연 필터링 방법 1차 저역 통과 디지털 필터는 소프트웨어를 사용하여 하드웨어 RC 필터링을 구현하여 간섭 신호를 억제합니다. 아날로그 입력 채널에서는 간섭을 억제하기 위해 일반적으로 1차 지연 RC 아날로그 필터가 사용됩니다.

저주파 간섭을 달성하기 위해 이 방법을 사용할 때 직면하게 되는 첫 번째 문제는 필터에 큰 시상수(시상수 = RC)와 고정밀 RC 네트워크가 필요하다는 것입니다. 시상수가 클수록 필요한 RC 값도 커지고, 누설 전류도 필연적으로 증가하여 RC 네트워크의 정확도가 떨어집니다. 1차 지연을 갖는 디지털 필터링 방법은 이 아날로그 필터의 단점을 잘 극복할 수 있으며, 필터 상수 요구 사항이 클 때 더 적합합니다.

A. 방법: a=Tf/(Tf+T)Tf는 필터링 시간 상수입니다. T는 샘플링 기간이며, 이 필터링 결과 = (1-a) 이 샘플링 값 + 마지막 필터링 결과입니다.

B. 장점: 주기적인 간섭에 대한 좋은 억제 효과가 있으며 변동 빈도가 높은 경우에 적합합니다. 단점: 위상 지연, 낮은 감도 지연 정도는 a 값에 따라 달라집니다. 샘플링 주파수의 1/2보다 높은 필터링 주파수를 갖는 간섭 신호는 제거할 수 없습니다.

(3) 복합 필터링 방법

실제 적용에서는 대규모 펄스 간섭을 제거하고 데이터 평활화를 달성해야 하는 경우가 있습니다. 따라서 이전에 소개된 두 가지 이상의 방법을 조합하여 복합 필터링을 구성하는 경우가 많습니다. 비극단 평균 필터링 알고리즘: 먼저 중앙값 필터 알고리즘을 사용하여 샘플링된 값에서 충격적인 간섭을 필터링한 다음 나머지 샘플링 값의 평균을 냅니다. N번 연속적으로 샘플링하고 최대값과 최소값을 제거한 후 나머지 N-2개 샘플의 평균을 구합니다. 분명히 이 방법은 무작위 간섭을 억제하고 명백한 펄스 간섭을 필터링할 수 있습니다.

7. 중앙 평균 필터링 방법(반펄스 간섭 평균 필터링 방법이라고도 함)

중앙값 필터링 방법은 "중앙값 필터링 방법" + "산술 평균 필터링 방법"과 동일합니다.

A. 방법 : N개의 데이터를 연속적으로 샘플링하여 최대값과 최소값을 제거한 후 N-2 데이터의 산술평균을 구함 N값 선택 : 3~14

B. 장점: 두 가지 필터링 방법의 장점을 결합한 방법으로 무작위 간섭을 억제할 수 있을 뿐만 아니라 명백한 펄스 간섭도 필터링할 수 있습니다. 단점: 측정 속도가 느리고 산술평균 필터링 방식과 마찬가지로 RAM을 낭비한다.

8. 제한 평균 필터링 방법

펄스 간섭이 심한 상황에서 일반 평균 방법을 사용하면 간섭이 평균화되어 결과에 나타납니다. 한계 평균 필터링 방법은 "제한 필터링 방법" + "재귀 평균 필터링 방법"과 동일합니다.

A. 방법: 각각의 새로운 샘플링 데이터는 먼저 제한 처리를 거친 후 순환 평균 필터링 처리를 위해 큐로 전송됩니다.

B. 장점: 두 가지 필터링 방법의 장점을 결합하여 간헐적인 펄스 간섭의 경우 펄스 간섭으로 인한 샘플 값 편차를 제거할 수 있습니다. 단점: RAM 낭비

C. 적용 범위: 천천히 변화하는 신호

1. 제한 필터링 방식(프로그램 판단 필터링 방식이라고도 함)

/*
A、名称:限幅滤波法(又称程序判断滤波法)
B、方法:
    根据经验判断,确定两次采样允许的最大偏差值(设为A),
    每次检测到新值时判断:
    如果本次值与上次值之差<=A,则本次值有效,
    如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
C、优点:
    能有效克服因偶然因素引起的脉冲干扰。
D、缺点:
    无法抑制那种周期性的干扰。
    平滑度差。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;
int Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Value = Filter_Value;          // 最近一次有效采样的值,该变量为全局变量
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 限幅滤波法(又称程序判断滤波法)
#define FILTER_A 1
int Filter() {
  int NewValue;
  NewValue = Get_AD();
  if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
    return Value;
  else
    return NewValue;
}

/*
A、名称:限幅滤波法(又称程序判断滤波法)
B、方法:
    根据经验判断,确定两次采样允许的最大偏差值(设为A),
    每次检测到新值时判断:
    如果本次值与上次值之差<=A,则本次值有效,
    如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
C、优点:
    能有效克服因偶然因素引起的脉冲干扰。
D、缺点:
    无法抑制那种周期性的干扰。
    平滑度差。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;
int Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Value = Filter_Value;          // 最近一次有效采样的值,该变量为全局变量
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 限幅滤波法(又称程序判断滤波法)
#define FILTER_A 1
int Filter() {
  int NewValue;
  NewValue = Get_AD();
  if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
    return Value;
  else
    return NewValue;
}

2. 중앙값 필터링 방법

/*
A、名称:中位值滤波法
B、方法:
    连续采样N次(N取奇数),把N次采样值按大小排列,
    取中间值为本次有效值。
C、优点:
    能有效克服因偶然因素引起的波动干扰;
    对温度、液位的变化缓慢的被测参数有良好的滤波效果。
D、缺点:
    对流量、速度等快速变化的参数不宜。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 中位值滤波法
#define FILTER_N 101
int Filter() {
  int filter_buf[FILTER_N];
  int i, j;
  int filter_temp;
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = Get_AD();
    delay(1);
  }
  // 采样值从小到大排列(冒泡法)
  for(j = 0; j < FILTER_N - 1; j++) {
    for(i = 0; i < FILTER_N - 1 - j; i++) {
      if(filter_buf[i] > filter_buf[i + 1]) {
        filter_temp = filter_buf[i];
        filter_buf[i] = filter_buf[i + 1];
        filter_buf[i + 1] = filter_temp;
      }
    }
  }
  return filter_buf[(FILTER_N - 1) / 2];
}

3. 산술평균 필터링 방법

/*
A、名称:算术平均滤波法
B、方法:
    连续取N个采样值进行算术平均运算:
    N值较大时:信号平滑度较高,但灵敏度较低;
    N值较小时:信号平滑度较低,但灵敏度较高;
    N值的选取:一般流量,N=12;压力:N=4。
C、优点:
    适用于对一般具有随机干扰的信号进行滤波;
    这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
D、缺点:
    对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 算术平均滤波法
#define FILTER_N 12
int Filter() {
  int i;
  int filter_sum = 0;
  for(i = 0; i < FILTER_N; i++) {
    filter_sum += Get_AD();
    delay(1);
  }
  return (int)(filter_sum / FILTER_N);
}
/*
A、名称:算术平均滤波法
B、方法:
    连续取N个采样值进行算术平均运算:
    N值较大时:信号平滑度较高,但灵敏度较低;
    N值较小时:信号平滑度较低,但灵敏度较高;
    N值的选取:一般流量,N=12;压力:N=4。
C、优点:
    适用于对一般具有随机干扰的信号进行滤波;
    这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
D、缺点:
    对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 算术平均滤波法
#define FILTER_N 12
int Filter() {
  int i;
  int filter_sum = 0;
  for(i = 0; i < FILTER_N; i++) {
    filter_sum += Get_AD();
    delay(1);
  }
  return (int)(filter_sum / FILTER_N);
}

4. 순환 평균 필터링 방법(이동 평균 필터링 방법이라고도 함)

/*
A、名称:递推平均滤波法(又称滑动平均滤波法)
B、方法:
    把连续取得的N个采样值看成一个队列,队列的长度固定为N,
    每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
    把队列中的N个数据进行算术平均运算,获得新的滤波结果。
    N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
C、优点:
    对周期性干扰有良好的抑制作用,平滑度高;
    适用于高频振荡的系统。
D、缺点:
    灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
    不易消除由于脉冲干扰所引起的采样值偏差;
    不适用于脉冲干扰比较严重的场合;
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 递推平均滤波法(又称滑动平均滤波法)
#define FILTER_N 12
int filter_buf[FILTER_N + 1];
int Filter() {
  int i;
  int filter_sum = 0;
  filter_buf[FILTER_N] = Get_AD();
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉
    filter_sum += filter_buf[i];
  }
  return (int)(filter_sum / FILTER_N);
}
/*
A、名称:递推平均滤波法(又称滑动平均滤波法)
B、方法:
    把连续取得的N个采样值看成一个队列,队列的长度固定为N,
    每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
    把队列中的N个数据进行算术平均运算,获得新的滤波结果。
    N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
C、优点:
    对周期性干扰有良好的抑制作用,平滑度高;
    适用于高频振荡的系统。
D、缺点:
    灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
    不易消除由于脉冲干扰所引起的采样值偏差;
    不适用于脉冲干扰比较严重的场合;
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 递推平均滤波法(又称滑动平均滤波法)
#define FILTER_N 12
int filter_buf[FILTER_N + 1];
int Filter() {
  int i;
  int filter_sum = 0;
  filter_buf[FILTER_N] = Get_AD();
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉
    filter_sum += filter_buf[i];
  }
  return (int)(filter_sum / FILTER_N);
}

5. 중앙 평균 필터링 방법(반펄스 간섭 평균 필터링 방법이라고도 함)

/*
A、名称:中位值平均滤波法(又称防脉冲干扰平均滤波法)
B、方法:
    采一组队列去掉最大值和最小值后取平均值,
    相当于“中位值滤波法”+“算术平均滤波法”。
    连续采样N个数据,去掉一个最大值和一个最小值,
    然后计算N-2个数据的算术平均值。
    N值的选取:3-14。
C、优点:
    融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
    对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
    对周期干扰有良好的抑制作用。
    平滑度高,适于高频振荡的系统。
D、缺点:
    计算速度较慢,和算术平均滤波法一样。
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)
#define FILTER_N 100
int Filter() {
  int i, j;
  int filter_temp, filter_sum = 0;
  int filter_buf[FILTER_N];
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = Get_AD();
    delay(1);
  }
  // 采样值从小到大排列(冒泡法)
  for(j = 0; j < FILTER_N - 1; j++) {
    for(i = 0; i < FILTER_N - 1 - j; i++) {
      if(filter_buf[i] > filter_buf[i + 1]) {
        filter_temp = filter_buf[i];
        filter_buf[i] = filter_buf[i + 1];
        filter_buf[i + 1] = filter_temp;
      }
    }
  }
  // 去除最大最小极值后求平均
  for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf[i];
  return filter_sum / (FILTER_N - 2);
}


//  中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)
/*
#define FILTER_N 100
int Filter() {
  int i;
  int filter_sum = 0;
  int filter_max, filter_min;
  int filter_buf[FILTER_N];
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = Get_AD();
    delay(1);
  }
  filter_max = filter_buf[0];
  filter_min = filter_buf[0];
  filter_sum = filter_buf[0];
  for(i = FILTER_N - 1; i > 0; i--) {
    if(filter_buf[i] > filter_max)
      filter_max=filter_buf[i];
    else if(filter_buf[i] < filter_min)
      filter_min=filter_buf[i];
    filter_sum = filter_sum + filter_buf[i];
    filter_buf[i] = filter_buf[i - 1];
  }
  i = FILTER_N - 2;
  filter_sum = filter_sum - filter_max - filter_min + i / 2; // +i/2 的目的是为了四舍五入
  filter_sum = filter_sum / i;
  return filter_sum;
}*/
/*
A、名称:中位值平均滤波法(又称防脉冲干扰平均滤波法)
B、方法:
    采一组队列去掉最大值和最小值后取平均值,
    相当于“中位值滤波法”+“算术平均滤波法”。
    连续采样N个数据,去掉一个最大值和一个最小值,
    然后计算N-2个数据的算术平均值。
    N值的选取:3-14。
C、优点:
    融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
    对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
    对周期干扰有良好的抑制作用。
    平滑度高,适于高频振荡的系统。
D、缺点:
    计算速度较慢,和算术平均滤波法一样。
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)
#define FILTER_N 100
int Filter() {
  int i, j;
  int filter_temp, filter_sum = 0;
  int filter_buf[FILTER_N];
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = Get_AD();
    delay(1);
  }
  // 采样值从小到大排列(冒泡法)
  for(j = 0; j < FILTER_N - 1; j++) {
    for(i = 0; i < FILTER_N - 1 - j; i++) {
      if(filter_buf[i] > filter_buf[i + 1]) {
        filter_temp = filter_buf[i];
        filter_buf[i] = filter_buf[i + 1];
        filter_buf[i + 1] = filter_temp;
      }
    }
  }
  // 去除最大最小极值后求平均
  for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf[i];
  return filter_sum / (FILTER_N - 2);
}


//  中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)
/*
#define FILTER_N 100
int Filter() {
  int i;
  int filter_sum = 0;
  int filter_max, filter_min;
  int filter_buf[FILTER_N];
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = Get_AD();
    delay(1);
  }
  filter_max = filter_buf[0];
  filter_min = filter_buf[0];
  filter_sum = filter_buf[0];
  for(i = FILTER_N - 1; i > 0; i--) {
    if(filter_buf[i] > filter_max)
      filter_max=filter_buf[i];
    else if(filter_buf[i] < filter_min)
      filter_min=filter_buf[i];
    filter_sum = filter_sum + filter_buf[i];
    filter_buf[i] = filter_buf[i - 1];
  }
  i = FILTER_N - 2;
  filter_sum = filter_sum - filter_max - filter_min + i / 2; // +i/2 的目的是为了四舍五入
  filter_sum = filter_sum / i;
  return filter_sum;
}*/

6. 제한 평균 필터링 방법

/*
A、名称:限幅平均滤波法
B、方法:
    相当于“限幅滤波法”+“递推平均滤波法”;
    每次采样到的新数据先进行限幅处理,
    再送入队列进行递推平均滤波处理。
C、优点:
    融合了两种滤波法的优点;
    对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
D、缺点:
    比较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/

#define FILTER_N 12
int Filter_Value;
int filter_buf[FILTER_N];

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  filter_buf[FILTER_N - 2] = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 限幅平均滤波法
#define FILTER_A 1
int Filter() {
  int i;
  int filter_sum = 0;
  filter_buf[FILTER_N - 1] = Get_AD();
  if(((filter_buf[FILTER_N - 1] - filter_buf[FILTER_N - 2]) > FILTER_A) || ((filter_buf[FILTER_N - 2] - filter_buf[FILTER_N - 1]) > FILTER_A))
    filter_buf[FILTER_N - 1] = filter_buf[FILTER_N - 2];
  for(i = 0; i < FILTER_N - 1; i++) {
    filter_buf[i] = filter_buf[i + 1];
    filter_sum += filter_buf[i];
  }
  return (int)filter_sum / (FILTER_N - 1);
}

7. 1차 지연 필터링 방법

/*
A、名称:一阶滞后滤波法
B、方法:
    取a=0-1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。
C、优点:
    对周期性干扰具有良好的抑制作用;
    适用于波动频率较高的场合。
D、缺点:
    相位滞后,灵敏度低;
    滞后程度取决于a值大小;
    不能消除滤波频率高于采样频率1/2的干扰信号。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;
int Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 一阶滞后滤波法
#define FILTER_A 0.01
int Filter() {
  int NewValue;
  NewValue = Get_AD();
  Value = (int)((float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value);
  return Value;
}

8. 가중 재귀 평균 필터링 방법

/*
A、名称:加权递推平均滤波法
B、方法:
    是对递推平均滤波法的改进,即不同时刻的数据加以不同的权;
    通常是,越接近现时刻的数据,权取得越大。
    给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。
C、优点:
    适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。
D、缺点:
    对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;
    不能迅速反应系统当前所受干扰的严重程度,滤波效果差。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 加权递推平均滤波法
#define FILTER_N 12
int coe[FILTER_N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};    // 加权系数表
int sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; // 加权系数和
int filter_buf[FILTER_N + 1];
int Filter() {
  int i;
  int filter_sum = 0;
  filter_buf[FILTER_N] = Get_AD();
  for(i = 0; i < FILTER_N; i++) {
    filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉
    filter_sum += filter_buf[i] * coe[i];
  }
  filter_sum /= sum_coe;
  return filter_sum;
}

9. 반송 방지 필터링 방법

/*
A、名称:消抖滤波法
B、方法:
    设置一个滤波计数器,将每次采样值与当前有效值比较:
    如果采样值=当前有效值,则计数器清零;
    如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出);
    如果计数器溢出,则将本次值替换当前有效值,并清计数器。
C、优点:
    对于变化缓慢的被测参数有较好的滤波效果;
    可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。
D、缺点:
    对于快速变化的参数不宜;
    如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;
int Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 消抖滤波法
#define FILTER_N 12
int i = 0;
int Filter() {
  int new_value;
  new_value = Get_AD();
  if(Value != new_value) {
    i++;
    if(i > FILTER_N) {
      i = 0;
      Value = new_value;
    }
  }
  else
    i = 0;
  return Value;
}

10. 디바운스 필터링 방식 제한

/*
A、名称:限幅消抖滤波法
B、方法:
    相当于“限幅滤波法”+“消抖滤波法”;
    先限幅,后消抖。
C、优点:
    继承了“限幅”和“消抖”的优点;
    改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。
D、缺点:
    对于快速变化的参数不宜。
E、整理:shenhaiyu 2013-11-01
*/

int Filter_Value;
int Value;

void setup() {
  Serial.begin(9600);       // 初始化串口通信
  randomSeed(analogRead(0)); // 产生随机种子
  Value = 300;
}

void loop() {
  Filter_Value = Filter();       // 获得滤波器输出值
  Serial.println(Filter_Value); // 串口输出
  delay(50);
}

// 用于随机产生一个300左右的当前值
int Get_AD() {
  return random(295, 305);
}

// 限幅消抖滤波法
#define FILTER_A 1
#define FILTER_N 5
int i = 0;
int Filter() {
  int NewValue;
  int new_value;
  NewValue = Get_AD();
  if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
    new_value = Value;
  else
    new_value = NewValue;
  if(Value != new_value) {
    i++;
    if(i > FILTER_N) {
      i = 0;
      Value = new_value;
    }
  }
  else
    i = 0;
  return Value;
}

11. 칼만 필터(비확장 칼만)

#include <Wire.h> // I2C library, gyroscope

// Accelerometer ADXL345
#define ACC (0x53)    //ADXL345 ACC address
#define A_TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)


// Gyroscope ITG3200 
#define GYRO 0x68 // gyro address, binary = 11101000 when AD0 is connected to Vcc (see schematics of your breakout board)
#define G_SMPLRT_DIV 0x15   
#define G_DLPF_FS 0x16   
#define G_INT_CFG 0x17
#define G_PWR_MGM 0x3E

#define G_TO_READ 8 // 2 bytes for each axis x, y, z


// offsets are chip specific. 
int a_offx = 0;
int a_offy = 0;
int a_offz = 0;

int g_offx = 0;
int g_offy = 0;
int g_offz = 0;



char str[512]; 

void initAcc() {
  //Turning on the ADXL345
  writeTo(ACC, 0x2D, 0);      
  writeTo(ACC, 0x2D, 16);
  writeTo(ACC, 0x2D, 8);
  //by default the device is in +-2g range reading
}

void getAccelerometerData(int* result) {
  int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
  byte buff[A_TO_READ];
  
  readFrom(ACC, regAddress, A_TO_READ, buff); //read the acceleration data from the ADXL345
  
  //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  //thus we are converting both bytes in to one int
  result[0] = (((int)buff[1]) << 8) | buff[0] + a_offx;   
  result[1] = (((int)buff[3]) << 8) | buff[2] + a_offy;
  result[2] = (((int)buff[5]) << 8) | buff[4] + a_offz;
}

//initializes the gyroscope
void initGyro()
{
  /*****************************************
  * ITG 3200
  * power management set to:
  * clock select = internal oscillator
  *     no reset, no sleep mode
  *   no standby mode
  * sample rate to = 125Hz
  * parameter to +/- 2000 degrees/sec
  * low pass filter = 5Hz
  * no interrupt
  ******************************************/
  writeTo(GYRO, G_PWR_MGM, 0x00);
  writeTo(GYRO, G_SMPLRT_DIV, 0x07); // EB, 50, 80, 7F, DE, 23, 20, FF
  writeTo(GYRO, G_DLPF_FS, 0x1E); // +/- 2000 dgrs/sec, 1KHz, 1E, 19
  writeTo(GYRO, G_INT_CFG, 0x00);
}


void getGyroscopeData(int * result)
{
  /**************************************
  Gyro ITG-3200 I2C
  registers:
  temp MSB = 1B, temp LSB = 1C
  x axis MSB = 1D, x axis LSB = 1E
  y axis MSB = 1F, y axis LSB = 20
  z axis MSB = 21, z axis LSB = 22
  *************************************/

  int regAddress = 0x1B;
  int temp, x, y, z;
  byte buff[G_TO_READ];
  
  readFrom(GYRO, regAddress, G_TO_READ, buff); //read the gyro data from the ITG3200
  
  result[0] = ((buff[2] << 8) | buff[3]) + g_offx;
  result[1] = ((buff[4] << 8) | buff[5]) + g_offy;
  result[2] = ((buff[6] << 8) | buff[7]) + g_offz;
  result[3] = (buff[0] << 8) | buff[1]; // temperature
  
}


float xz=0,yx=0,yz=0;
float p_xz=1,p_yx=1,p_yz=1;
float q_xz=0.0025,q_yx=0.0025,q_yz=0.0025;
float k_xz=0,k_yx=0,k_yz=0;
float r_xz=0.25,r_yx=0.25,r_yz=0.25;
  //int acc_temp[3];
  //float acc[3];
  int acc[3];
  int gyro[4];
  float Axz;
  float Ayx;
  float Ayz;
  float t=0.025;
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  initAcc();
  initGyro();
  
}

//unsigned long timer = 0;
//float o;
void loop()
{
  
  getAccelerometerData(acc);
  getGyroscopeData(gyro);
  //timer = millis();
  sprintf(str, "%d,%d,%d,%d,%d,%d", acc[0],acc[1],acc[2],gyro[0],gyro[1],gyro[2]);
  
  //acc[0]=acc[0];
  //acc[2]=acc[2];
  //acc[1]=acc[1];
  //r=sqrt(acc[0]*acc[0]+acc[1]*acc[1]+acc[2]*acc[2]);
  gyro[0]=gyro[0]/ 14.375;
  gyro[1]=gyro[1]/ (-14.375);
  gyro[2]=gyro[2]/ 14.375;
  
   
  Axz=(atan2(acc[0],acc[2]))*180/PI;
  Ayx=(atan2(acc[0],acc[1]))*180/PI;
  /*if((acc[0]!=0)&&(acc[1]!=0))
    {
      Ayx=(atan2(acc[0],acc[1]))*180/PI;
    }
    else
    {
      Ayx=t*gyro[2];
    }*/
  Ayz=(atan2(acc[1],acc[2]))*180/PI;
  
  
 //kalman filter
  calculate_xz();
  calculate_yx();
  calculate_yz();
  
  //sprintf(str, "%d,%d,%d", xz_1, xy_1, x_1);
  //Serial.print(xz);Serial.print(",");
  //Serial.print(yx);Serial.print(",");
  //Serial.print(yz);Serial.print(",");
  //sprintf(str, "%d,%d,%d,%d,%d,%d", acc[0],acc[1],acc[2],gyro[0],gyro[1],gyro[2]);
  //sprintf(str, "%d,%d,%d",gyro[0],gyro[1],gyro[2]);
    Serial.print(Axz);Serial.print(",");
    //Serial.print(Ayx);Serial.print(",");
    //Serial.print(Ayz);Serial.print(",");
  //Serial.print(str);
  //o=gyro[2];//w=acc[2];
  //Serial.print(o);Serial.print(",");
  //Serial.print(w);Serial.print(",");
  Serial.print("\n");

  
  //delay(50);
}
void calculate_xz()
{

 xz=xz+t*gyro[1];
 p_xz=p_xz+q_xz;
 k_xz=p_xz/(p_xz+r_xz);
 xz=xz+k_xz*(Axz-xz);
 p_xz=(1-k_xz)*p_xz;
}
void calculate_yx()
{
  
  yx=yx+t*gyro[2];
  p_yx=p_yx+q_yx;
  k_yx=p_yx/(p_yx+r_yx);
  yx=yx+k_yx*(Ayx-yx);
  p_yx=(1-k_yx)*p_yx;

}
void calculate_yz()
{
  yz=yz+t*gyro[0];
  p_yz=p_yz+q_yz;
  k_yz=p_yz/(p_yz+r_yz);
  yz=yz+k_yz*(Ayz-yz);
  p_yz=(1-k_yz)*p_yz;
 
}


//---------------- Functions
//Writes val to address register on ACC
void writeTo(int DEVICE, byte address, byte val) {
   Wire.beginTransmission(DEVICE); //start transmission to ACC 
   Wire.write(address);        // send register address
   Wire.write(val);        // send value to write
   Wire.endTransmission(); //end transmission
}


//reads num bytes starting from address register on ACC in to buff array
void readFrom(int DEVICE, byte address, int num, byte buff[]) {
  Wire.beginTransmission(DEVICE); //start transmission to ACC 
  Wire.write(address);        //sends address to read from
  Wire.endTransmission(); //end transmission
  
  Wire.beginTransmission(DEVICE); //start transmission to ACC
  Wire.requestFrom(DEVICE, num);    // request 6 bytes from ACC
  
  int i = 0;
  while(Wire.available())    //ACC may send less than requested (abnormal)
  { 
    buff[i] = Wire.read(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}

추천

출처blog.csdn.net/qq_41854911/article/details/132527163