Turinys:
Video: „QuickFFT“: greitas „Arduino“FFT: 3 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:45
Įprastas „Arduino“turi ribotą RAM ir apdorojimo galią, o FFT yra daug skaičiavimų reikalaujantis procesas. Daugeliui realaus laiko programų vienintelis reikalavimas yra gauti maksimalios amplitudės dažnį arba reikiamą dažnių viršūnėms aptikti.
Viename iš mano nurodymų paruošiau FFT kodą, kurį galite rasti čia: „EasyFFT“
Šis kodas „Arduino nano“galėjo atlikti iki 128 mėginių FFT. Didesnis mėginių skaičius nei šis neįmanomas dėl ribotos „Arduino“atminties. Aš šiek tiek pakeičiau funkciją, kad pagerinčiau greitį ir sumažintumėte atminties suvartojimą. Šis pakeitimas leidžia „Arduino“atlikti FFT penkis kartus greičiau ir sunaudoja beveik pusę atminties. Ši instrukcija neapima FFT darbo, nuorodos į jį rasite „EasyFFT“.
1 žingsnis: darbas
Įprasta FFT funkcija yra modifikuota, kad būtų sumažintas greitis mažesniu tikslumu. Kaip parodyta paveikslėlyje, bandymo signalas turi būti padaugintas iš sinuso ar kosinuso bangų. Šios vertės gali būti nuo 0 iki 1, todėl būtina atlikti slankųjį dauginimą. „Arduino“, plūduriuojantis dauginimas yra lėtas, palyginti su sveikųjų skaičių operacijomis.
Naudojant šią funkciją sinusinė/kosinusinė banga pakeičiama kvadratine banga. Mes turime padauginti bandymo signalą su kvadratine banga, kurios vertė gali būti 0, 1 arba -1. Dėl to mes galime pakeisti plūduriuojantį daugybą tiesiog sveikojo skaičiaus pridėjimu arba atėmimu. „Arduino“sveikųjų skaičių pridėjimas arba atėmimas yra maždaug 5 kartus greitesnis. Tai leidžia išspręsti problemą maždaug 5 kartus greičiau.
Dėl šios modifikacijos dabar dažnių dėžės reikšmės gali būti saugomos kaip sveikasis skaičius (kuris anksčiau buvo plūduriuojantis) ir mes gauname dar vieną mažesnės atminties sąnaudų pranašumą. „Arduino Nano“sistemoje „int“sunaudoja 2 baitus atminties, o „float“- 4 baitus atminties. Dėl šio naujo kodo pranašumo mes galime atlikti FFT beveik 256 mėginiams (anksčiau 128 mėginiams).
Įprastoje FFT mums reikėjo išsaugoti sinuso vertę, kad sprendimas būtų greitesnis. Naudodami naują funkciją, kai nebereikia sinuso/kosinuso reikšmių, galime ją pašalinti ir išsaugoti šiek tiek atminties.
Įgyvendinimas:
Šios funkcijos įgyvendinimas yra tiesioginis. Mes galime tiesiog nukopijuoti funkciją kodo ens. Šią funkciją galima atlikti naudojant žemiau pateiktą komandą:
plūdė f = Q_FFT (duomenys, 256, 100); Funkcijoje Q_FFT, duomenys: šis terminas yra masyvas, turintis signalo reikšmes, rekomenduojamas imties dydis yra 2, 4, 8, 32, 64, 128, 256, 512,… ir vėliau. jei imties dydis nepriklauso šioms vertėms, jis bus nukirptas iki artimiausios apatinės reikšmių pusės. Pavyzdžiui, jei imties dydis yra 75, FFT bus atliekamas 64 mėginių skaičiams. Maksimalų mėginio dydį riboja „Arduino“turima RAM.
Antrasis terminas nurodo mėginių skaičių masyve, o paskutinis - mėginių ėmimo dažnis Hz.
2 žingsnis: kodas
Šiame skyriuje paaiškinta „EasyFFT“kodo modifikacija, kurią reikia atsiminti atliekant kodo pakeitimus, 1. Kaip paaiškinta anksčiau, čia FFT atlikti naudojami sveikieji skaičiai. „Int“„Arduino“yra 16 bitų skaičius ir gali turėti reikšmių nuo -32768 iki 32768. kai šio int vertė viršija šį diapazoną, tai sukelia problemą. kad išspręstumėte šią problemą atlikus bet kokį lygio apskaičiavimą. jei kuri nors iš reikšmių viršija 15000, visi masyvai bus padalyti iš 100. tai neleis int perpildyti.
2. Amplitudės apskaičiavimas: Norint apskaičiuoti amplitudę, reikia surašyti tikrąją ir įsivaizduojamąją dalį kvadratu ir nurodyti sumos kvadratinę šaknį. kvadratas ir funkcijos kvadratinė šaknis užima laiko. kad procesas būtų greitesnis, šis kodas paprasčiausiai atliks kai kurias realių ir įsivaizduojamų dalių apimtis. Tai tikrai ne toks tikslus ir kai kuriais atvejais gali padaryti klaidingą išvadą. galite pasirinkti grįžti prie įprasto didumo skaičiavimo metodo, tačiau tai užtruks daugiau laiko, taip pat turite atlikti tam tikrus veiksmus, kad išsaugotumėte šiuos skaičius.
3. Šis kodas neturi modulio, skirto daugkartiniam smailių aptikimui. Jis tiesiog pasirinks vertę su maksimalia amplitudė (išskyrus pirmąjį skaičių, kuris yra DC poslinkis). Jei jums reikia kelių smailių, galite nurodyti „EasyFFT“kodą ir atlikti reikiamus pakeitimus čia. Tokiu atveju kai kuriuos masyvus/kintamuosius taip pat reikia deklaruoti kaip visuotinius kintamuosius.
4. Funkcijoje yra ši eilutė:
unsigned int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
paskelbus aukščiau nurodytus kintamuosius kaip visuotinį kintamąjį (įklijuojant jį kodo pradžioje) bus sutaupyta 1 milisekundė kiekvieno vykdymo laiko.
5. Skirtingai nuo EasyFFT funkcijos, kur 5 geriausios smailės buvo saugomos iš anksto nustatytame masyve. Ši funkcija grąžins kintamąją vertę. ši reikšmė reiškia dažnį, kurio didžiausia amplitudė yra Hz. Taigi kodo atvaizdavimas atrodys maždaug taip.
plūdė f = Q_FFT (duomenys, 256, 100);
6. Piko aptikimas: radus maksimalios amplitudės dažnį, ši funkcija naudoja dažnio amplitudę prieš ir po jo, kad apskaičiuotų tikslius rezultatus. Šiame skaičiavime naudojama amplitudė taip pat yra modulio suma (o ne kvadratų sumos kvadratinė šaknis)
jei Fn yra dažnis su maksimalia amplitudė, tada dažnį galima apskaičiuoti pagal žemiau pateiktą formulę.
Faktinis F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
kur An yra dažnio amplitudė, o Fn-1 yra dažnio vertė.
3 žingsnis: Rezultatai:
Sprendimo laikas parodytas aukščiau pateiktame vaizdo palyginime su „EasyFFT“. Jo greitis parodytas lyginant.
Pateikiami pavyzdiniai duomenys, turintys 3 skirtingo dažnio sinusines bangas. „QuickFFT“rezultatas lyginamas su „Scilab“išvestimi. Kaip matome paveikslėlyje, 3 smailės, kurių maksimali amplitudė atitinka „Scilab“išvestį. Tačiau išvestį sudaro daug triukšmo, kuris kai kurioms programoms gali būti klaidinantis. Todėl prieš kreipiantis į programą patariama tinkamai patikrinti kodą.
Tikiuosi, kad šis kodas buvo naudingas jūsų projektui. Jei turite klausimų ar pasiūlymų, prašome komentuoti.
Rekomenduojamas:
Greitas perjungiklis iki 50 USD! „Kazeshifter Arduino“reguliuojamas greitas perjungiklis: 7 žingsniai
Greitas perjungiklis iki 50 USD! „Kazeshifter Arduino“reguliuojamas greitas perjungiklis: Sveiki, „Superbike“ar motociklų mylėtojai! Pagal šią pamoką pasidalinsiu, kaip pigiai pasigaminti savo greitąjį perjungiklį! Žmonėms, kurie tingisi skaityti šią instrukciją, tiesiog žiūrėkite mano vaizdo įrašą! Pastaba: kai kuriems dviračiams kai jau naudojate degalų įpurškimo sistemą
Lengvai sukurkite savo valdiklius - greitas BPM skaitiklis: 6 žingsniai
Lengvai sukurkite savo valdiklius - greitas BPM skaitiklis: žiniatinklio programos yra įprasta vieta, tačiau žiniatinklio programos, kurioms nereikia prieigos prie interneto, nėra. Šiame straipsnyje aš jums parodysiu, kaip sukūriau BPM skaitiklį paprastame HTML puslapyje ir vanilės javascript ( Pažiūrėk čia). Jei atsisiunčiama, šį valdiklį galima naudoti neprisijungus
PCB adapterio nulaužimas - greitas ir patogus :): 5 žingsniai
PCB adapterio įsilaužimas - greitas ir patogus :): Sveiki, „e -Earthlings“! Būtinybė yra išradingumo motina. Šis mažas triukas yra vienas iš tų išradimų: DI norėjo sukurti vienos grandinės, kurioje buvo vienas SMD, prototipą
Greitas „Arduino“dėklas: 3 žingsniai (su nuotraukomis)
Greitas „Arduino“dėklas: tai trumpas pamokymas apie protingą mažą „Arduino“dėklo idėją, kurią galite padaryti iš tuščios varžto dėžutės
Greitas, greitas, pigus, gerai atrodantis LED kambario apšvietimas (visiems): 5 žingsniai (su nuotraukomis)
Greitas, greitas, pigus, gerai atrodantis LED kambario apšvietimas (visiems): Sveiki visi :-) Tai yra mano pirmasis pamokomas dalykas, todėl laukiame komentarų :-) Ką tikiuosi jums parodyti, kaip greitai sukurti LED apšvietimą TINY buget. Ko jums reikia: KabelisLEDsResistoriai (510Ohms 12V) StapelsLituoklis Pjaustytuvai ir kiti pagrindai