Përmbajtje:

QuickFFT: FFT me shpejtësi të lartë për Arduino: 3 hapa
QuickFFT: FFT me shpejtësi të lartë për Arduino: 3 hapa

Video: QuickFFT: FFT me shpejtësi të lartë për Arduino: 3 hapa

Video: QuickFFT: FFT me shpejtësi të lartë për Arduino: 3 hapa
Video: Сэмпл звука Aduino для реактивных дисплеев 2024, Qershor
Anonim
QuickFFT: FFT me shpejtësi të lartë për Arduino
QuickFFT: FFT me shpejtësi të lartë për Arduino

Arduino tipike ka RAM dhe fuqi përpunuese të kufizuar, dhe FFT është një proces intensiv i llogaritjeve. Për shumë aplikime në kohë reale, kërkesa e vetme është marrja e frekuencës me amplitudë maksimale ose e nevojshme për të zbuluar majat e frekuencës.

Në një nga udhëzimet e mia, unë përgatita një kod për FFT që mund të gjendet këtu: EasyFFT

Ky kod ishte në gjendje të kryente FFT deri në 128 mostra në Arduino nano. Një numër mostre më i lartë se ky nuk është i mundur për shkak të kujtesës së kufizuar të Arduino. Unë e kam modifikuar pak funksionin për të përmirësuar shpejtësinë dhe zvogëluar konsumin e kujtesës. Ky modifikim lejon Arduino të kryejë FFT pesë herë më shpejt dhe konsumon pothuajse gjysmën e kujtesës. Ky udhëzues nuk mbulon punën e FFT, referencat për të mund të gjenden në EasyFFT.

Hapi 1: Puna

Duke punuar
Duke punuar
Duke punuar
Duke punuar
Duke punuar
Duke punuar
Duke punuar
Duke punuar

Funksioni tipik FFT është modifikuar për të përmirësuar shpejtësinë me një saktësi më të vogël. Siç tregohet në imazh, një sinjal provë duhet të shumëzohet me forma valore sinus ose kosinus. Këto vlera mund të jenë nga 0 në 1, kështu që bërja e shumëzimit lundrues është një domosdoshmëri. në Arduino, shumëzimi lundrues është i ngadalshëm në krahasim me operacionet e plota.

Në këtë funksion, vala sinus/kosinus zëvendësohet nga një valë katrore. Ndërsa duhet të shumëzojmë një sinjal provë me një valë katrore e cila mund të ketë vlerë 0, 1 ose -1. Për shkak të kësaj, ne mund të zëvendësojmë shumëzimin lundrues në thjesht mbledhje ose zbritje të plotë. Për Arduino mbledhja ose zbritja e numrave të plotë është rreth 5 herë më e shpejtë. Kjo e bën zgjidhjen rreth 5 herë më të shpejtë.

Për shkak të këtij modifikimi tani vlerat e koshit të frekuencës mund të ruhen si një numër i plotë (i cili më parë ishte notues) dhe marrim një avantazh tjetër të konsumit më të ulët të kujtesës. Në Arduino Nano, int konsumon 2 bajt memorie ndërsa float konsumon 4 bajt memorie. Për shkak të këtij avantazhi në kodin e ri, ne jemi në gjendje të kryejmë FFT për pothuajse 256 mostra (më parë 128 mostra).

Në FFT Normale na duhej të ruanim vlerën e sinusit për të bërë një zgjidhje më të shpejtë. Në funksionin e ri, pasi ne nuk kërkojmë më vlera të sinusit/kosinusit, ne mund ta eliminojmë atë dhe të kursejmë pak kujtesë.

Zbatimi:

Zbatimi i këtij funksioni është drejtpërdrejt përpara. Ne thjesht mund të kopjojmë funksionin në kodin. Ky funksion mund të ekzekutohet duke përdorur komandën më poshtë:

noton f = Q_FFT (të dhëna, 256, 100); Në funksion Q_FFT,

të dhëna: ky term është një grup që ka vlera sinjali, madhësia e rekomanduar e mostrës janë 2, 4, 8, 32, 64, 128, 256, 512,… e tutje. nëse madhësia e mostrës nuk i përket këtyre vlerave do të kapet në anën e poshtme më të afërt të vlerave. për shembull, nëse madhësia e mostrës është 75 atëherë FFT do të kryhet për 64 numra mostrash. Numri maksimal i madhësisë së mostrës është i kufizuar nga RAM -i i disponueshëm në Arduino.

Termi i dytë specifikon numrin e mostrave në një grup dhe termi i fundit është frekuenca e marrjes së mostrave në Hz.

Hapi 2: Kodi

Ky seksion shpjegon modifikimin e bërë në kodin EasyFFT që duhet të kihet parasysh gjatë modifikimit në kod, 1. Siç u shpjegua më parë, këtu numrat e plotë përdoren për të bërë FFT. Int në Arduino është një numër 16 -bit dhe mund të përmbajë vlera nga -32768 në 32768. sa herë që vlera e këtij int e tejkalon këtë diapazon shkakton problemin. për të eleminuar këtë problem pas llogaritjes ndonjëherë të nivelit. nëse ndonjëra nga vlerat tejkalon 15000 vargje të plota do të ndahet me 100. kjo do të parandalojë daljen e int.

2. Llogaritja e amplitudës: Për të llogaritur amplitudën, pjesa reale dhe imagjinare duhet të katrorizohet dhe kërkohet rrënja katrore e shumës. katror dhe rrënja katrore e funksionit merr kohë. për ta bërë procesin më të shpejtë, ky kod thjesht do të bëjë disa nga madhësitë e pjesëve reale dhe imagjinare. Kjo është sigurisht më pak e saktë dhe mund të çojë në përfundim të gabuar në disa raste. ju mund të zgjidhni të ktheheni në metodën Normale për llogaritjen e madhësisë, por do të duhet më shumë kohë dhe gjithashtu duhet të bëni disa aranzhime për të ruajtur këta numra.

3. Ky kod nuk ka një modul për zbulimin e pikut të shumëfishtë. Thjesht do të zgjedhë vlerën me amplituda maksimale (duke përjashtuar numrin e parë që është kompensuar DC). Nëse keni nevojë për maja të shumta, mund t'i referoheni kodit EasyFFT dhe të bëni modifikimin e kërkuar këtu. Në atë rast, një grup/ndryshore gjithashtu duhet të deklarohet si një ndryshore globale.

4. Funksioni përmban rreshtin e mëposhtëm:

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

shpallja e ndryshoreve të mësipërme si një ndryshore globale (ngjitja e saj në fillim të kodit) do të kursejë diku 1 milisekonda kohë në çdo ekzekutim.

5. Ndryshe nga funksioni EasyFFT, ku 5 majat kryesore u ruajtën në grupin e paracaktuar. Ky funksion do të kthejë një vlerë notuese. kjo vlerë paraqet frekuencën me amplituda maksimale në Hz. Pra, përfaqësimi i kodit do të duket diçka si kjo.

noton f = Q_FFT (të dhëna, 256, 100);

6. Zbulimi i pikut: Pasi të gjendet frekuenca me amplituda maksimale, ky funksion përdor një amplitudë të frekuencës pak para dhe pas saj për të llogaritur rezultatet e sakta. Amplituda e përdorur në këtë llogaritje është gjithashtu shuma e modulit (jo rrënja katrore e shumës së katrorëve)

nëse Fn është frekuenca me amplitudë maksimale atëherë frekuenca mund të llogaritet nga formula poshtë.

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

ku An është amplituda e frekuencës n dhe Fn-1 është vlera e frekuencës.

Hapi 3: Rezultatet:

Rezultatet
Rezultatet
Rezultatet
Rezultatet

Koha e zgjidhjes tregohet në krahasimin e imazhit të mësipërm me EasyFFT. Shpejtësia e saj tregohet me krahasimin.

Për të dhënat e mostrës që kanë 3 valë sinusoidale me frekuenca të ndryshme është treguar. Rezultati nga QuickFFT krahasohet me daljen Scilab. Siç mund ta shohim në imazh 3 majat me amplituda maksimale përputhen me daljen Scilab. Sidoqoftë, dalja përbëhet nga shumë zhurmë, e cila mund të jetë çorientuese për disa aplikacione. Kështu që këshillohet që të kontrolloni kodin siç duhet para se të aplikoni në aplikacionin tuaj.

Shpresoj se e keni gjetur këtë kod të dobishëm për projektin tuaj. Në rast të ndonjë pyetjeje ose sugjerimi, ju lutemi komentoni.

Recommended: