Tartalomjegyzék:
Videó: QuickFFT: Nagy sebességű FFT az Arduino számára: 3 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:40
A tipikus Arduino korlátozott RAM-mal és feldolgozási teljesítménnyel rendelkezik, az FFT pedig számításigényes folyamat. Sok valós idejű alkalmazás esetében az egyetlen követelmény a maximális amplitúdójú vagy frekvenciacsúcsok észleléséhez szükséges frekvencia beszerzése.
Az egyik utasításomban elkészítettem az FFT kódját, amely itt található: EasyFFT
Ez a kód akár 128 minta FFT -jét is képes volt elvégezni az Arduino nano készüléken. Ennél magasabb mintaszám nem lehetséges az Arduino korlátozott memóriája miatt. Kicsit módosítottam a funkción, hogy javítsam a sebességet és csökkentsem a memóriafogyasztást. Ez a módosítás lehetővé teszi, hogy az Arduino ötször gyorsabban hajtsa végre az FFT -t, és csaknem fele memóriát fogyaszt. Ez az útmutató nem terjed ki az FFT működésére, az erre vonatkozó hivatkozások az EasyFFT oldalon találhatók.
1. lépés: Munka
A tipikus FFT funkciót úgy módosították, hogy kisebb pontossággal javítsa a sebességet. Amint a képen látható, a tesztjelet szinusz- vagy koszinuszhullámokkal kell megszorozni. Ezek az értékek 0 és 1 között lehetnek, ezért lebegő szorzás elvégzése kötelező. az Arduino -ban a lebegő szorzás lassú az egész műveletekhez képest.
Ebben a függvényben a szinusz/koszinusz hullámot egy négyzethullám váltja fel. Mivel egy tesztjelet meg kell szoroznunk egy négyzethullámmal, amelynek értéke 0, 1 vagy -1 lehet. Ennek köszönhetően a lebegő szorzást egyszerűen egész összeadásra vagy kivonásra cserélhetjük. Az Arduino egész szám összeadása vagy kivonása körülbelül ötször gyorsabb. Így körülbelül ötször gyorsabb a megoldás.
Ennek a módosításnak köszönhetően a frekvenciatartály értékei egész számként tárolhatók (ami korábban lebegő volt), és további előnyt kapunk az alacsonyabb memóriafogyasztás mellett. Az Arduino Nano esetében az int 2 bájt memóriát fogyaszt, míg a float 4 bájt memóriát. Az új kód ezen előnye miatt közel 256 mintára (korábban 128 minta) képesek vagyunk FFT -t végezni.
Normál FFT -ben a szinusz értéket kellett tárolnunk, hogy gyorsabb legyen a megoldás. Az új funkcióban, mivel már nincs szükség szinusz/koszinusz értékekre, megszüntethetjük azt, és memóriát spórolhatunk.
Végrehajtás:
Ennek a funkciónak a megvalósítása egyszerű. Egyszerűen másolhatjuk a függvényt a kód kódjában. Ez a funkció az alábbi paranccsal hajtható végre:
float f = Q_FFT (adatok, 256, 100); A Q_FFT függvényben
adatok: ez a kifejezés egy jelértékű tömb, az ajánlott minta mérete 2, 4, 8, 32, 64, 128, 256, 512,… és tovább. ha a minta mérete nem tartozik ezekhez az értékekhez, akkor az értékek legközelebbi alsó oldalára lesz vágva. Például, ha a minta mérete 75, akkor az FFT -t 64 minta esetében kell elvégezni. A minta maximális számát korlátozza az Arduino RAM -ja.
A második tag meghatározza a minták számát egy tömbben, az utolsó pedig a mintavételi frekvenciát Hz -ben.
2. lépés: Kód
Ez a rész elmagyarázza az EasyFFT kódban végrehajtott módosítást, amelyet szem előtt kell tartani a kód módosításakor, 1. Amint azt korábban kifejtettük, itt egész számokat használnak az FFT elvégzésére. Az Int az Arduino -ban egy 16 bites szám, és -32768 és 32768 közötti értékeket tartalmazhat, valahányszor ennek az int értéke meghaladja ezt a tartományt, ez okozza a problémát. hogy kiküszöbölje ezt a problémát mindenkori szintszámítás után. ha az értékek bármelyike meghaladja a 15000 teljes tömböt 100 -zal osztják el. ez megakadályozza az int túlcsordulását.
2. Amplitúdószámítás: Az amplitúdó kiszámításához a valós és képzeletbeli részt négyzetbe kell állítani, és az összeg négyzetgyökére van szükség. a négyzet és a függvény négyzetgyöke időt vesz igénybe. hogy gyorsítsuk a folyamatot, ez a kód egyszerűen elvégzi a valós és képzelt részek nagyságrendjét. Ez biztosan kevésbé pontos, és bizonyos esetekben rossz következtetéshez vezethet. dönthet úgy, hogy visszatér a normál módszerhez a nagyságrend kiszámításához, de ez több időt vesz igénybe, és el kell végeznie némi elrendezést ezeknek a számoknak a tárolásához.
3. Ez a kód nem rendelkezik többcsúcsos észlelési modullal. Egyszerűen kiválasztja a maximális amplitúdójú értéket (kivéve az első számot, amely egyenletes eltolás). Ha több csúcsra van szüksége, itt hivatkozhat az EasyFFT kódra, és elvégezheti a szükséges módosítást. Ebben az esetben bizonyos tömböt/változót globális változóként is deklarálni kell.
4. A függvény a következő sort tartalmazza:
unsigned int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
a fenti változók globális változóként való deklarálása (beillesztése a kód kezdetére) valahol 1 ezredmásodpercet takarít meg minden végrehajtáskor.
5. Ellentétben az EasyFFT funkcióval, ahol az első 5 csúcsot az előre meghatározott tömb tárolta. Ez a függvény lebegő értéket ad vissza. ez az érték a maximális amplitúdójú frekvenciát jelenti Hz -ben. Tehát a kód ábrázolása valahogy így fog kinézni.
float f = Q_FFT (adatok, 256, 100);
6. Csúcsérzékelés: Miután megtalálta a maximális amplitúdójú frekvenciát, ez a funkció a frekvencia amplitúdóját használja közvetlenül előtte és utána, hogy kiszámítsa a pontos eredményeket. Az ebben a számításban használt amplitúdó szintén a modulus összege (nem a négyzetösszeg négyzetgyöke)
ha Fn a maximális amplitúdójú frekvencia, akkor a frekvencia az alábbi képletből számítható ki.
Tényleges F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
ahol An amplitúdója n a frekvencia és Fn-1 frekvenciaérték.
3. lépés: Eredmények:
A megoldási idő a fenti kép összehasonlításban látható az EasyFFT -vel. Sebessége az összehasonlítással látható.
A mintaadatokhoz három különböző frekvenciájú szinuszos hullám tartozik. A QuickFFT eredményét összehasonlítják a Scilab kimenettel. Amint azt a képen is látjuk, 3 maximális amplitúdójú csúcs megegyezik a Scilab kimenettel. A kimenet azonban sok zajt tartalmaz, ami egyes alkalmazásoknál félrevezető lehet. Ezért ajánlatos megfelelően ellenőrizni a kódot, mielőtt jelentkezne a pályázatra.
Remélem, hasznosnak találta ezt a kódot a projekthez. Bármilyen kérdés vagy javaslat esetén kérjük, tegye meg megjegyzését.
Ajánlott:
Nagy sebességű EKG vagy egyéb adatok naplózása, folyamatosan több mint egy hónapig: 6 lépés
Nagysebességű EKG vagy egyéb adatok naplózása folyamatosan, több mint egy hónapig: Ezt a projektet egy egyetemi orvosi kutatócsoport támogatására fejlesztették ki, akiknek szüksége volt egy hordható eszközre, amely 2 x EKG jelet rögzíthet 1000 minta/másodpercenként (összesen 2K minta/másodperc) folyamatosan 30 napig, az aritmiák észlelése érdekében. A projekt bemutatja
Hogyan készítsünk nagy sebességű ventilátort egyenáramú motorral?: 6 lépés
Hogyan készítsünk nagy sebességű ventilátort DC motorral?: Először nézze meg a teljes videót, és mindent megért. A részleteket az alábbiakban adjuk meg
Nagy sebességű játék laptop: 9 lépés (képekkel)
Nagy sebességű játék laptop: HiFriends, Ma megmutatom, hogyan készítheti el otthonában a legerősebb és leggyorsabb zsebméretű laptopot beépített Windows 10 operációs rendszerrel. Ebben a cikkben minden információt megadok, hogy könnyedén elkészíthesse ezt otthonában
Nagy sebességű óra lassított videókhoz: 4 lépés
Nagy sebességű óra lassított videókhoz: Szinte mindenkinek, aki modern okostelefonnal rendelkezik, van nagy sebességű kamerája, amely látványos lassított videók készítésére használható. De ha meg akarja mérni, hogy valójában mennyi ideig tart a szappanbuborék kipukkanása vagy a görögdinnye felrobbanása, akkor
Nagy sebességű vakufotózás: 6 lépés (képekkel)
Nagysebességű vakufényképezés: Ez a csavarhúzó közepén a visszapattanás képe. Miután egy folyóiratban olvastam a nagysebességű fotózásról, inspirációt kaptam, hogy átássam a szekrényemet, és lássam, mire juthatok. Házi készítésű sminkképernyőt használtam a vaku aktiválásához, míg a digitális