Arduino-signal-filtering-library

Buongiorno ragazzi...navigando alla ricerca di diverse modalità di filtri attivi, low pass, running average, e vari e ho trovato questa libreria per arduino in cui racchiude alcuni tipi di filtri....ho scaricato il pacchetto e leggendo la documentazione trovo alcuni argomenti della funzione in cui si puo settare la tipologia del filtro, l'ordine del filtro, avviare il filtro e la stampa del valore filtrato.....ma non riesco a trovare il settaggio per la frequenza di taglio...
Filter.begin();
Filter.setFilter('b');
Filter.setOrder(1);
filtered= Filter.run(value);

questi sono gli argomenti che mostrano anche negli esempi che si possono usare, ma niente inerente alla frequenza....

qualcuno conosce gia questa libreria o sa darmi qualche chiarimento? grazie

http://jeroendoggen.github.com/Arduino-signal-filtering-library/

hai ragione cyberhs :relaxed:

Hai dimenticato di indicare l'hyperlink della libreria!

L'argomento è sicuramente piuttosto complesso e sono richieste buone conoscenze matematiche.

Ti consiglio di leggerti l'argomento al capitolo 20 del libro "Digital Signal Processing".

Se non ho inteso male, la libreria legge l'ingresso analogico A0 e dopo un certo numero di campioni è in grado di filtrare il valore in entrata secondo il tipo di filtro scelto.

Sul libro c'è un esempio scritto in BASIC di algoritmo ricorsivo per il calcolo del fitro di Chebyshev in cui si possono scegliere vari parametri (passa basso/alto, cutoff, numero poli, percentuale di ripple, ecc.).

Presumo che la libreria si basi su questo algoritmo, ma non so dirti con precisione.

La libreria implementa dei filtri digitale molto scarsi (massimo secondo ordine con ripple elevato) viste le risorse computazionali molto limitate dell'MCU atmega328p

La frequenza di taglio del filtro (per il passa basso ad esempio) non viene specificata ma si potrebbe ricavare dai coefficienti dell'algoritmo.
Es. nel caso del filtro di Chebyshev del primo ordine c'è questo codice nella libreria:

int SignalFilter::runChebyshev(int data)
{
  if(_order==1) {                                 //ripple -3dB
    _v[0] = _v[1];
    long tmp = ((((data * 3269048L) >>  2)        //= (3.897009118e-1 * data)
      + ((_v[0] * 3701023L) >> 3)                 //+(  0.2205981765*v[0])
      )+1048576) >> 21;                           // round and downshift fixed point /2097152
    _v[1]= (int)tmp;
    return (int)(_v[0] + _v[1]);                  // 2^
  }
}

..ma è una cosa noiosa, è un problema di analisi (inverso del problema di sintesi) in quanto i valori non sono stati presi dalle tabelle standard, fai prima a chiedere all'autore con che parametri ha calcolato i coefficienti.

Ciao

ok ho capito....è come pensavo...la libreria quindi include come coefficienti delle costanti e quindi non modificabili (a meno che si modifichi il sorgente) e ciò rende la frequenza di taglio fissata da questi coefficienti e dalle formule per calcolarla..
il filtro girerebbe su arduino due, quindi non sul vecchio atmega328p,
per fare delle prove ho provato a utilizzarlo così cm lo forniscono e in effetti non noto un cambiamento nel filtraggio, poichè a me servirebbe una passo basso con frequenza di taglio di qualche hertz per eliminare le vibrazioni dei motori...

Su internet trovi dei siti dove inserendo tutti i dati.. restituiscono i coefficienti ed addirittura l'implementazione in C del filtro :smiley:

Io sono un po' all'antica ed andrei su un filtro passivo (rete RC, RL, etc..) o al limite attivo (op-amp) se vuoi anche un guadagno del segnale ma visto che usi il DUE puoi benissimo risparmiare qualcosina realizzando in sw il filtro..

In genere visto che ho già un'op-amp per condizionare il segnale ci aggiungo un condensatore ed eventualmente una resistenza e realizzo il mio filtro attivo senza impegnare la MCU

Ciao

flz47655:
Io sono un po' all'antica ed andrei su un filtro passivo (rete RC, RL, etc..) o al limite attivo (op-amp) se vuoi anche un guadagno del segnale ma visto che usi il DUE puoi benissimo risparmiare qualcosina realizzando in sw il filtro..

In genere visto che ho già un'op-amp per condizionare il segnale ci aggiungo un condensatore ed eventualmente una resistenza e realizzo il mio filtro attivo senza impegnare la MCU

Ciao

anche volendo non posso perchè la lettura la effettuo tramite i2c quindi ho già tutto in digitale..

il modo piu veloce secondo me appunto è trovare i giusti coefficienti e sostituirli nella funzione,(o meglio inserire un'altra funzione in cui modifico in real time i coefficienti per vedere il comportamento del filtro, per fare piu in fretta a settarlo) sapendo pero dove sono allocati e a quali corrispondono...
dovrei prima guardare il codice con piu attenzione...

Il filtro analogico eventualmente va naturalmente a valle dell'ADC :smiley:
Per il filtro digitale puoi partire da qui per "progettarne" uno standard (Butterworth/Bessel/Chebyshev): http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

Ciao

flz47655:
Il filtro analogico eventualmente va naturalmente a valle dell'ADC :smiley:
Per il filtro digitale puoi partire da qui per "progettarne" uno standard (Butterworth/Bessel/Chebyshev): http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

Ciao

grazie mille del link!!sara utilissimo...gli darò un'occhiata e vediamo se riesco a implementarne uno appositamente per il mio programma...