Taula de continguts:
Vídeo: QuickFFT: FFT d'alta velocitat per Arduino: 3 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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
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:
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:
Guia de configuració de VPN Premium per a la DESCÀRREGA ALTA VELOCITAT i la transmissió OKAY per REO: 10 passos
Guia de configuració de VPN Premium per a la DESCÀRREGA ALTA VELOCITAT i la transmissió OKAY per REO: Gràcies, Asuswrt-MerlinHi, sóc de Tailàndia. Vaig a escriure una guia de configuració detallada de VPN per a una descàrrega d’alta velocitat d’uns 100 Mb / s de mitjana i potser la transmissió més fluida de Netflix, Crunchyroll, Hulu, etc. Des de Tailàndia, la destinació
Ordinador portàtil per a jocs d’alta velocitat: 9 passos (amb imatges)
Ordinador portàtil per a jocs d’alta velocitat: amics, avui us mostraré com fabricar a casa vostra l’ordinador portàtil de butxaca més potent i d’alta velocitat amb sistema operatiu Windows 10 integrat. En aquest article, us donaré tota la informació perquè pugueu construir-la fàcilment a casa vostra sense
Rellotge d'alta velocitat per a vídeos en càmera lenta: 4 passos
Rellotge d’alta velocitat per a vídeos de càmera lenta: gairebé tothom que té un telèfon intel·ligent modern té una càmera d’alta velocitat que es pot utilitzar per fer vídeos de càmera lenta espectaculars. Però si voleu mesurar quant de temps triga realment a esclatar aquella bombolla de sabó o a explotar aquesta síndria, podeu
Videografia d'alta velocitat per a principiants: 6 passos (amb imatges)
Videografia d'alta velocitat per a principiants: Tothom que he conegut i he parlat per compartir una cosa en comú: el desig de posseir o, almenys, de jugar amb una càmera d'alta velocitat. Tot i que dubto que moltes de les persones que llegeixen això tinguin una càmera d'alta velocitat pròpia, desitjo que els pocs que tinguin
Reduïu els xocs dels vostres vehicles RC per a una millor manipulació a alta velocitat: 5 passos
Reduïu els amortidors dels vostres vehicles RC per millorar la vostra manipulació a gran velocitat: en aquest instructiu us mostraré com escurçar els amortidors perquè pugueu apropar el cotxe al terra perquè pugueu fer girs de velocitat més ràpids sense aletes. altres instruccions sobre com fer el manteniment dels xocs dels vostres cotxes, així que