Innholdsfortegnelse:

QuickFFT: High Speed FFT for Arduino: 3 trinn
QuickFFT: High Speed FFT for Arduino: 3 trinn

Video: QuickFFT: High Speed FFT for Arduino: 3 trinn

Video: QuickFFT: High Speed FFT for Arduino: 3 trinn
Video: QuickFFT: High Speed FFT for Arduino 2024, November
Anonim
QuickFFT: High Speed FFT for Arduino
QuickFFT: High Speed FFT for Arduino

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

Jobber
Jobber
Jobber
Jobber
Jobber
Jobber
Jobber
Jobber

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:

Resultater
Resultater
Resultater
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: