Innholdsfortegnelse:
Video: QuickFFT: High Speed FFT for Arduino: 3 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:21
Typisk Arduino har begrenset RAM og prosessorkraft, og FFT er en beregningsintensiv prosess. For mange sanntidsapplikasjoner er det eneste kravet å få frekvens med maksimal amplitude eller nødvendig for å oppdage frekvenstopper.
I en av mine instrukser utarbeidet jeg en kode for FFT som du finner her: EasyFFT
Denne koden var i stand til å utføre FFT på opptil 128 prøver på Arduino nano. Et høyere utvalgstall enn dette er ikke mulig på grunn av det begrensede minnet til Arduino. Jeg har endret funksjonen litt for å forbedre hastigheten og redusere minneforbruket. Denne modifikasjonen gjør at Arduino kan utføre FFT fem ganger raskere og bruker nesten halvparten minne. Denne instruksen dekker ikke Working of FFT, referanser til den finner du på EasyFFT.
Trinn 1: Arbeid
Den typiske FFT -funksjonen er modifisert for å forbedre hastigheten med mindre nøyaktighet. Som vist på bildet må et testsignal multipliseres med sinus- eller cosinusbølgeformer. Disse verdiene kan være mellom 0 og 1, så det er et must å gjøre flytende multiplikasjon. i Arduino er flytende multiplikasjon langsom sammenlignet med heltalloperasjoner.
I denne funksjonen blir sinus/cosinusbølgen erstattet av en firkantbølge. Ettersom vi må multiplisere et testsignal med en firkantbølge som kan ha verdi 0, 1 eller -1. På grunn av det kan vi erstatte flytende multiplikasjon til heltallstilsetning eller subtraksjon. For Arduino er heltall addisjon eller subtraksjon rundt 5 ganger raskere. Dette gjør løsningen rundt 5 ganger raskere.
På grunn av denne modifikasjonen kan nå frekvensboksverdier lagres som et heltall (som tidligere var flytende), og vi får en annen fordel med lavere minneforbruk. I Arduino Nano bruker int 2 byte minne mens float bruker 4 byte minne. På grunn av denne fordelen i den nye koden, er vi i stand til å utføre FFT for nesten 256 prøver (tidligere 128 prøver).
I Normal FFT trengte vi å lagre sinusverdien for å gjøre en løsning raskere. I ny funksjon, ettersom vi ikke lenger trenger sine/cosinus -verdier, kan vi eliminere den og spare litt minne.
Gjennomføring:
Det er enkelt å implementere denne funksjonen. Vi kan ganske enkelt kopiere funksjonen i koden. Denne funksjonen kan utføres ved å bruke kommandoen nedenfor:
float f = Q_FFT (data, 256, 100); I funksjon Q_FFT, data: dette begrepet er en matrise med signalverdier, den anbefalte prøvestørrelsen er 2, 4, 8, 32, 64, 128, 256, 512, … og videre. Hvis prøvestørrelsen ikke tilhører disse verdiene, klippes den til den nærmeste undersiden av verdiene. for eksempel hvis prøvestørrelsen er 75 enn FFT vil det bli utført for 64 antall prøver. Maks antall prøvestørrelser er begrenset av tilgjengelig RAM på Arduino.
Det andre uttrykket angir antall prøver i en matrise og det siste uttrykket er samplingsfrekvens i Hz.
Trinn 2: Kode
Denne delen forklarer endringen i EasyFFT -koden som må tas i betraktning mens du gjør endringer i koden, 1. Som forklart før, brukes heltall her for å gjøre FFT. Int in Arduino er et 16 -bits tall og kan inneholde verdier fra -32768 til 32768. Når verdien av denne int overstiger dette området, forårsaker det problemet. å eliminere dette problemet etter nivåberegning. hvis noen av verdien overstiger 15000 komplette matriser vil bli delt med 100. dette vil forhindre int til å flyte over.
2. Amplitudeberegning: For å beregne amplitude må den virkelige og imaginære delen kvadreres og kvadratroten til summen kreves. kvadrat og kvadratroten til funksjonen tar tid. For å gjøre prosessen raskere, vil denne koden ganske enkelt gjøre noen av størrelsene på virkelige og imaginære deler. Dette er sikkert mindre nøyaktig og kan føre til feil konklusjon i noen tilfeller. du kan velge å gå tilbake til Normal -metoden for størrelsesberegning, men det vil ta mer tid, og du må også gjøre noe for å lagre disse tallene.
3. Denne koden har ikke en modul for deteksjon av flere spisser. Det vil ganske enkelt velge verdien med maks amplitude (unntatt det første tallet som er DC -forskyvning). Hvis du trenger flere topper, kan du referere EasyFFT -koden og gjøre nødvendige endringer her. I så fall må en matrise/variabel også deklareres som en global variabel.
4. Funksjonen inneholder følgende linje:
usignert int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
å erklære de ovennevnte variablene som en global variabel (lime den inn ved begynnelsen av koden) vil spare et sted 1 millisekunder tid ved hver kjøring.
5. I motsetning til EasyFFT -funksjonen, der de fem toppene ble lagret i den forhåndsdefinerte matrisen. Denne funksjonen returnerer en flyteverdi. denne verdien representerer frekvensen med maksimal amplitude i Hz. Så representasjonen av koden vil se omtrent slik ut.
float f = Q_FFT (data, 256, 100);
6. Peak Detection: Når frekvens med maks amplitude er funnet, bruker denne funksjonen en amplitude av frekvens like før og etter den for å beregne de nøyaktige resultatene. Amplituden som brukes i denne beregningen er også summen av modul (ikke kvadratroten av summen av kvadrater)
hvis Fn er frekvensen med maks amplitude, kan frekvensen beregnes ut fra formelen nedenfor.
Faktisk F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
hvor An er amplituden til n frekvensen og Fn-1 er frekvensverdien.
Trinn 3: Resultater:
Løsningstid er vist i bildesammenligningen ovenfor med EasyFFT. Hastigheten på den vist med sammenligningen.
For eksempeldata vises 3 sinusformede bølger med forskjellige frekvenser. Resultatet fra QuickFFT sammenlignes med Scilab -utgang. Som vi kan se på bildet, matcher 3 topper med maks amplitude med Scilab -utgang. Utgangen består imidlertid av mye støy, noe som kan være misvisende for noen applikasjoner. Så det anbefales å sjekke koden skikkelig før du søker på søknaden din.
Jeg håper du fant denne koden nyttig for prosjektet ditt. Hvis du har spørsmål eller forslag, vennligst kommenter.
Anbefalt:
Arduino FFT Visualizer med adresserbare lysdioder: 4 trinn
Arduino FFT Visualizer med adresserbare lysdioder: Denne opplæringen vil forklare hvordan du bygger en lydvisualizer med en Arduino Uno og noen adresserbare lysdioder. Dette er et prosjekt jeg har hatt lyst til å gjøre en stund nå fordi jeg er en suger på lydreaktive lys. Disse lysene bruker FFT (Fast Fou
EasyFFT: Fast Fourier Transform (FFT) for Arduino: 6 trinn
EasyFFT: Fast Fourier Transform (FFT) for Arduino: Måling av frekvens fra det fangede signalet kan være en vanskelig oppgave, spesielt på Arduino ettersom den har lavere beregningseffekt. Det er metoder tilgjengelig for å fange nullkryssing hvor frekvensen blir fanget ved å sjekke hvor mange ganger
VPN Premium Setup Guide for HIGH SPEED DOWNLOAD og OKAY Streaming av REO: 10 trinn
VPN Premium Setup Guide for HIGH SPEED DOWNLOAD og OKAY Streaming av REO: Takk, Asuswrt-MerlinHi, jeg er fra Thailand. Jeg kommer til å skrive en detaljert oppsettguide for VPN for en høyhastighets nedlasting rundt 100 Mb/s i gjennomsnitt og kanskje den jevneste streaming for Netflix, Crunchyroll, Hulu, etc. Fra Thailand, destinasjonen
High Speed Gaming Laptop: 9 trinn (med bilder)
High Speed Gaming Laptop: HiFriends, I dag vil jeg vise deg hvordan du lager den mest kraftfulle og høyhastighets bærbare datamaskinen i lommestørrelse med innebygd Windows 10-operativsystem hjemme. I denne artikkelen vil jeg gi deg all informasjon slik at du enkelt kan bygge dette hjemme
High Speed Flash -fotografering: 6 trinn (med bilder)
High Speed Flash Photography: Dette er et bilde av en skrutrekker midt i sprett. Etter å ha lest om høyhastighetsfotografering i et blad ble jeg inspirert til å grave gjennom skapet mitt og se hva jeg kunne finne på. Jeg brukte en hjemmelaget make-screen for å utløse blitsen mens min digitale