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, Jun
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 zahtjev je dobiti frekvenciju s maksimalnom amplitudom ili je potrebno za otkrivanje vršnih frekvencija.

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

Ovaj kod je 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 modifikacija omogućava Arduinu da izvede FFT pet puta brže i troši gotovo polovicu memorije. Ovo uputstvo ne pokriva rad FFT -a, reference za njega se mogu pronaći na EasyFFT -u.

Korak 1: Rad

Working
Working
Working
Working
Working
Working
Working
Working

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 sa sinusnim ili kosinusnim talasnim oblicima. Ove vrijednosti mogu biti između 0 do 1, pa je potrebno napraviti plutajuće množenje. u Arduinu, plutajuće množenje je sporo u odnosu na operacije s cijelim brojevima.

U ovoj funkciji sinusni/kosinusni val 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 jednostavnim zbrajanjem ili oduzimanjem cijelog broja. Za Arduino zbrajanje ili oduzimanje cijelih brojeva je oko 5 puta brže. To čini rješavanje oko 5 puta brže.

Zbog ove izmjene sada se vrijednosti spremišta frekvencija mogu pohraniti kao cijeli broj (koji je ranije bio u plutajućem obliku) i dobivamo još jednu prednost manje potrošnje memorije. U Arduino Nano -u int troši 2 bajta memorije, dok float troši 4 bajta memorije. Zbog ove 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, kako nam više nisu potrebne sinusne/kosinusne vrijednosti, možemo ih ukloniti i uštedjeti malo memorije.

Implementacija:

Implementacija ove funkcije je jednostavna. Funkciju možemo jednostavno kopirati u skladu sa kodom. Ova funkcija se može izvršiti pomoću naredbe ispod:

float f = Q_FFT (podaci, 256, 100); U funkciji Q_FFT, podaci: ovaj izraz je niz sa vrijednostima signala, preporučena veličina uzorka je 2, 4, 8, 32, 64, 128, 256, 512,… pa nadalje. ako veličina uzorka ne pripada ovim 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živom RAM memorijom na Arduinu.

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

Korak 2: Kodirajte

Ovaj odjeljak objašnjava izmjene napravljene u EasyFFT kodu koje je potrebno imati na umu prilikom izmjena koda, 1. Kao što je ranije 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, to uzrokuje problem. da biste uklonili ovaj problem nakon proračuna nivoa. ako bilo koja vrijednost prelazi 15000, kompletni nizovi će se podijeliti sa 100. to će spriječiti prelijevanje int -a.

2. Izračun amplitude: Za izračunavanje amplitude, stvarni i imaginarni dio potrebno je kvadrirati i potreban je kvadratni korijen zbroja. kvadrata i kvadratnog korijena funkcije oduzima vrijeme. kako bi proces bio brži, ovaj kod će jednostavno raditi neke veličine stvarnih 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čunavanje veličine, ali to će potrajati više vremena, a potrebno je i napraviti neki aranžman za spremanje ovih brojeva.

3. Ovaj kôd nema modul za detekciju 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 izvršiti potrebne izmjene ovdje. U tom slučaju, neki niz/varijabla također treba biti deklarirana kao globalna varijabla.

4. Funkcija sadrži sljedeći red:

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 će vratiti float vrijednost. ova vrijednost predstavlja frekvenciju s maksimalnom amplitudom u Hz. Dakle, prikaz koda će izgledati otprilike ovako.

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

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

ako je Fn frekvencija s maksimalnom amplitudom, tada se frekvencija može izračunati prema donjoj formuli.

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 u poređenju.

Za uzorke su prikazani podaci sa 3 sinusna talasa različitih frekvencija. Rezultat QuickFFT -a se upoređuje sa Scilab izlazom. Kao što možemo vidjeti na slici, 3 vrha s maksimalnom amplitudom podudaraju se sa Scilabovim izlazom. Međutim, izlaz se sastoji od mnogo šuma, što može biti pogrešno za 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čuje se: