Satura rādītājs:

QuickFFT: Ātrgaitas FFT Arduino: 3 soļi
QuickFFT: Ātrgaitas FFT Arduino: 3 soļi

Video: QuickFFT: Ātrgaitas FFT Arduino: 3 soļi

Video: QuickFFT: Ātrgaitas FFT Arduino: 3 soļi
Video: Arduino Audio Analyzer (Tutorial for Beginners, SSD1306 OLED, u8g2, Arduino UNO) 2024, Decembris
Anonim
QuickFFT: ātrgaitas FFT Arduino
QuickFFT: ātrgaitas FFT Arduino

Tipiskajam Arduino ir ierobežota RAM un apstrādes jauda, un FFT ir skaitļošanas ziņā intensīvs process. Daudzām reāllaika lietojumprogrammām vienīgā prasība ir iegūt frekvenci ar maksimālo amplitūdu vai to, kas nepieciešama frekvenču pīķu noteikšanai.

Vienā no savām pamācībām es sagatavoju FFT kodu, ko var atrast šeit: EasyFFT

Šis kods Arduino nano spēja veikt FFT līdz 128 paraugiem. Lielāks parauga skaits par šo nav iespējams, jo ir ierobežota Arduino atmiņa. Es nedaudz mainīju funkciju, lai uzlabotu ātrumu un samazinātu atmiņas patēriņu. Šī modifikācija ļauj Arduino veikt FFT piecas reizes ātrāk un patērē gandrīz pusi atmiņas. Šī pamācība neattiecas uz FFT darbu, atsauces uz to var atrast vietnē EasyFFT.

1. darbība. Darbs

Darbojas
Darbojas
Darbojas
Darbojas
Darbojas
Darbojas
Darbojas
Darbojas

Tipiskā FFT funkcija ir mainīta, lai uzlabotu ātrumu ar mazāku precizitāti. Kā parādīts attēlā, testa signāls jāreizina ar sinusa vai kosinusa viļņu formu. Šīs vērtības var būt no 0 līdz 1, tāpēc peldošas reizināšanas veikšana ir obligāta. Arduino valodā peldošā reizināšana ir lēna, salīdzinot ar vesela skaitļa operācijām.

Šajā funkcijā sinusa/kosinusa vilnis tiek aizstāts ar kvadrātveida vilni. Tā kā mums jāreizina testa signāls ar kvadrātveida vilni, kura vērtība var būt 0, 1 vai -1. Sakarā ar to peldošo reizināšanu mēs varam aizstāt ar vienkārši veselu skaitļu saskaitīšanu vai atņemšanu. Arduino vesela skaitļa saskaitīšana vai atņemšana ir aptuveni 5 reizes ātrāka. Tas ļauj atrisināt problēmu aptuveni piecas reizes ātrāk.

Sakarā ar šo modifikāciju tagad frekvenču tvertnes vērtības var saglabāt kā veselu skaitli (kas iepriekš bija peldošs), un mēs iegūstam vēl vienu priekšrocību - zemāku atmiņas patēriņu. Programmā Arduino Nano int patērē 2 baitus atmiņas, bet pludiņš - 4 baitus atmiņas. Pateicoties šai priekšrocībai jaunajā kodā, mēs varam veikt FFT gandrīz 256 paraugiem (iepriekš 128 paraugiem).

Normālā FFT mums bija jāsaglabā sinusa vērtība, lai risinājums būtu ātrāks. Jaunajā funkcijā, tā kā mums vairs nav vajadzīgas sinusa/kosinusa vērtības, mēs varam to novērst un ietaupīt nedaudz atmiņas.

Īstenošana:

Šīs funkcijas ieviešana ir vienkārša. Mēs varam vienkārši nokopēt funkciju pēc koda ens. Šo funkciju var izpildīt, izmantojot zemāk esošo komandu:

pludiņš f = Q_FFT (dati, 256, 100); Funkcijā Q_FFT, dati: šis termins ir masīvs ar signāla vērtībām, ieteicamais izlases lielums ir 2, 4, 8, 32, 64, 128, 256, 512,… un tālāk. ja izlases lielums neietilpst šajās vērtībās, tas tiks apgriezts uz tuvāko vērtību apakšējo pusi. piemēram, ja izlases lielums ir 75, tad FFT tiks veikts 64 paraugu skaitam. Maksimālo parauga lielumu ierobežo Arduino pieejamā RAM.

Otrais termins norāda paraugu skaitu masīvā, bet pēdējais - paraugu ņemšanas frekvenci Hz.

2. darbība: kods

Šajā sadaļā ir izskaidrotas EasyFFT kodā veiktās izmaiņas, kas jāpatur prātā, veicot koda izmaiņas, 1. Kā paskaidrots iepriekš, šeit FFT veikšanai tiek izmantoti veseli skaitļi. Int Arduino ir 16 bitu skaitlis, un tajā var būt vērtības no -32768 līdz 32768. ikreiz, kad šī int vērtība pārsniedz šo diapazonu, tas rada problēmu. lai novērstu šo problēmu pēc jebkāda līmeņa aprēķina. ja kāda no vērtībām pārsniedz 15000, visi masīvi tiks dalīti ar 100. tas novērsīs int pārpildi.

2. Amplitūdas aprēķins: lai aprēķinātu amplitūdu, reālā un iedomātā daļa ir jāsaliek kvadrātā, un ir nepieciešama summas kvadrātsakne. kvadrātā un funkcijas kvadrātsakne aizņem laiku. lai paātrinātu procesu, šis kods vienkārši veiks dažas no reālo un iedomāto daļu lielumiem. Tas noteikti ir mazāk precīzs un dažos gadījumos var novest pie nepareiza secinājuma. jūs varat izvēlēties atgriezties pie parastās metodes lieluma aprēķināšanai, taču tas prasīs vairāk laika, un jums arī jāveic daži pasākumi, lai saglabātu šos skaitļus.

3. Šim kodam nav moduļa vairāku pīķu noteikšanai. Tas vienkārši izvēlēsies vērtību ar maksimālo amplitūdu (izņemot pirmo skaitli, kas ir DC nobīde). Ja jums ir vajadzīgas vairākas virsotnes, šeit varat atsaukties uz EasyFFT kodu un veikt nepieciešamās izmaiņas. Tādā gadījumā arī kāds masīvs/mainīgais ir jādeklarē kā globāls mainīgais.

4. Funkcija satur šādu rindu:

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

iepriekš minēto mainīgo deklarēšana kā globāls mainīgais (ielīmējot to koda sākumā) ietaupīs 1 milisekundes laika katrā izpildē.

5. Atšķirībā no EasyFFT funkcijas, kur 5 labākās virsotnes tika saglabātas iepriekš noteiktā masīvā. Šī funkcija atgriezīs peldošo vērtību. šī vērtība attēlo frekvenci ar maksimālo amplitūdu Hz. Tātad koda attēlojums izskatīsies apmēram šādi.

pludiņš f = Q_FFT (dati, 256, 100);

6. Pīķa noteikšana: Kad frekvence ar maksimālo amplitūdu ir atrasta, šī funkcija izmanto frekvences amplitūdu tieši pirms un pēc tās, lai aprēķinātu precīzus rezultātus. Šajā aprēķinā izmantotā amplitūda ir arī moduļa summa (nevis kvadrātsakne no kvadrātu summas)

ja Fn ir frekvence ar maksimālo amplitūdu, tad frekvenci var aprēķināt pēc formulas.

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

kur An ir frekvences amplitūda un Fn-1 ir frekvences vērtība.

3. darbība. Rezultāti:

Rezultāti
Rezultāti
Rezultāti
Rezultāti

Atrisināšanas laiks ir parādīts iepriekš attēlā, salīdzinot ar EasyFFT. Tā ātrums parādīts salīdzinājumā.

Parauga datiem ir parādīti 3 sinusoidāli viļņi ar dažādu frekvenci. QuickFFT rezultātu salīdzina ar Scilab izvadi. Kā redzam attēlā, 3 pīķi ar maksimālo amplitūdu atbilst Scilab izejai. Tomēr izvadi veido liels troksnis, kas dažām lietojumprogrammām var būt maldinošs. Tāpēc pirms pieteikšanās pieteikumam ieteicams pareizi pārbaudīt kodu.

Es ceru, ka šis kods jums bija noderīgs jūsu projektam. Jautājumu vai ieteikumu gadījumā, lūdzu, komentējiet.

Ieteicams: