FFT su Arduino Zero

Aiuto.

Ho cercato ovunque, ma non riesco a reperire da nessuna parte una libreria FFT (fast fourier transform) che compili su Arduino Zero.

Secondo voi ho cercato poco? Oppure lo svantaggio di arduino zero è la sua completa assenza di librerie a dargli manforte?

mrektor:
Secondo voi ho cercato poco? Oppure lo svantaggio di arduino zero è la sua completa assenza di librerie a dargli manforte?

Arduino UNO e le schede basate su AVR hanno sempre fatto la parte del leone e chi doveva sviluppare si è dedicato essenzialmente ad esse percui ... la "Zero", almeno al momento, paga lo scotto della sua scarsa diffusione.

Guglielmo

P.S.: ... come tutte le altre schede della famigia che non sono basate su AVR

L'FFT è un computo prettamente matematico dove il sistema computazionale che stai adoperando incide quasi esclusivamente con le prestazioni di calcolo che puo fornire. Quello che vorrei farti capire è che un FFT fatto su un PC generico, su un MCU o su qualsiasi sistema di calcolo si esegue generalmente allo stesso modo. Quello che cambia è il metodo di acquisizione dati che varia da sistema a sistema. Una volta eseguito il campionamento con la zero, potrai processare i dati con una generico sistema di calcolo FFT scritto in CPP, su internet trovi esempi e librerie già pronte senza troppa fatica. Il problema sarà acquisire i dati in modo corretto, se sai fare quello non sarà un problema realizzare quello che vuoi.

Comunque questo prezzo lo abbiamo pagato tutti almeno una volta nella vita, per Arduino UNO trovi tutto e subito gia se vai sulla DUE tante cose vanno riscritte.

Sì Sì Roberto, ti ringrazio della risposta e comprendo le tue ragioni, mi domandavo se per caso fosse già disponibile...

L'idea di riscrivere tutto da pseudocodice mi fa pensare che ci metterò una vita...
Credo che risolverò il problema scrivendo un algoritmo più semplice che implementa un'algoritmo di autocorrelazione (voglio misurare la nota fondamentale campionata da un microfono)..

mrektor:
L'idea di riscrivere tutto da pseudocodice mi fa pensare che ci metterò una vita...

http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm

Mi pare di aver parlato di CPP non di pseudocodice. L'implementazione di un FFT non è un compito cosi arduo anche da 0.
Mi raccomando un bel filtro passa banda elettronico e/o digitale sui dati prima di dare il tutto in pasto al FFT. E mi pare quasi superfluo dire, verifica di riuscire a campionare abbastanza velocemente, in modo rigoroso e non empiricamente.

Grazie Rob,
cosa intendi per "abbastanza veloce", "empiricamente"?

Ti spiego,

Ho in mente di trovare la fondamentale in un intervallo [100Hz - 1100 Hz]

ho realizzato un passa banda (elettronico) del secondo ordine di banda [20Hz - 3300 Hz]

Ho misurato con micros() il tempo di campionamento (ovvero campione*=AnalogRead(A0); ), il risultato, sorprendente, è di 430microsecondi, che corrrisponde a una frequenza di ~2200Hz. Dico sorprendente perché la frequenza di clock del processore è di ~45 Mhz, mi aspettavo una velocità maggiore.*
Che dici? Per Nyquist in teoria dovrebbe ancora andar bene visto che è circa il doppio della frequenza massima che voglio rilevare...
O pensi che dovrei cercare di hackerare in qulache modo la velocità di campionamento? (pare si possa fare, ma bisogna scendere a codice macchina, e ciò un po' mi dissuade)
Magari con un campionamento più fitto l'algoritmo funziona bene...

Abbastanza veloce => Teorema di Nyquist. L'armonica con frequenza più alta è a fHz allora dovrò campionare a 2fHz per poter ottenere un segnale discreto "equivalente" a quello originale.
Se campioni troppo lentamente otterrai un fenomeno di aliasing che andrà a compromettere l'FFT.
Se la frequenza più alta che devi individuare è 1.1kHz allora il filtro ha poco senso averlo con una frequenza di taglio a 3.3kHz. 1.2-1.5kHz sono valori più sensati, in relazione al ordine del filtro.
Il tuo range di frequenze di interesse è 100-1100Hz puoi per esempio scegliere un filtro 50-1300Hz, la frequenza di campionamento la decidi basandoti sulla più alta frequenza che posso trovare nel mio segnale, quindi 1.3kHz, di conseguenza la minima frequenza di campionamento deve essere 2.6kHz.
Se avessi tenuto il filtro a 3.3kHz avrei dovuto campionare ad almeno 6.6kHz(valore minimo, sarebbe meglio campionare a qualcosa di più come 7.5-8kHz) anche se non ho alcun interesse legato alle frequenze superiori a 1.1kHz.
Tornando all'Arduino zero, se apriamo il datasheet del SAMD21G18 scopriamo che l'ADC può campionare ad un massimo di 350ksps (2.86us per singolo campionamento) (pag.863). Ovviamente il risultato che trovi è molto diverso, in quanto c'è da considerare il ritardo introdotto dalle librerie Arduino. Indubbiamente per fare un lavoro fatto bene è necessario lavorare direttamente sui registri del SAM.
Inoltre ricordati che non solo la velocità di campionamento è importante nella digitalizzazione di un segnale, ma anche la rigorosità degli intervalli tra i vari campionamenti.