Përmbajtje:
Video: QuickFFT: FFT me shpejtësi të lartë për Arduino: 3 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:14
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
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:
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:
Makinë elektrike shtëpiake me shpejtësi të lartë: 7 hapa
Makinë elektrike shtëpiake me shpejtësi të lartë: Nëse keni dashur ndonjëherë të provoni të bëni makinën tuaj elektrike, kjo është një mënyrë shumë e thjeshtë për të bërë një makinë me shpejtësi të lartë nga materiale të zakonshme, si dhe disa gjëra të lira nga një dyqan elektronik. Nuk ka më nevojë të shpenzoni 30-60 dollarë për makina RC, kur të
Regjistroni EKG me shpejtësi të lartë ose të dhëna të tjera, vazhdimisht për më shumë se një muaj: 6 hapa
Regjistroni EKG me shpejtësi të lartë ose të dhëna të tjera, vazhdimisht për më shumë se një muaj: Ky projekt u zhvillua për të mbështetur një ekip kërkimor mjekësor universitar, i cili kishte nevojë për një pajisje të veshshme që mund të regjistronte 2 x sinjale EKG me 1000 mostra/sek secila (2K mostra/sec gjithsej) vazhdimisht për 30 ditë, me qëllim zbulimin e aritmive. Projekti paraqet
Orë me shpejtësi të lartë për video me lëvizje të ngadaltë: 4 hapa
Orë me shpejtësi të lartë për video me lëvizje të ngadaltë: Pothuajse të gjithë me një smartphone modern kanë një aparat fotografik me shpejtësi të lartë që mund të përdoret për të bërë video spektakolare me lëvizje të ngadalta. Por nëse doni të matni sa kohë duhet në të vërtetë që ajo flluskë sapuni të shpërthejë ose ajo shalqi të shpërthejë, mund të
Videografi me shpejtësi të lartë për fillestarët .: 6 hapa (me fotografi)
Videografi me shpejtësi të lartë për fillestarët .: Të gjithë ata që kam takuar dhe biseduar për të ndarë një gjë të përbashkët: dëshirën për të zotëruar, ose të paktën të luaj me një aparat fotografik me shpejtësi të lartë. Megjithëse dyshoj se shumë nga njerëzit që e lexojnë këtë kanë një aparat fotografik të tyre me shpejtësi të lartë, është dëshira ime që ata pak që janë duke
Bëni goditjet tuaja të makinave RC më të shkurtra për trajtim më të mirë me shpejtësi të lartë: 5 hapa
Bëni goditjet tuaja të makinave RC më të shkurtra për trajtim më të mirë me shpejtësi të lartë: Në këtë Udhëzues do t'ju tregoj se si t'i shkurtoni goditjet tuaja në mënyrë që ta afroni makinën tuaj më afër tokës, në mënyrë që të bëni kthesa me shpejtësi më të madhe pa përplasje. Unë do të përdor udhëzues tjetër se si të bëni mirëmbajtje në makinat tuaja trondit, kështu që