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?
źródło
Odpowiedzi:
Filtr w twoim przykładzie jest filtrem pierwszego rzędu o nieskończonej odpowiedzi impulsowej (IIR) . Jego funkcją przesyłania jest:
co odpowiada równaniu różniczkowemu:
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.8
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ń).
źródło
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
źródło
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
Mam nadzieję, że to pomoże.
źródło