Taula de continguts:

QuickFFT: FFT d'alta velocitat per Arduino: 3 passos
QuickFFT: FFT d'alta velocitat per Arduino: 3 passos

Vídeo: QuickFFT: FFT d'alta velocitat per Arduino: 3 passos

Vídeo: QuickFFT: FFT d'alta velocitat per Arduino: 3 passos
Vídeo: EasyFFT: быстрое преобразование Фурье (БПФ) для Arduino 2024, Desembre
Anonim
QuickFFT: FFT d'alta velocitat per Arduino
QuickFFT: FFT d'alta velocitat per Arduino

El típic Arduino té poca memòria RAM i potència de processament, i el FFT és un procés computacionalment intensiu. Per a moltes aplicacions en temps real, l’únic requisit és obtenir freqüència amb amplitud màxima o requerida per detectar pics de freqüència.

En una de les meves instruccions, he preparat un codi per a FFT que es pot trobar aquí: EasyFFT

Aquest codi va poder realitzar FFT de fins a 128 mostres a Arduino nano. No és possible un nombre de mostra superior a aquest a causa de la memòria limitada d'Arduino. He modificat una mica la funció per millorar la velocitat i reduir el consum de memòria. Aquesta modificació permet a Arduino realitzar FFT cinc vegades més ràpid i consumeix gairebé la meitat de memòria. Aquesta instrucció no cobreix el funcionament de FFT, les referències es poden trobar a EasyFFT.

Pas 1: treballar

Treball
Treball
Treball
Treball
Treball
Treball
Treball
Treball

La típica funció FFT es modifica per millorar la velocitat amb una precisió menor. Com es mostra a la imatge, un senyal de prova ha de multiplicar-se per formes d'ona sinus o cosinus. Aquests valors poden estar entre 0 i 1, de manera que és imprescindible fer una multiplicació flotant. a Arduino, la multiplicació flotant és lenta en comparació amb les operacions senceres.

En aquesta funció, l’ona sinusoïdal / cosinus es reemplaça per una ona quadrada. Com que hem de multiplicar un senyal de prova per una ona quadrada que pot tenir valor 0, 1 o -1. A causa d'això, podem substituir la multiplicació flotant per simplement sumar o restar enter. Per a Arduino, la suma o resta d'un nombre enter és al voltant de 5 vegades més ràpida. Això fa que la resolució sigui 5 vegades més ràpida.

Gràcies a aquesta modificació, ara els valors de les safates de freqüència es poden emmagatzemar com a enter (que anteriorment era flotant) i obtenim un altre avantatge de reduir el consum de memòria. A Arduino Nano, int consumeix 2 bytes de memòria mentre que el float consumeix 4 bytes de memòria. A causa d’aquest avantatge del nou codi, podem realitzar FFT per a gairebé 256 mostres (anteriorment 128 mostres).

A FFT normal necessitàvem emmagatzemar el valor sinusoïdal per fer una solució més ràpida. En la nova funció, ja que ja no necessitem valors sinusoïdal / cosinus, podem eliminar-lo i estalviar una mica de memòria.

Implementació:

Implementar aquesta funció és senzill. Simplement podem copiar la funció al codi ens. Aquesta funció es pot executar mitjançant l'ordre següent:

float f = Q_FFT (dades, 256, 100); a la funció Q_FFT, dades: aquest terme és una matriu amb valors de senyal, la mida recomanada de la mostra és de 2, 4, 8, 32, 64, 128, 256, 512, … en endavant. si la mida de la mostra no pertany a aquests valors, es retallarà al costat inferior més proper dels valors. per exemple, si la mida de la mostra és de 75, es realitzarà FFT per a 64 números de mostres. El nombre màxim de mides de mostra està limitat per la RAM disponible a Arduino.

El segon terme especifica el nombre de mostres d’una matriu i l’últim terme és la freqüència de mostreig en Hz.

Pas 2: Codi

En aquesta secció s’explica la modificació feta al codi EasyFFT que s’ha de tenir present mentre es fa la modificació del codi, 1. Com s'ha explicat abans, aquí s'utilitzen enters per fer FFT. Int a Arduino és un número de 16 bits i pot contenir valors des de -32768 fins a 32768. sempre que el valor d’aquest int excedeixi aquest rang, provoca el problema. per eliminar aquest problema després del càlcul del nivell. si algun dels valors supera els 15.000 arrays complets es dividirà per 100. això evitarà que la int desbordi.

2. Càlcul de l'amplitud: per calcular l'amplitud, la part real i la part imaginària s'han de quadrar i cal l'arrel quadrada de la suma. el quadrat i l’arrel quadrada de la funció prenen temps. per fer el procés més ràpid, aquest codi simplement farà algunes de les magnituds de parts reals i imaginàries. Segurament, això és menys precís i, en alguns casos, pot portar a una conclusió equivocada. podeu optar per tornar al mètode Normal per al càlcul de la magnitud, però trigarà més temps i també haureu de fer algunes disposicions per emmagatzemar aquests números.

3. Aquest codi no té cap mòdul per a la detecció de pics múltiples. Simplement escollirà el valor amb amplitud màxima (excloent el primer nombre que és desplaçament continu). Si necessiteu diversos pics, podeu consultar el codi EasyFFT i fer la modificació necessària aquí. En aquest cas, també cal declarar alguna matriu / variable com a variable global.

4. La funció conté la línia següent:

unsigned int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

declarar les variables anteriors com a variable global (enganxar-les al començament del codi) estalviarà en algun lloc 1 mil·lisegon de temps en cada execució.

5. A diferència de la funció EasyFFT, on els cinc pics principals s’emmagatzemaven a la matriu predefinida. Aquesta funció retornarà un valor flotant. aquest valor representa la freqüència amb amplitud màxima en Hz. Per tant, la representació del codi tindrà un aspecte semblant.

float f = Q_FFT (dades, 256, 100);

6. Detecció de pics: un cop es troba la freqüència amb amplitud màxima, aquesta funció utilitza una amplitud de freqüència just abans i després per calcular els resultats precisos. L’amplitud utilitzada en aquest càlcul també és la suma del mòdul (no l’arrel quadrada de la suma dels quadrats)

si Fn és la freqüència amb amplitud màxima, la freqüència es pot calcular a partir de la fórmula inferior.

F real (A n-1 * Fn-1 + An-1 * Fn-1 + An-1 * Fn-1) / (An-1 + An + An + 1)

on An és amplitud de n la freqüència i Fn-1 és el valor de freqüència.

Pas 3: Resultats:

Resultats
Resultats
Resultats
Resultats

El temps de resolució es mostra a la comparació de la imatge anterior amb EasyFFT. Velocitat de la mateixa que es mostra amb la comparació.

Per a dades de mostra es mostren 3 ones sinusoïdals amb freqüències diferents. El resultat de QuickFFT es compara amb la sortida Scilab. Com podem veure a la imatge, 3 pics amb amplitud màxima coincideixen amb la sortida Scilab. No obstant això, la sortida consta de molt soroll, que pot ser enganyós per a algunes aplicacions. Per tant, es recomana comprovar correctament el codi abans de presentar-se a la vostra sol·licitud.

Espero que aquest codi us sigui útil per al vostre projecte. En cas de tenir alguna consulta o suggeriment, feu un comentari.

Recomanat: