비 EE 소프트웨어 API 컨텍스트의 "로우 패스 필터"


12

저는 숙련 된 소프트웨어 엔지니어이며 스마트 폰 센서 작업을하고 있습니다. DSP에서 기본 EE 수업을 받았고 내 지식을 적용하려고합니다. 나는 컨볼 루션, 전달 함수, z 변환 등을 이해한다고 생각합니다. FIR 및 IIR 필터에 대해 조금 알고 있습니다.

이제 소프트웨어 API와 문서를 읽을 때 사람들이 시간 영역의 센서 데이터에 LPF를 적용하고 있음을 알 수 있습니다. 나는 당신이 차이 방정식 (예 : y [i] = y [i-1] + 2 * x [i])을 사용하여 그렇게한다는 것을 알고 있지만, EE 클래스에서 LPF가 일반적으로 컨볼 루션 연산을 통해 적용된다는 것을 배웠습니다. 여기서 시간 신호를 사인파의 계수 (예 :)와 특정 차단 주파수로 변환합니다. 따라서 "저역 통과 필터"의 구어체 사용은 제게 정확하지 않습니다.

예를 들어 Google Android API에는 http://developer.android.com/reference/android/hardware/SensorEvent.html#values 설명서가 있습니다.

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

저역 통과 필터를 어떻게 해석합니까? 차단 주파수는 무엇입니까? 전이 대역폭은 무엇입니까? 이 LPF를 평균화하기 위해서만 사용합니까?


그것은 또한 나를 귀찮게합니다
Sibbs Gambling

답변:


11

예제의 필터는 1 차 무한 임펄스 응답 (IIR) 필터입니다. 전달 기능은 다음과 같습니다.

H(z)=1α1αz1

이는 다음과 같은 차이 방정식에 해당합니다.

y[n]=αy[n1]+(1α)x[n]

여기서 은 필터 입력이고 은 필터 출력입니다.y [ n ]x[n]y[n]

이 유형의 필터는 종종 저 복잡성 저역 통과 필터로 사용되며 종종 누수 적분기 라고합니다 . 간단한 구현, 낮은 계산 복잡성 및 조정 가능성으로 인해 선호됩니다. 차단 주파수는 값에 따라 다릅니다 . 는 간격으로 값을 취할 수 있습니다 . 은 필터링을 전혀하지 않습니다 (출력은 입력과 같습니다). 로 증가 필터의 컷오프 주파수가 감소한다. 은 차단 주파수가 무한히 낮은 경계 사례로 생각할 수 있습니다 (필터 출력이 항상 0 임).α [ 0 , 1 ) α = 0 α α = 1αα[0,1)α=0αα=1

필터 입력에 가중이 적용되어 매개 변수가 증가함에 따라 양이 감소하므로 각 입력 샘플이 특정 출력 샘플의 값에 더 작은 비례 효과를 가짐을 알면 직관적으로 이것을 생각할 수 있습니다 . 이것은 필터 임펄스 응답을 더 오랜 시간에 걸쳐 번지 게하는 효과가 있습니다. 더 긴 시간에 대한 합산은 긴 이동 평균을 계산하는 것과 유사합니다. 이동 평균의 길이가 길어질수록 평균 컷오프 주파수가 줄어 듭니다.1 - αα1α

예를 들어, 인 경우 필터의 주파수 응답은 다음과 같습니다. α=0.8여기에 이미지 설명을 입력하십시오

이 예에서,이 필터는 비교적 낮은 주파수의 관심 신호를 제거하려고 센서의 시계열 측정에서 고주파 노이즈를 부드럽게하는 데 사용됩니다. 이것은 이런 종류의 필터에 매우 일반적인 응용 프로그램입니다.

다른 하위 질문에서는 필터의 임펄스 응답과 입력 신호의 컨볼 루션을 통해 필터링이 구현되는 것이 정확합니다. 대부분의 경우 이는 유한 임펄스 응답 (FIR) 필터 로만 수행됩니다 . 이와 같은 IIR 필터는 일반적으로 필터의 차이 방정식을 사용하여 구현됩니다. IIR 시스템의 임펄스 응답이 무한히 길기 때문에 필터를 더 이상 IIR이 아닌 컨트랙트 가능하게 만들기 위해 유한 한 길이로 잘라야합니다. 차이 방정식 형식은 계산에 구현하는 데 거의 항상 비용이 적게 들지만, 구조에 내재 된 피드백으로 인해 해결해야하는 수치 문제 (예 : 내부 오버플로 및 반올림 오류 누적)가 발생할 수 있습니다.


감사! 몇 가지 후속 질문 : (1) 당신은 당신의 방정식 H (z) = ...는 차이 방정식이라고 말했다; 실제로 전송 기능입니다. 나는 차이 방정식이 시간 영역에 대한 것이라고 생각했습니다. (2) 누수 적분기에서 1.0은 sampling_frequency / 2 (Matlab과 동일)에 해당합니까? (3) FIR 대 IIR과 관련하여, IIR 차이 방정식을 O (N)에 적용 할 수 있지만 FFT 기반 컨볼 루션이있는 컨볼 루션은 O (N ^ 2) 또는 O (N lgN)라는 내 이해가 맞습니까? (4)이 DSP 아이디어를 구현하기 위해 소프트웨어 프로그래머를위한 책을 추천 할 수 있습니까? 안드로이드 코드 예제가하는 것과 같습니다.
stackoverflowuser2010

(1) 네 말이 맞아 틀렸어. 답을 수정하겠습니다. (2) 그렇습니다; X 축은 정규화 된 주파수에 있으며 로 나뉘어 1은 해당하며 이는 샘플 속도의 절반입니다. (3) 두 방법 중 하나를 사용하여 특정 샘플의 출력을 계산하는 것은 이며 여기서 은 필터 차수입니다. IIR 필터는 일반적으로 훨씬 작은 갖습니다 . (4) Lyons의 DSP 이해를 권장합니다 . 훌륭한 입문서입니다. + π O ( N ) N Nπ+πO(N)NN
Jason R

나는 (i) 차이 방정식을 적용하는 것이 O (N)이라는 것을 알고 있습니다. 그러나 (ii) 곱셈과 덧셈 (songho.ca/dsp/convolution/convolution.html)을 통한 합산을 사용한 컨볼 루션 연산은 FFT 기반 구현의 O (N ^ 2) 또는 O (N lgN)라고 생각했습니다. . 모든 경우에, N은 필터 차수입니다. 여기서 필터 차수와 시간 신호 길이가 같은 차수인 것으로 가정합니다 (예 : 256). (i)와 (ii)가 다르지 않습니까? 또한 Lyons가 Amazon.com에서 예약하는 것을 보았지만 C / Java 소프트웨어 프로그래머를 위해 더 많이 작성된 것을 기대하고있었습니다.
stackoverflowuser2010

1
단일 시간 샘플 출력을 계산하기위한 복잡성 은 차이 방정식과 함께 입니다. 입력 신호 길이도 이면 각 입력 샘플에 대한 출력 계산의 총 복잡도가 됩니다. IIR 필터에 대해 더 일반적으로 , 필터 차수 이 작기 때문에 입력 신호 길이가 훨씬 더 큰 값 이므로, 복잡도는 기록 될 수 있습니다 . 경우 보다 훨씬 작은 , 당신은 몇 가지 계산 혜택을하다가 수 있습니다. N O ( N 2 ) M N O ( M N ) M NO(N) NO(N2)MNO(MN)MN
Jason R

죽은 말을 이겨서 죄송합니다. 일반적인 차이 방정식 ( ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html )의 경우 복잡도가 실제로 이 아니므 로 N은 입력 및 출력 신호 길이입니다. M은 필터 차수입니까? 각 출력 y [i], 대한 루핑 은 O (N)이며 각 y [i]에는 O (N + M) 루프가 필요합니다. 당신이 말했듯이, N과 M의 상대 크기에 따라 결과는 또는 입니다. 내가 N O ( N 2 ) O ( N M )O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

요약하면, RC 필터와 같은 단순한 이상적인 물리적 모델을 기반으로하는 IIR 필터는 극수와 극점이 적으므로 극수 나 극점이 거의 없으므로 산술 연산이 거의 없으므로 차이 방정식으로 구현됩니다. 차이 방정식을 사용하여 샘플 당.

IIR은 무한 길이 임펄스 응답을 의미하므로 컨벌루션은 영원히 계산하거나 근사치를 사용해야합니다.

FIR 필터는 일반적으로 유한 길이 임펄스 응답과의 컨볼 루션 (또는 필터가 계산 효율이 충분할 정도로 긴 경우 FFT 빠른 컨볼 루션)에 의해 구현됩니다. 이러한 종류의 필터는 Z- 평면 극점과 영점이 어디에 있는지 알기보다는 유한 한 길이의 임펄스 응답으로 원하는 주파수 응답 사양에 근접 할 때 더 자주 사용됩니다.

그러나 예리한 사양의 필터는 긴 FIR 컨벌루션을 의미하므로 FIR 필터의 구현이 훨씬 느려질 수 있으며 설정에 더 많은 코드 줄이 포함될 수 있으므로 간단한 소프트웨어에서 FIR 필터가 자주 사용되지 않을 수 있습니다 예.


0

나는 다시이 포스트로 돌아 오는 것을 발견했다. 질문 해 주셔서 감사합니다. 다음은 C에서 누설 통합 기 (마이크로 컨트롤러 용)의 훌륭하고 계산 친화적 인 구현입니다.

먼저, 일부 재 배열 : y = α * x + (1 − α) * y_last = α * (x-y_last) + y_last

α를 약 12 ​​%, 25 %, 50 % (1/8, 1/4, 1/2, ...)로 제한하면 효율적인 비트 시프 팅을 활용할 수 있습니다. 1/8, 8 => 2 ^ 3 => (다운 시프트 3 회)의 경우

= (x-y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.