Sadržaj:

QuickFFT: Brzi FFT za Arduino: 3 koraka
QuickFFT: Brzi FFT za Arduino: 3 koraka

Video: QuickFFT: Brzi FFT za Arduino: 3 koraka

Video: QuickFFT: Brzi FFT za Arduino: 3 koraka
Video: Marioo - Tomorrow ( Official Music Video) 2024, Lipanj
Anonim
QuickFFT: Brzi FFT za Arduino
QuickFFT: Brzi FFT za Arduino

Tipični Arduino ima ograničenu RAM i procesorsku snagu, a FFT je proces koji je zahtjevan za računanje. Za mnoge aplikacije u stvarnom vremenu jedini je zahtjev dobiti frekvenciju s maksimalnom amplitudom ili je potrebno otkriti vršne frekvencije.

U jednom od mojih instrukcija pripremio sam kod za FFT koji se može pronaći ovdje: EasyFFT

Ovaj je kod mogao izvesti FFT do 128 uzoraka na Arduino nano. Veći broj uzorka od ovoga nije moguć zbog ograničene memorije Arduina. Malo sam izmijenio funkciju kako bih poboljšao brzinu i smanjio potrošnju memorije. Ova izmjena omogućuje Arduinu da izvede FFT pet puta brže i troši gotovo polovicu memorije. Ovaj Instructable ne pokriva rad FFT -a, reference za njega mogu se pronaći na EasyFFT -u.

Korak 1: Rad

Radni
Radni
Radni
Radni
Radni
Radni
Radni
Radni

Tipična funkcija FFT modificirana je radi poboljšanja brzine s manjom točnošću. Kao što je prikazano na slici, testni signal treba pomnožiti s sinusnim ili kosinusnim valnim oblikom. Ove vrijednosti mogu biti između 0 do 1, pa je potrebno napraviti plutajuće množenje. u Arduinu je plutajuće množenje sporo u usporedbi s operacijama s cijelim brojevima.

U ovoj funkciji val sinus/kosinus zamjenjuje se kvadratnim valom. Kako moramo testni signal umnožiti kvadratnim valom koji može imati vrijednost 0, 1 ili -1. Zbog toga plutajuće množenje možemo zamijeniti jednostavno cjelobrojnim zbrajanjem ili oduzimanjem. Za Arduino je zbrajanje ili oduzimanje cijeli broj oko 5 puta brže. Time je rješavanje oko 5 puta brže.

Zbog ove izmjene sada se vrijednosti spremišta frekvencija mogu pohraniti kao cijeli broj (koji je prethodno bio u plutajućem obliku) i dobivamo još jednu prednost manje potrošnje memorije. U Arduino Nano, int troši 2 bajta memorije, dok float troši 4 bajta memorije. Zbog te prednosti u novom kodu, u mogućnosti smo izvesti FFT za gotovo 256 uzoraka (prethodno 128 uzoraka).

U normalnom FFT -u morali smo pohraniti vrijednost sinusa kako bismo rješenje učinili bržim. U novoj funkciji, budući da nam više nisu potrebne sinusne/kosinusne vrijednosti, možemo ih ukloniti i uštedjeti malo memorije.

Implementacija:

Provođenje ove funkcije jednostavno je naprijed. Funkciju možemo jednostavno kopirati u skladu s kodom. Ova se funkcija može izvršiti pomoću naredbe u nastavku:

float f = Q_FFT (podaci, 256, 100); U funkciji Q_FFT, podaci: ovaj pojam je niz sa vrijednostima signala, preporučena veličina uzorka je 2, 4, 8, 32, 64, 128, 256, 512, … nadalje. ako veličina uzorka ne pripada tim vrijednostima, bit će izrezana na najbližu donju stranu vrijednosti. na primjer, ako je veličina uzorka 75, FFT će se provesti za 64 broja uzoraka. Maksimalan broj uzorka ograničen je raspoloživim RAM -om na Arduinu.

Drugi pojam određuje broj uzoraka u nizu, a posljednji pojam je frekvencija uzorkovanja u Hz.

Korak 2: Kodiranje

Ovaj odjeljak objašnjava izmjene napravljene u EasyFFT kodu koje je potrebno imati na umu prilikom izmjena koda, 1. Kao što je prije objašnjeno, ovdje se cijeli brojevi koriste za obavljanje FFT -a. Int u Arduinu je 16 -bitni broj i može sadržavati vrijednosti od -32768 do 32768. kad god vrijednost ovog inta premaši ovaj raspon uzrokuje problem. kako bi se ovaj problem eliminirao nakon što ste ikada izračunali razinu. ako bilo koja vrijednost prelazi 15000, potpuni nizovi bit će podijeljeni sa 100. to će spriječiti prelijevanje int -a.

2. Izračun amplitude: Za izračun amplitude, stvarni i imaginarni dio potrebno je kvadrirati i potreban je kvadratni korijen zbroja. kvadrata i kvadratnog korijena funkcije potrebno je vrijeme. kako bi proces bio brži, ovaj će kôd jednostavno napraviti neke veličine realnih i imaginarnih dijelova. Ovo je zasigurno manje točno i u nekim slučajevima može dovesti do pogrešnog zaključka. možete se odlučiti za povratak na normalnu metodu za izračun veličine, ali to će potrajati više vremena, a također ćete morati napraviti neki aranžman za spremanje ovih brojeva.

3. Ovaj kôd nema modul za otkrivanje više vrhova. Jednostavno će odabrati vrijednost s maksimalnom amplitudom (isključujući prvi broj koji je DC pomak). Ako vam je potrebno više vrhova, možete uputiti EasyFFT kod i ovdje izvršiti potrebne izmjene. U tom slučaju neki niz/varijablu također je potrebno deklarirati kao globalnu varijablu.

4. Funkcija sadrži sljedeći redak:

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

deklariranje gornjih varijabli kao globalne varijable (lijepljenje na početak koda) uštedjet će negdje 1 milisekundu vremena pri svakom izvršavanju.

5. Za razliku od funkcije EasyFFT, gdje je prvih 5 vrhova pohranjeno u unaprijed definiranom nizu. Ova funkcija vraća vrijednost s plutanjem. ova vrijednost predstavlja frekvenciju s maksimalnom amplitudom u Hz. Tako će prikaz koda izgledati otprilike ovako.

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

6. Peak Detection: Nakon što se pronađe frekvencija s maksimalnom amplitudom, ova funkcija koristi amplitudu frekvencije neposredno prije i nakon nje za izračun točnih rezultata. Amplituda korištena u ovom izračunu također je zbroj modula (ne kvadratni korijen zbroja kvadrata)

ako je Fn frekvencija s maksimalnom amplitudom tada se frekvencija može izračunati iz formule ispod.

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

gdje je An amplituda n frekvencije, a Fn-1 vrijednost frekvencije.

Korak 3: Rezultati:

Rezultati
Rezultati
Rezultati
Rezultati

Vrijeme rješavanja prikazano je u gornjoj usporedbi slika s EasyFFT -om. Brzina je prikazana usporedbom.

Za uzorke su prikazani podaci sa 3 sinusna vala različitih frekvencija. Rezultat QuickFFT -a uspoređuje se s Scilabovim izlazom. Kao što možemo vidjeti na slici, 3 vrha s maksimalnom amplitudom podudaraju se s Scilabovim izlazom. Međutim, izlaz se sastoji od mnogo šuma, što može zavarati neke aplikacije. Stoga se savjetuje da prije provjere koda ispravno provjerite kôd.

Nadam se da vam je ovaj kod koristan za vaš projekt. U slučaju bilo kakvih upita ili prijedloga, ostavite komentar.

Preporučeni: