Turinys:

„QuickFFT“: greitas „Arduino“FFT: 3 žingsniai
„QuickFFT“: greitas „Arduino“FFT: 3 žingsniai

Video: „QuickFFT“: greitas „Arduino“FFT: 3 žingsniai

Video: „QuickFFT“: greitas „Arduino“FFT: 3 žingsniai
Video: QuickFFT: High Speed FFT for Arduino 2024, Lapkritis
Anonim
„QuickFFT“: didelės spartos „Arduino“FFT
„QuickFFT“: didelės spartos „Arduino“FFT

Į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

Dirba
Dirba
Dirba
Dirba
Dirba
Dirba
Dirba
Dirba

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

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