Innehållsförteckning:
Video: QuickFFT: High Speed FFT för Arduino: 3 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:40
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
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:
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:
Väggfäste för iPad som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: 4 steg (med bilder)
Väggfäste för iPad Som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: På senare tid har jag ägnat ganska mycket tid åt att automatisera saker i och runt mitt hus. Jag använder Domoticz som min hemautomationsapplikation, se www.domoticz.com för mer information. I min sökning efter en instrumentpanelapplikation som visar all Domoticz -information tillsammans
High Speed Gaming Laptop: 9 steg (med bilder)
High Speed Gaming Laptop: HiFriends, Idag kommer jag att visa dig hur du gör den mest kraftfulla och snabba bärbara bärbara datorn med inbyggt Windows 10-operativsystem hemma hos dig. I den här artikeln kommer jag att ge dig all information så att du enkelt kan bygga den här hemma med
High Speed Flash -fotografering: 6 steg (med bilder)
High Speed Flash Photography: Detta är en bild av en skruvmejsel mitt i studs. Efter att ha läst om höghastighetsfotografering i en tidning blev jag inspirerad att gräva igenom min garderob och se vad jag kunde hitta på. Jag använde en hemmagjord make-screen för att utlösa blixten medan min digitala
Övertyga dig själv om att bara använda en 12V-till-AC-omriktare för LED-ljussträngar istället för att koppla om dem för 12V: 3 steg
Övertyga dig själv om att bara använda en 12V-till-AC-linjeomvandlare för LED-ljussträngar istället för att koppla om dem för 12V: Min plan var enkel. Jag ville klippa upp en väggdriven LED-ljussträng i bitar och sedan dra om den för att gå av 12 volt. Alternativet var att använda en kraftomvandlare, men vi vet alla att de är fruktansvärt ineffektiva, eller hur? Höger? Eller är de det?
High Speed Videography för nybörjare.: 6 steg (med bilder)
High Speed Videography för nybörjare .: Alla jag har träffat och pratat med delar en sak gemensamt: viljan att äga, eller åtminstone leka med, en höghastighetskamera. Även om jag tvivlar på att många av de som läser detta har en egen höghastighetskamera, är det min önskan att de få som vill