Sadržaj:
Video: QuickFFT: Brzi FFT za Arduino: 3 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:05
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
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:
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:
Brzi mjenjač ispod 50 USD! Kazeshifter Arduino podesivi brzi mjenjač: 7 koraka
Brzi mjenjač ispod 50 USD! Kazeshifter Arduino podesivi brzi mjenjač: Zdravo ljubitelji Superbikea ili motocikla! Na ovom uputstvu ću vam reći kako jeftino napraviti svoj vlastiti Quick Shifter! Za ljude koji su lijeni čitati ove upute, samo pogledajte moj video! Napomena: Za neke bicikle koji već koristi sistem za ubrizgavanje goriva, neke
Jednostavno napravite vlastite widgete - Brzi brojač BPM -a: 6 koraka
Jednostavno napravite vlastite widgete - Brzi brojač BPM -a: Web aplikacije su uobičajeno mjesto, ali web aplikacije koje ne zahtijevaju pristup internetu nisu. U ovom članku pokazat ću vam kako sam napravio BPM brojač na jednostavnoj HTML stranici zajedno sa vanilinom javascript ( vidi ovde). Ako se preuzme, ovaj widget se može koristiti van mreže
Domaći brzi električni automobil: 7 koraka
Domaći brzi električni automobil: Ako ste ikada htjeli isprobati vlastiti električni automobil, ovo je vrlo jednostavan način da napravite automobil velike brzine od uobičajenih materijala, kao i nekoliko jeftinih stvari iz trgovine elektroničkih proizvoda. Nema više trošenja 30 do 60 dolara na RC automobile, kada
Brzi Hartleyjev transformacijski spektralni stetoskop: 22 koraka
Spektralni stetoskop sa brzom transformacijom Hartley: U ovom uputstvu ćete naučiti kako napraviti spektralni stetoskop koristeći brzu hartley transformaciju. Ovo se može koristiti za vizualizaciju zvukova srca i pluća
Vodič za brzi početak za Arduino IDE sa NodeMCU ESP8266: 6 koraka
Kratki vodič za Arduino IDE s NodeMCU ESP8266: Arduino IDE konfiguracija za NodeMCU ESP8266