Tartalomjegyzék:

QuickFFT: Nagy sebességű FFT az Arduino számára: 3 lépés
QuickFFT: Nagy sebességű FFT az Arduino számára: 3 lépés

Videó: QuickFFT: Nagy sebességű FFT az Arduino számára: 3 lépés

Videó: QuickFFT: Nagy sebességű FFT az Arduino számára: 3 lépés
Videó: Inside with Brett Hawke: Jason Calanog 2024, November
Anonim
QuickFFT: Nagy sebességű FFT az Arduino számára
QuickFFT: Nagy sebességű FFT az Arduino számára

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

Dolgozó
Dolgozó
Dolgozó
Dolgozó
Dolgozó
Dolgozó
Dolgozó
Dolgozó

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:

Eredmények
Eredmények
Eredmények
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: