Ciao a tutti,
Ho letto con entusiasmo queste pagine https://www.electroyou.it/vis_resource. ... orso&id=61
e vorrei provare a fare un po' di pratica e realizzare un codice c per arduino che implementi un filtro fir passabanda. Questo filtro lo vorrei applicare al segnale ricevuto da un sensore di movimento PIR e campionato con l'adc a circa 5kHz.
Dalla spiegazione letta capisco che ci sia da ottimizzare tutta una serie di parametri tra cui il numero di coefficienti del filtro per poi riuscire a realizzarlo veramente su un microcontrollore come arduino.
Sarebbe fattibile realizzare un filtro passabdnda con frequenza centrale 10Hz e larghezza di banda 5-15Hz?
Oppure sono numeri irrealizabili con qualche decina di coefficienti del filtro?
Filtro digitale passabanda da realizzare su microcontrollore
Moderatori: g.schgor, BrunoValente, carloc, IsidoroKZ
21 messaggi
• Pagina 1 di 3 • 1, 2, 3
0
voti
Sarebbe fattibile realizzare un filtro passabanda con frequenza centrale 10Hz e larghezza di banda 5 Hz?
Se fosse un filtro del secondo ordine analogico avrebbe
un Q = F0/B = 2 quindi molto basso, sarebbe facile da realizzare. Dovrebbe esserlo anche in digitale.
Per definire l'ordine, dovresti specificare l'attenuazione al di fuori della frequenza rifiutata.
0
voti
Diciamo che vorrei fare qualche prova e non ho specifiche date da progettazione.
Partirei con un filtro con almeno 20 db di attenuazione fuori banda
MarcoD hai qualche suggerimento o tool online da fornirmi per andare avanti?
Partirei con un filtro con almeno 20 db di attenuazione fuori banda
MarcoD hai qualche suggerimento o tool online da fornirmi per andare avanti?
0
voti
Fra dentro la banda e fuori la banda la funzione di trasferimento è continua.
Purtroppo sono capace ( e male) solo di progettare filtri IIR del primo e del secondo ordine (Infinite Impulse Response). Non ho mai avuto la necessità di filtri di ordine superiore.
: Non ha senso, se non definisci a partire da quale frequenza vuoi l'attenuazione.Partirei con un filtro con almeno 20 db di attenuazione fuori banda
Purtroppo sono capace ( e male) solo di progettare filtri IIR del primo e del secondo ordine (Infinite Impulse Response). Non ho mai avuto la necessità di filtri di ordine superiore.
0
voti
Per sintetizzare il filtro non ci dovrebbero essere grossi problemi, ma la difficoltà che ci vedo è la velocità dell'elaborazione: non so quale Arduino usi ma per questo tipo di cose la moltiplicazione software è generalmente un disastro dal punto di vista delle prestazioni.
Di solito i dispositivi più adatti a questo scopo (DSP o ASIC dedicati) implementano nativamente delle unità di MAC (Multiply And Accumulate) per ottimizzare queste operazioni; con i microcontrollori si può fare lo stesso a patto di sacrificare un certo numero di campioni. Forse è meglio passare direttamente a un IIR.
Per progettare filtri puoi utilizzare MATLAB o FilterSolutions (creato da Nuhertz, oggi acquisito da Ansys) che però sono a pagamento, mentre un'alternativa gratis è Octave (simile a MATLAB).
Di solito i dispositivi più adatti a questo scopo (DSP o ASIC dedicati) implementano nativamente delle unità di MAC (Multiply And Accumulate) per ottimizzare queste operazioni; con i microcontrollori si può fare lo stesso a patto di sacrificare un certo numero di campioni. Forse è meglio passare direttamente a un IIR.
Per progettare filtri puoi utilizzare MATLAB o FilterSolutions (creato da Nuhertz, oggi acquisito da Ansys) che però sono a pagamento, mentre un'alternativa gratis è Octave (simile a MATLAB).
1
voti
Ogni quanto ti serve un nuovo campione?
Perche' se la banda utile e' fino a 15Hz stai campionando a 5kHz (un filtro analogico Anti Aliasing prima dell'ADC ti serve in ogni caso. A questo punto converrebbe tagliare a 50Hz e campionare a 150Hz circa, e' inutile spremere l'ADC e salvare tanti campioni velocissimi se poi il segnale utile e' lento).
Per il resto in digitale la "difficolta'" di un filtro FIR dipende dal rapporto delle frequenze di taglio e la frequenza di campionamento. Quindi se devi per esempio tagliare 15Hz campionando a 30Hz e' un conto (tagli 0.5 banda), ma se devi tagliare a 15Hz campionando a 5kHz e' molto piu' difficile (fomdanemtalmente piu' taps e piu' latenza).
Per farti una idea prova a giocare con questo calcolatore: https://fiiir.com/ e prendi un passabasso. Con frequenza di taglio 15Hz e banda di transizione 5Hz se campioni a 100Hz escono 96 taps, se campioni a 5kHz escono 461 campioni.
461 moltiplicazioni, shift, salvataggio dati ecc, arduino deve farlo ogni 200us. Ce la fa? Serve davvero?
Se campioni a 100Hz arduino dovra' fare solo un centinaio di moltipliche in 10ms e ci dovrebbe stare comodissimo.
Se non ti serve una caratteristica di fase lineare e se puoi usare aritmetica floating point converrebbe un filtro IIR invece che FIR. Pero' devi essere sicuro che il tuo processore abbia la FLU (floating point unit) altrimenti provare a fargli fare tante moltiplicazioni con la virgola diventa un bagno di sangue.
Un saluto e buona sperimentazione!
Perche' se la banda utile e' fino a 15Hz stai campionando a 5kHz (un filtro analogico Anti Aliasing prima dell'ADC ti serve in ogni caso. A questo punto converrebbe tagliare a 50Hz e campionare a 150Hz circa, e' inutile spremere l'ADC e salvare tanti campioni velocissimi se poi il segnale utile e' lento).
Per il resto in digitale la "difficolta'" di un filtro FIR dipende dal rapporto delle frequenze di taglio e la frequenza di campionamento. Quindi se devi per esempio tagliare 15Hz campionando a 30Hz e' un conto (tagli 0.5 banda), ma se devi tagliare a 15Hz campionando a 5kHz e' molto piu' difficile (fomdanemtalmente piu' taps e piu' latenza).
Per farti una idea prova a giocare con questo calcolatore: https://fiiir.com/ e prendi un passabasso. Con frequenza di taglio 15Hz e banda di transizione 5Hz se campioni a 100Hz escono 96 taps, se campioni a 5kHz escono 461 campioni.
461 moltiplicazioni, shift, salvataggio dati ecc, arduino deve farlo ogni 200us. Ce la fa? Serve davvero?
Se campioni a 100Hz arduino dovra' fare solo un centinaio di moltipliche in 10ms e ci dovrebbe stare comodissimo.
Se non ti serve una caratteristica di fase lineare e se puoi usare aritmetica floating point converrebbe un filtro IIR invece che FIR. Pero' devi essere sicuro che il tuo processore abbia la FLU (floating point unit) altrimenti provare a fargli fare tante moltiplicazioni con la virgola diventa un bagno di sangue.
Un saluto e buona sperimentazione!
1
voti
Piccolo addendum: un consiglio spassionato che mi sento di darti e' simula tutto prima.
Molto prima di mettere le mani su arduino simula l'algoritmo con un linguaggio a tua scelta, Octave e' simile a matlab ed e' open source, oppure Python o SciLab o quello che vuoi. Ma devi sapere apriori che impatto ha il filtro, la quantizzazione, quante operazioni ti servono e avere una bozza di codice... A volte e' una scocciatura e sembra farti perdere tempo, ma fidati che la quantita' di tempo usato nel simulare algoritmo e filtro e' 10 volte minore di quello che impegheresti senza.
A differenza dell'analogica in cui le simulazioni sono pericolose e i modelli sono imprecisi, nel digitale si tratta di numeri "ideali" quindi una volta scritto l'algoritmo che giri su MALTAB o su Arduino o su STM32 e' identico. Ne vale la pena
Molto prima di mettere le mani su arduino simula l'algoritmo con un linguaggio a tua scelta, Octave e' simile a matlab ed e' open source, oppure Python o SciLab o quello che vuoi. Ma devi sapere apriori che impatto ha il filtro, la quantizzazione, quante operazioni ti servono e avere una bozza di codice... A volte e' una scocciatura e sembra farti perdere tempo, ma fidati che la quantita' di tempo usato nel simulare algoritmo e filtro e' 10 volte minore di quello che impegheresti senza.
A differenza dell'analogica in cui le simulazioni sono pericolose e i modelli sono imprecisi, nel digitale si tratta di numeri "ideali" quindi una volta scritto l'algoritmo che giri su MALTAB o su Arduino o su STM32 e' identico. Ne vale la pena
0
voti
Ciao Dadduni,
come suggerito sto facendo delle prove iniziali con il tool online https://fiiir.com/
Considerato che sul microcontrollore non avrò aritmetica floating point ma ad interi dovrò ragionare un attimo sulla quantizzazione.
Adesso ho un filtro con 100 taps (campionando a 100 Hz come dicevi tu). I coefficienti del filtro mi vengono forniti in virgola mobile e sono di questo ordine di grandezza: ad esempio un coefficiente piccolo è 8.392333984375000e-04 ....uno dei più grandi 0.208938598632813
Dovrò riportare tutti i coefficienti ad una rappresentazione ad interi. Pensi che interi a 16 bit possano bastare? Meglio a 32?
Auspicandomi che questo post possa essere di aiuto anche ad altri principianti di filtri digitali (come me) ti chiederei se puoi aiutarmi aancora un po' per fare qualche passo in avanti guidato da qualcuno di più esperto
come suggerito sto facendo delle prove iniziali con il tool online https://fiiir.com/
Considerato che sul microcontrollore non avrò aritmetica floating point ma ad interi dovrò ragionare un attimo sulla quantizzazione.
Adesso ho un filtro con 100 taps (campionando a 100 Hz come dicevi tu). I coefficienti del filtro mi vengono forniti in virgola mobile e sono di questo ordine di grandezza: ad esempio un coefficiente piccolo è 8.392333984375000e-04 ....uno dei più grandi 0.208938598632813
Dovrò riportare tutti i coefficienti ad una rappresentazione ad interi. Pensi che interi a 16 bit possano bastare? Meglio a 32?
Auspicandomi che questo post possa essere di aiuto anche ad altri principianti di filtri digitali (come me) ti chiederei se puoi aiutarmi aancora un po' per fare qualche passo in avanti guidato da qualcuno di più esperto
0
voti
Dovrò riportare tutti i coefficienti ad una rappresentazione ad interi. Pensi che interi a 16 bit possano bastare? Meglio a 32?
Probabilmente 16 bit bastano:
campo numerico da -32768 a + 32767.
ma dipende dai requisiti:
Che convertitore A/D adoperi?.
Quello di arduino? 10 bit ? da -512 a +511
Che convertitore D/A ? Arduino 8 bit ?
Che "rumore" numerico tolleri in uscita?
Inizia supponendo un campo numerico in ingresso di +/- 1000.
E un segnale di ingresso fra i 2 e i 50 Hz, di cui vuoi un filtro centrato su 10 Hz.
Supponi di campionare a 100 Hz
Limita i taps a 8 o 16 per iniziare.
Come pensi di simulare/generare matematicamente un segnale di ingresso sinusoidale di frequenza variabile
nel campo 2-50 Hz ?
21 messaggi
• Pagina 1 di 3 • 1, 2, 3
Chi c’è in linea
Visitano il forum: Nessuno e 81 ospiti