“Filtro passa-basso” in contesti API software non EE


12

Sono un ingegnere informatico esperto e sto lavorando su sensori per smartphone. Ho seguito lezioni EE fondamentali in DSP e sto cercando di applicare le mie conoscenze. Credo di comprendere la convoluzione, le funzioni di trasferimento, la trasformazione z, ecc. Conosco un po 'i filtri FIR e IIR.

Ora, quando leggo le API del software e la documentazione, vedo che le persone stanno applicando un LPF ai dati del sensore nel dominio del tempo. So che lo fai attraverso l'uso di equazioni alle differenze (ad es. Y [i] = y [i-1] + 2 * x [i]), ma ho imparato nella mia classe EE che LPF viene in genere applicato attraverso l'operazione di convoluzione dove si comprende il segnale orario con i coefficienti di un'onda sinc (per esempio) e con una frequenza di taglio specifica. Quindi l'uso colloquiale del "filtro passa-basso" non è abbastanza esatto per me.

Ad esempio, l'API di Google Android ha questa documentazione: 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];
 }

Come posso interpretare quel filtro passa-basso? Qual è la frequenza di taglio? Qual è la larghezza di banda di transizione? Stanno usando questo LPF solo per fare la media?


bene mi dà fastidio anche
Sibbs Gambling

Risposte:


11

Il filtro nel tuo esempio è un filtro di risposta agli impulsi infiniti (IIR) del primo ordine . La sua funzione di trasferimento è:

H(z)=1α1αz1

che corrisponde a un'equazione di differenza di:

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

dove è l'ingresso del filtro e y [ n ] è l'uscita del filtro.x[n]y[n]

αα[0,1)α=0αα=1

α1α

α=0.8inserisci qui la descrizione dell'immagine

Dall'esempio, immagino che questo filtro venga utilizzato per attenuare il rumore ad alta frequenza da una serie temporale di misurazioni da un sensore, cercando di stuzzicare un segnale di interesse relativamente a bassa frequenza. Questa sarebbe un'applicazione molto tipica per questo tipo di filtro.

Sull'altra tua domanda secondaria, hai ragione nel dire che il filtro viene spesso implementato attraverso la convoluzione del segnale di ingresso con la risposta all'impulso del filtro. Nella maggior parte dei casi, ciò viene fatto solo con filtri FIR (impulse response) . I filtri IIR come questo sono tipicamente implementati usando l'equazione della differenza del filtro; poiché la risposta all'impulso di un sistema IIR è infinitamente lunga, è necessario troncarla a una lunghezza finita per rendere tracciabile la sua convoluzione, a quel punto il filtro non è più IIR. Il formato dell'equazione della differenza è quasi sempre più economico da implementare a livello computazionale, sebbene il feedback inerente a quella struttura possa portare a problemi numerici che devono essere affrontati (come overflow interno e accumulo di errori di arrotondamento).


Grazie! Alcune domande di follow-up: (1) Hai detto che la tua equazione H (z) = ... è un'equazione di differenza; è davvero una funzione di trasferimento, giusto? Pensavo che un'equazione di differenza fosse strettamente per il dominio del tempo. (2) Nel tuo integratore che perde, 1.0 corrisponde a sampling_frequency / 2 (come in Matlab)? (3) Per quanto riguarda FIR vs IIR, ho capito bene che l'equazione della differenza IIR può essere applicata in O (N) ma la convoluzione è O (N ^ 2) o O (N lgN) con convoluzione basata su FFT? (4) Puoi consigliare un libro ai programmatori di software per implementare queste idee DSP? Come quello che sta facendo l'esempio di codice Android.
stackoverflowuser2010 del

π+πO(N)NN

So che (i) l'applicazione dell'equazione della differenza è O (N). Ma ho pensato che (ii) l'operazione di convoluzione usando la somma su moltiplica e aggiungi (songho.ca/dsp/convolution/convolution.html) è O (N ^ 2) o O (N lgN) con un'implementazione basata su FFT . In tutti i casi, N è l'ordine del filtro - dove suppongo che l'ordine del filtro e la lunghezza del segnale temporale siano dello stesso ordine di grandezza (ad es. Entrambi 256). Quindi (i) e (ii) non sono diversi? Inoltre, ho visto quel libro di Lyons su Amazon.com, ma speravo in qualcosa di più scritto per i programmatori di software C / Java.
stackoverflowuser2010 del

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

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

2

Riassumendo, i filtri IIR basati su semplici modelli fisici idealizzati, come un filtro RC, hanno un piccolo numero di poli e zeri e quindi sono solitamente implementati come equazione di differenza, poiché un piccolo numero di poli o zeri implica pochissime operazioni aritmetiche per campione usando un'equazione di differenza.

Poiché un IIR implica una risposta all'impulso di lunghezza infinita, la convoluzione richiederebbe per sempre il calcolo o l'uso di un'approssimazione.

I filtri FIR sono di solito implementati per convoluzione con la risposta all'impulso di lunghezza finita (o per convoluzione rapida FFT se il filtro è abbastanza lungo da essere efficiente dal punto di vista computazionale). Questi tipi di filtri sono usati più spesso quando si può approssimare una specifica di risposta in frequenza desiderata con una risposta all'impulso di lunghezza finita, piuttosto che sapere dove potrebbero trovarsi i poli e gli zeri del piano Z.

Tuttavia, poiché un filtro con specifiche precise implica una lunga convoluzione FIR, l'implementazione dei filtri FIR può essere molto più lenta e l'installazione può comportare molte più righe di codice, motivo per cui i filtri FIR potrebbero non essere utilizzati così spesso nel software semplice esempi.


0

Mi ritrovo a tornare a questo post più e più volte. Grazie per aver posto la domanda. Ecco una grande implementazione computazionalmente amichevole dell'integratore che perde in C (destinato a un microcontrollore).

Innanzitutto, alcuni riarrangiamenti: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

se limitiamo α a circa il 12%, 25%, 50%, (1/8, 1/4, 1/2, ...). Possiamo trarre vantaggio da alcuni efficienti spostamenti di bit. Prendendo il caso di 1/8, 8 => 2 ^ 3 => (Maiusc 3 volte)

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

Spero che sia d'aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.