„Filtr dolnoprzepustowy” w kontekstach API oprogramowania innych niż EE


12

Jestem doświadczonym inżynierem oprogramowania i pracuję nad czujnikami smartfonów. Chodziłem na podstawowe zajęcia EE z DSP i staram się wykorzystać swoją wiedzę. Wierzę, że rozumiem splot, funkcje przenoszenia, transformację Z itp. Wiem trochę o filtrach FIR i IIR.

Teraz, czytając API i dokumentację oprogramowania, widzę, że ludzie stosują LPF do czujników danych w dziedzinie czasu. Wiem, że robisz to za pomocą równań różnicowych (np. Y [i] = y [i-1] + 2 * x [i]), ale nauczyłem się w mojej klasie EE, że LPF są zwykle stosowane poprzez operację splotu gdzie zwołujesz sygnał czasowy ze współczynnikami fali cynkowej (na przykład) i określoną częstotliwością odcięcia. Dlatego potoczne użycie „filtra dolnoprzepustowego” nie jest dla mnie wystarczająco dokładne.

Na przykład interfejs API Google Android ma tę dokumentację: 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];
 }

Jak interpretować ten filtr dolnoprzepustowy? Jaka jest częstotliwość odcięcia? Jaka jest przepustowość przejścia? Czy używają tego LPF wyłącznie do uśredniania?


dobrze, że mi też przeszkadza
hazard w Sibbs

Odpowiedzi:


11

Filtr w twoim przykładzie jest filtrem pierwszego rzędu o nieskończonej odpowiedzi impulsowej (IIR) . Jego funkcją przesyłania jest:

H(z)=1α1αz1

co odpowiada równaniu różniczkowemu:

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

gdzie to wejście filtra, a to wyjście filtra.y [ n ]x[n]y[n]

Ten typ filtra jest często używany jako filtr dolnoprzepustowy o niskiej złożoności i jest często nazywany nieszczelnym integratorem . Jest uprzywilejowany ze względu na prostą implementację, niską złożoność obliczeniową i łatwość dostrajania: częstotliwość odcięcia zależy od wartości . może przyjmować wartości w przedziale . nie powoduje żadnego filtrowania (wynik jest równy wejściowi); wraz ze wzrostem maleje częstotliwość odcięcia filtra. Możesz myśleć o jako przypadku granicznym, w którym częstotliwość odcięcia jest nieskończenie niska (moc wyjściowa filtra wynosi zero przez cały czas).α [ 0 , 1 ) α = 0 α α = 1αα[0,1)α=0αα=1

Możesz o tym myśleć intuicyjnie, zauważając, że wejściowy filtr jest ważony przez , więc gdy parametr rośnie, ilość maleje, więc każda próbka wejściowa ma mniejszy proporcjonalny wpływ na wartość dowolnej konkretnej próbki wyjściowej. To powoduje rozmazanie odpowiedzi impulsowej filtra przez dłuższy okres czasu. Sumowanie w dłuższym okresie czasu jest podobne do obliczania długiej średniej kroczącej. Wraz ze wzrostem długości średniej ruchomej częstotliwość odcięcia średniej maleje.1 - αα1α

Na przykład, gdzie , odpowiedź częstotliwościowa filtra jest następująca: α=0.8wprowadź opis zdjęcia tutaj

Na podstawie tego przykładu zgaduję, że ten filtr jest używany do wygładzania szumów o wysokiej częstotliwości z serii czasowych pomiarów z czujnika, próbując wydobyć interesujący sygnał o stosunkowo niskiej częstotliwości. Byłaby to bardzo typowa aplikacja dla tego rodzaju filtrów.

W drugim pytaniu masz rację, że filtrowanie jest często realizowane przez splot sygnału wejściowego z odpowiedzią impulsową filtra. W większości przypadków odbywa się to tylko przy użyciu filtrów o skończonej odpowiedzi impulsowej (FIR) . Filtry IIR, takie jak ten, są zwykle realizowane za pomocą równania różnicy filtra; ponieważ odpowiedź impulsowa systemu IIR jest nieskończenie długa, należy go skrócić do pewnej skończonej długości, aby konwergencja z nim była możliwa do wykonania, w którym to momencie filtr nie jest już IIR. Format równania różnicowego jest prawie zawsze tańszy w implementacji obliczeniowej, chociaż sprzężenie zwrotne właściwe dla tej struktury może prowadzić do problemów numerycznych, które należy rozwiązać (takich jak wewnętrzne przepełnienie i akumulacja błędów zaokrągleń).


Dzięki! Kilka dalszych pytań: (1) Powiedziałeś, że twoje równanie H (z) = ... jest równaniem różnicy; to naprawdę funkcja transferu, prawda? Myślałem, że równanie różnicy dotyczy wyłącznie dziedziny czasu. (2) Czy w twoim nieszczelnym integratorze 1.0 odpowiada próbkowaniu_częstotliwości / 2 (jak w Matlabie)? (3) Jeśli chodzi o FIR vs IIR, czy moje rozumowanie jest poprawne, że równanie różnicowe IIR może być zastosowane w O (N), ale splot jest O (N ^ 2) lub O (N lgN) z splotem opartym na FFT? (4) Czy możesz polecić książkę dla programistów, aby wdrożyć te pomysły DSP? Podobnie jak to robi przykład kodu Androida.
stackoverflowuser2010

π+πO(N)NN

Wiem, że (i) zastosowanie równania różnicy to O (N). Pomyślałem jednak, że (ii) operacja splotu z użyciem sumowania przez mnożenie i dodawanie (songho.ca/dsp/convolution/convolution.html) to O (N ^ 2) lub O (N lgN) z implementacją opartą na FFT . We wszystkich przypadkach N jest kolejnością filtrów - gdzie zakładam, że kolejność filtrów i długość sygnału czasowego są tego samego rzędu wielkości (np. Oba 256). Czy zatem (i) i (ii) nie są różne? Widziałem też książkę Lyons na Amazon.com, ale liczyłem na coś napisanego więcej dla programistów C / Java.
stackoverflowuser2010

1
O(N) NO(N2)MNO(MN)MN
Jason R

O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

Podsumowując, filtry IIR oparte na prostych wyidealizowanych modelach fizycznych, takich jak filtr RC, mają małą liczbę biegunów i zer, a zatem są zwykle implementowane jako równanie różnicy, ponieważ niewielka liczba biegunów lub zer oznacza bardzo mało operacji arytmetycznych na próbkę za pomocą równania różnicy.

Ponieważ IIR implikuje odpowiedź impulsową o nieskończonej długości, splot wymagałby zawsze obliczenia lub zastosowania przybliżenia.

Filtry FIR są zwykle implementowane przez splot z odpowiedzią impulsową o skończonej długości (lub przez szybką splot FFT, jeśli filtr jest wystarczająco długi, aby był wydajny obliczeniowo). Tego rodzaju filtry są częściej używane, gdy można aproksymować pożądaną charakterystykę odpowiedzi częstotliwościowej za pomocą odpowiedzi impulsowej o skończonej długości, zamiast wiedzieć, gdzie mogą znajdować się bieguny i zera płaszczyzny Z.

Ponieważ jednak filtr z ostrą specyfikacją implikuje długi splot FIR, implementacja filtrów FIR może być znacznie wolniejsza, a konfiguracja może obejmować o wiele więcej wierszy kodu, co może być przyczyną, dla której filtry FIR mogą nie być tak często używane w prostym oprogramowaniu przykłady


0

Ciągle wracam do tego postu. Dziękuję za pytanie. Oto świetna, przyjazna obliczeniowo implementacja nieszczelnego integratora w C (przeznaczona dla mikrokontrolera).

Po pierwsze, niektóre przegrupowania: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

jeśli ograniczymy α do około 12%, 25%, 50% ((1/8, 1/4, 1/2, ...). Możemy skorzystać z wydajnej zmiany bitów. Biorąc przypadek 1/8, 8 => 2 ^ 3 => (redukcja 3 razy)

= (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;
}

Mam nadzieję, że to pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.