Go Down

Topic: processare dati real-time con FFT (Read 995 times) previous topic - next topic

Giangegnere

Introduzione una tantum

Buona sera, essendo al mio primo post, mi presento: provengo da formazione Meccanica, questo significa che l'apoteosi della mia esperienza di programmazione si manifesta in Matlab e le mie abilità in elettronica si fermano a quella di potenza (e.g. diodi grandi come scatole di scarpe e condensatori grandi come armadi :smiley-sweat:).

Il signore onnipotente di tutti noi meccanici, cioè il computer, può a volte essere troppo ingombrante per un sistema di controllo, ed ecco che mi avvicinai al mondo di Sua Eccellenza Reverendissima Arduino , poco più di un milione di miliardo di nanoGiorni fa; (quindi una ventina di giorni or sono!) tutto questo panegirico per dire che sono una gran schiappa!

Problema vero e proprio

Ho scritto (quasi) da me uno sketch che facesse da data logger su SD (sia su arduino uno + shield ethernet, che su arduino ethernet); il risultato in definitiva è che dopo 2 minuti di acquisizione da un microfono analogico, mi genera un file nella scheda sd con una colonna di numeri, che sono rappresentativi del segnale acquisito.
Per dare qualche numero:
- con un pò di fatica sono riuscito ad avere un campionamento con frequenza media di 1700 Hz  8);
- in 120 secondi di acquisizione, neanche excel riesce a ciucciarsi tutti i numeri.

Quindi, per evitare di aver fatto un registratore audio, devo riuscire a processare i dati direttamente da arduino e per fare questo ho bisogno di fare una bella FFT (non è urlata) del segnale che ho campionato!

Ho cercato in lungo e in largo sul web (giurin giurella :smiley-mr-green:) e ho trovato miriadi di librerie che mi aiutino in ciò, ma nulla di semplice, tutte le librerie che ho trovato mi impongono uno studio approfondito del loro codice per poterle utilizzare al meglio e questo potrebbe essere oneroso, temporalmente parlando, senza trascurare le mie scarse risorse informatiche, seppur accettabili matematiche.

Quello di cui avrei bisogno è proprio una libreria semplice, che non implica troppa conoscenza informatica (il che dovrebbe essere il fine di Mons. Arduino), un esempio è la funzione fft(array) di Matlab, che io utilizzo spesso, anche unitamente ad arduino (grazie alle fonti fornite dalla Mathworks). è molto semplice da utilizzare perchè, dato un generico array, è possibile effettuarne la fast fourier semplicemente scrivendo la parolina magica fft(array) e lui mi genera un altro vettore contenente il segnale nel dominio della frequenza.

Le librerie che ho trovato e testato sono molto fumose (absit iniuria verbo), nel senso che devono essere settate al meglio per farle funzionare, e io purtroppo no so proprio come muovermi in mezzo alla programmazione avanzata (si parva licet componere magnis). Inoltre devo processare un array che non si trova nella SRAM di arduino, perchè troppo grande, bensì in un file che si chiama RUMORE.txt e si trova nella SD; non credo che Arduino riesca a caricarlo in SRAM, visto che 2 minuti di acquisizione sono ben mezzo MB! La processazione è piuttosto semplice una volta ottenuto l'array della FFT, conti da terza media! L'unico osso duro è Fourier!

In definitiva
Qualcuno di voi sa darmi qualche consiglio su cosa utilizzare per far si che il mio dispositivo sia embedded (come va di moda dire ultimamente) e che entri perfettamente nella scatolina di arduino uno + shield ethernet(e quindi senza un computer in comunicazione seriale\ethernet\wifi)  $)? secondo voi è possibile utilizzare arduino da solo, oppure ha bisogno dello Zio Matlab in POSTprocessazione? =(

spero di essere stato esaustivo e poco ampolloso (o complicato)

Best regards

g
Best regards
G

Giangegnere

Già il valore massimo della trasformata sarebbe ottimo, poi se a fianco potessi vedere la frequenza corrispondente, allora sarebbe davvero il top! $)
Best regards
G

m_ri

qual è lo scopo dela FFT nel tuo? trovare "l'intervallo" di frequenze con maggiore ampiezza?e quante frequenze discrete vuoi calcolare?

Giangegnere

Peto veniam, sarò più preciso. ;)



  • Parto da un segnale (audio nel mio caso) e scelgo di processarlo con la trasformata di fourier piuttosto che costruire una PDF.




  • Trasformo secondo Fourier ed entro nel dominio della frequenza ottenendo Ampiezza (non è necessario per me che sia in scala logaritmica [dB] in quanto successivamente andrò a normalizzarla con un parametro che ho già calcolato a parte[quindi va bene anche il range 0-1023 dell' ADC]);




  • Ottenuta la trasformata della funzione devo individuare alcuni parametri chiave per il mio studio, come ad esempio:
                                       

                                         
    • ampiezza massima del picco [Amax];

    •                                    
    • intervallo di frequenza in cui il picco si distacca dal trend di base[delta f];

    •                                    
    • frequenza in cui ho il massimo dell'ampiezza [f Amax];

    •                                    





  • Fare uno storage molto elementare di questi tre parametri per poterci giocare successivamente, come ad esempio:

Code: [Select]
int Amax = blablabla;
int deltaf = blublublu;
int fAmax =blobloblo;





Vi allego una figura che ho appena pietosamente disegnato con Paint  :smiley-sad-blue:
Best regards
G

flz47655

#4
Sep 10, 2013, 02:00 pm Last Edit: Sep 10, 2013, 02:14 pm by flz47655 Reason: 1
Un segnale audio lo vuoi campionare a 1.7 KHz? Direi assolutamente che non ci siamo.

Se vuoi fare qualcosa di decente devi campionarlo a 44.1 KHz con un filtro anti-aliasing prima dell'ADC
Se ti vuoi accontentare della qualità telefonica puoi anche campionarlo ad 8 KHz ma serve sempre un filtro anti-aliasing.

Arduino non ha ne ADC ne memoria ne frequenza sufficiente per questo genere di cose se vuoi farle bene.
Anche il filtro anti-aliasing devi farlo bene se vuoi prestazioni, sicuramente non un filtro RC.

Oltre al campionamento per elaborare in tempo reale la FFT ti serve un micro potente, meglio se specializzato come ad esempio un DSP (es. dsPIC o ancora meglio dei SIGMADSP) o ancora meglio una FPGA se vuoi puntare a frequenze di campionamento elevate anche oltre l'audio udibile, ma servono competenze elevatissime e non lo fai in pochi mesi se parti da zero o ancora peggio copiando codice qua e la

Ti consiglio un netbook o un mini-pc se vuoi fare qualcosa in tempi brevi

Ciao

flz47655

Con un PC con Matlab ed una scheda audio decente otterrai ottimi risultati nella banda audio, completamente diversi dal chip giocattolino che va bene per gadget che ti rendono contento se si vede qualcosa sullo schermo, non adatto sicuramente per studi scientifici o ricerche ben fatte, avresti solamente dati fuorvianti ;)

@Giangegnere: Consiglio, lascia l'hw agli ingegneri dell'informazione e orientati su soluzioni più chiavi in mano per problemi di questa complessità

Giangegnere

Comprendo chiaramente, essendone già al corrente nel mio subinconscio, dei limiti del giocattolino. L'idea era proprio ottenere un prodotto "chiaviinmano" piccolo e semplice, che attaccato alla pila D avrebbe fatto il suo lavoro senza doversi avviare come un vero pc.

@flz47655

Quote
Un segnale audio lo vuoi campionare a 1.7 KHz? Direi assolutamente che non ci siamo


Ci siamo, se il segnale che devo campionare ha una banda passante che mi interessa che va da zero a cento Hz e quindi a 1700 Hz sarei già in oversampling, con arduino tirato per le orecchie ;)..?   o non ci sono ancora? :~

Quote
Oltre al campionamento per elaborare in tempo reale la FFT ti serve un micro potente, meglio se specializzato come ad esempio un DSP (es. dsPIC o ancora meglio dei SIGMADSP) o ancora meglio una FPGA se vuoi puntare a frequenze di campionamento elevate anche oltre l'audio udibile, ma servono competenze elevatissime e non lo fai in pochi mesi se parti da zero o ancora peggio copiando codice qua e la


ho dato già un occhiata a queste cose, ma sono decisamente fuori dalla mia portata; ecco perché mi ero avvicinato ad Arduino, che già è per me come un dio dell'olimpo.

Quote
Ti consiglio un netbook o un mini-pc se vuoi fare qualcosa in tempi brevi


lo so, infatti era quello che avevo in mente inizialmente: mini-pc interamente a memoria solida(scalda poco), scheda di acquisizione NI e Labview, per la modica... ecc ecc

Quote
Consiglio, lascia l'hw agli ingegneri dell'informazione e orientati su soluzioni più chiavi in mano per problemi di questa complessità


povero Arduino! me lo avete distrutto  =(


@ lock
Quote
Con questo approccio potresti calcolare i tuoi parametri in ogni "era" e salvare solo questa informazione da qualche parte, eventualmente su SD.


questa è una buona idea, a cui avevo già pensato(nel senso di lavorare con pattern finiti di campionamento).

Quote
Peccato perche' Sparkfun produce una shield


direbbe il dott. Sheldon Cooper:"SARCASMO? :smiley-roll-blue:"
la shield non potrebbe aiutarmi in qualche modo secondo voi? ora me la spulcio un pò!
Best regards
G

flz47655

Quote
Ci siamo, se il segnale che devo campionare ha una banda passante che mi interessa che va da zero a cento Hz e quindi a 1700 Hz sarei già in oversampling, con arduino tirato per le orecchie ;)..?   o non ci sono ancora? :~


Ma che segnale audio è.. è una banda sub-audio più che l'intero spettro audio. I microfoni difficilmente hanno grande sensibilità a queste frequenze però, ricordati di controllare il datasheet. Se ti interessa 0-100 Hz allora 1.7KHz va molto bene e anche la FFT riesci a farla con Arduino se hai fortuna, il filtro passa basso decente però ti serve comunque.

Ciao

Giangegnere



Ma che segnale audio è.. è una banda sub-audio più che l'intero spettro audio.


Si, diciamo che male che mi va arrivo a 600 Hz, e con Visual analyzer ho buttato dentro all'analog 0 con un jack spellato, bypassando il microfono, una sinusoide a 600 Hz e l'ha campionata alla grande  :% l'ho plottata su excel e veniva perfettamente!



I microfoni difficilmente hanno grande sensibilità a queste frequenze però, ricordati di controllare il datasheet. 


ho saldato due jumperini ad un orecchio di pipistrello!!  :smiley-fat: 8)



il filtro passa basso decente però ti serve comunque.


abbasso i filtri passa basso! :0

Best regards
G

flz47655

Quote
ho saldato due jumperini ad un orecchio di pipistrello!!

Non l'avevo mai sentita questa  XD

Una sinusoide ha 600 Hz non ha bisogno di un filtro passa basso se campioni a 1.7KHz, se hai un segnale con componenti armoniche a frequenze più elevate (es. un segnale onda quadra che quindi ha infinite armoniche o comunque se hai in mezzo disturbi a frequenze maggiori) l'utilità si fa sentire, puoi fare le simulazioni con Matlab per vedere come cambia la situazione con filtri di ordine diverso


Giangegnere

Great!

grazie mille per le dritte! ;)
Best regards
G

Go Up