Innehållsförteckning:

QuickFFT: High Speed FFT för Arduino: 3 steg
QuickFFT: High Speed FFT för Arduino: 3 steg

Video: QuickFFT: High Speed FFT för Arduino: 3 steg

Video: QuickFFT: High Speed FFT för Arduino: 3 steg
Video: Signal Processing for 3D Media - Atanas Gotchev 2024, November
Anonim
QuickFFT: High Speed FFT för Arduino
QuickFFT: High Speed FFT för Arduino

Typisk Arduino har begränsat RAM och processorkraft, och FFT är en beräkningskrävande process. För många realtidsapplikationer är det enda kravet att få frekvens med maximal amplitud eller krävs för att detektera frekvenstoppar.

I en av mina instruerbara förberedde jag en kod för FFT som finns här: EasyFFT

Denna kod kunde utföra FFT på upp till 128 prover på Arduino nano. Ett högre provnummer än detta är inte möjligt på grund av det begränsade minnet hos Arduino. Jag har ändrat funktionen lite för att förbättra hastigheten och minska minnesförbrukningen. Denna modifiering gör att Arduino kan utföra FFT fem gånger snabbare och förbrukar nästan hälften minne. Denna instruktion täcker inte Working of FFT, referenser till den finns på EasyFFT.

Steg 1: Arbeta

Arbetssätt
Arbetssätt
Arbetssätt
Arbetssätt
Arbetssätt
Arbetssätt
Arbetssätt
Arbetssätt

Den typiska FFT -funktionen är modifierad för att förbättra hastigheten med mindre noggrannhet. Som visas på bilden måste en testsignal multipliceras med sinus- eller cosinusvågformer. Dessa värden kan vara mellan 0 och 1, så att göra flytande multiplikation är ett måste. i Arduino är flytande multiplikation långsam jämfört med heltal.

I denna funktion ersätts sinus/cosinusvågan med en fyrkantvåg. Eftersom vi måste multiplicera en testsignal med en kvadratisk våg som kan ha värdet 0, 1 eller -1. På grund av det kan vi ersätta flytande multiplikation till heltalsaddering eller subtraktion. För Arduino är heltal addition eller subtraktion cirka 5 gånger snabbare. Detta gör att lösa cirka 5 gånger snabbare.

På grund av denna modifiering kan nu frekvensfackvärden lagras som ett heltal (som tidigare var flytande) och vi får ytterligare en fördel med lägre minnesförbrukning. I Arduino Nano förbrukar int 2 byte minne medan float förbrukar 4 byte minne. På grund av denna fördel i den nya koden kan vi utföra FFT för nästan 256 prover (tidigare 128 prover).

I Normal FFT behövde vi lagra sinusvärdet för att göra en lösning snabbare. I ny funktion, eftersom vi inte längre kräver sinus/cosinus -värden kan vi eliminera det och spara lite minne.

Genomförande:

Att implementera denna funktion är rakt fram. Vi kan helt enkelt kopiera funktionen vid kodens kod. Denna funktion kan utföras med kommandot nedan:

float f = Q_FFT (data, 256, 100); I funktion Q_FFT,

data: denna term är en array med signalvärden, den rekommenderade samplingsstorleken är 2, 4, 8, 32, 64, 128, 256, 512, … och framåt. om provstorleken inte tillhör dessa värden klipps den till närmaste undersida av värdena. till exempel om provstorleken är 75 än FFT kommer att utföras för 64 antal prover. Max antal provstorlekar begränsas av tillgängligt RAM -minne på Arduino.

Den andra termen anger antalet sampel i en array och den sista termen är samplingsfrekvens i Hz.

Steg 2: Kod

Detta avsnitt förklarar den ändring som gjorts i EasyFFT -koden som måste beaktas när du ändrar koden, 1. Som förklarats tidigare används här heltal för att göra FFT. Int i Arduino är ett 16 -bitars tal och kan innehålla värden från -32768 till 32768. när värdet av denna int överskrider detta intervall orsakar det problemet. för att eliminera detta problem efter någonsin nivåberäkning. om något av värdet överstiger 15000 kompletta matriser kommer att divideras med 100. detta kommer att förhindra int att flyta över.

2. Amplitudberäkning: För att beräkna amplituden måste den verkliga och imaginära delen kvadreras och kvadratroten av summan krävs. kvadrat och kvadratroten i funktionen tar tid. För att göra processen snabbare kommer denna kod helt enkelt att göra några av storleken på verkliga och inbillade delar. Detta är säkert mindre korrekt och kan i vissa fall leda till fel slutsats. du kan välja att återgå till metoden Normal för storleksberäkning men det tar mer tid och du måste också göra något för att lagra dessa nummer.

3. Denna kod har ingen modul för detektering av flera toppar. Det väljer helt enkelt värdet med maxamplitud (exklusive det första numret som är DC -offset). Om du behöver flera toppar kan du hänvisa till EasyFFT -koden och göra nödvändiga ändringar här. I så fall måste också någon array/variabel deklareras som en global variabel.

4. Funktionen innehåller följande rad:

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

att deklarera ovanstående variabler som en global variabel (klistra in den i början av koden) kommer att spara någonstans 1 millisekund tid vid varje körning.

5. Till skillnad från EasyFFT -funktionen, där de fem bästa topparna lagrades i den fördefinierade matrisen. Denna funktion returnerar ett flottörvärde. detta värde representerar frekvensen med maximal amplitud i Hz. Så representationen av koden kommer att se ut ungefär så här.

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

6. Peak Detection: När frekvens med maximal amplitud hittats använder denna funktion en amplitud av frekvens strax före och efter den för att beräkna de exakta resultaten. Amplituden som används i denna beräkning är också summan av modul (inte kvadratroten av summan av kvadrater)

om Fn är frekvensen med maxamplitud kan frekvensen beräknas från nedanstående formel.

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

där An är amplituden för n är frekvensen och Fn-1 är frekvensvärdet.

Steg 3: Resultat:

Resultat
Resultat
Resultat
Resultat

Lösningstid visas i bildjämförelsen ovan med EasyFFT. Hastigheten visas med jämförelsen.

För provdata med 3 sinusformade vågor med olika frekvenser visas. Resultatet från QuickFFT jämförs med Scilab -utdata. Som vi kan se på bilden matchar 3 toppar med maximal amplitud med Scilab -utgång. Utmatningen består dock av mycket buller, vilket kan vara vilseledande för vissa applikationer. Så det rekommenderas att kontrollera koden ordentligt innan du ansöker om din ansökan.

Jag hoppas att du fann den här koden användbar för ditt projekt. Kommentera vid frågor eller förslag.

Rekommenderad: