Arduino könyvtár
Ahhoz, hogy a könyvtár, töltse le a ZIP-fájlt, csomagold ki, majd tegyük egy mappát IDE Arduino könyvtárakban.
FFT könyvtár áll, több funkció - annak érdekében, hogy a felhasználó állíthatja be, hogy megfeleljen az Ön igényeinek. Azaz, ha nem kell egy kis töredékei a könyvtár, akkor lehet egyszerűen eltávolítható.
Összesen hét könyvtári funkciók: két előzetes fft_reorder () és fft_window (). egy fő fft_run () és négy amplitúdó, felelős a különböző formátumú adat kimenet: 16-bites lineáris, 8-bites lineáris, 8-bites logaritmikus és a 8-bites oktáv.
fft_run () funkció - a fő funkciója a FFT könyvtár. Nem kell semmilyen érvet, és visszatér semmi. Ha ezt a funkciót, azt feltételezzük, hogy a szükséges adatokat átszervezésre került, és a memóriában tárolt SRAM. Ez az adat az archívumban tárolt úgynevezett fft_input []. amely két 16 bites értékek - valós és komplex. Ha kitölti a tömb magad, akkor az aktuális érték tárolása a páros kimenőjelmintáját, és a komplex - páratlan.
Így, fft_input [0] - ez az első tényleges érték, fft_input [1] - egy első komplex érték, fft_input [2] - egy második tényleges érték, fft_input [3] - egy második komplex érték stb
Következésképpen kiderül megduplázódott, így a minták száma a tömbben lesz kétszer többet, sőt, igazi PBF -otschetov. Ha mindig csak a valós számok (azaz a kapott értékek az ADC), majd mentse őket a páros minták és írja be a „0” a páratlan mintákban.
Az eredmény tároljuk fft_input []. akkor is, ha a minták felelős a tényleges amplitúdó és a páratlan - az összetett. Sami számít a frekvenciatartományban (ASC).
Így, fft_input [0] és fft_input [1] - az amplitúdója az első referencia képkocka (0 Hz -> Fs / N), fft_input [2], és fft_input [3] - a amplitúdója a második referencia képkocka (Fs / N -> 2FS / N), stb
Ahhoz, hogy a mintákból minden hasznos adatot kell futtatni a négy amplitúdó funkciók (amelyből alább).
fft_reorder ()
fft_reorder () függvény átszervezi a bemeneti adatok, felkészítve őket feldolgozásra FFT. Talán ez a funkció nem szükséges, mert Ez az átszervezés kézzel is elvégezhető. fft_reorder () funkció előtt futtatandó fft_run (). Nem kell semmilyen érvet, és visszatér semmi. Ezen túlmenően, annak szükségességét, hogy töltse fft_input [] tömb hívás előtt ezt a funkciót. mert Tart a nyers adatokat onnan.
fft_window ()
fft_window () függvény megszorozza a bemeneti adatokat az eszköz használatával-box gyakoriságának növelése felbontású adatok PBF. Nem kell semmilyen érvet, és visszatér semmi. Ezen túlmenően, annak szükségességét, hogy töltse fft_input [] tömb hívás előtt ezt a funkciót. mert Tart a nyers adatokat onnan. fft_reorder () funkció előtt futtatandó fft_run () és fft_reorder ().
fft_mag_lin8 ()
fft_mag_lin8 () függvény ad az amplitúdó az egyes FFT kerethez. Ő összegzi a valós és komplex értékek, négyzetes, majd a négyzetgyök, kerekítés az eredményt a 8 bites érték (ez használ egy táblázat, beállítja az értékeket a teljes 8 bites tartomány). Nem kell semmilyen érvet, és visszatér semmi. Kezdeti adatok mert az adatokat a tömb fft_input []. és az eredményt tárolja array fft_lin_out8 []. amely után az adatok más célokra használják fel. Az amplitúdó számítják csak az első felében a kimeneti minták (N / 2), mivel a második felében a FFT azonos a teljes első tartományban a kezdeti értékeket. Következésképpen, a száma 8-bites tömb elemeinek fft_lin_out8 [] lesz N / 2. ahol minden egyes index felel meg a szám a kimeneti kép (mínusz „1”).
Ez fft_lin_out8 [0] - az amplitúdója az első referencia képkocka (0 Hz -> Fs / N), fft_lin_out8 [1] - az amplitúdója a második referencia képkocka (Fs / N -> 2FS / N), stb
fft_mag_lin ()
fft_mag_lin () függvény ad az amplitúdó az egyes FFT kerethez. Ő összegzi a valós és komplex értékek, négyzetes, majd négyzetgyökét. segítségével egy táblázat a négyzetgyök, hogy a pontosság bizonyos korlátai. A funkció magában foglalja a teljes 16 bites tartományban, de bármely adott ennek a tartománynak felbontású továbbra is 8-bites.
Ez a 8-bites érték, ahol a 4 által allokált bitek sorrendben (azaz kitevő). Kezdeti adatok mert az adatokat a tömb fft_input []. és az eredményt tárolja array fft_lin_out []. A kapott adatok vannak elrendezve ebben a sorrendben, és azok teljes száma N / 2. mivel a második felében a FFT azonos a teljes első tartományban a kezdeti értékeket.
fft_mag_log ()
fft_mag_log () függvény ad az amplitúdó az egyes FFT kerethez. Ő összegzi a valós és komplex értékek négyzetes, akkor a négyzetgyök. Ezután a függvény logaritmusa kapott szám tekintetében kettő. Az eredmény kerül bemutatásra logaritmikus formában - sőt, decibelben. fft_mag_log () függvény nem igényel semmilyen érvet, és visszatér semmi.
A négyzetgyök egy keresési táblázat, és az eredmény van beállítva a teljes 8-bites tartományban. Azaz, a funkció egyenlet a következő lesz: 16 * (log2 ((+ kompleksn2 deystv2) 1/2)). Kezdeti adatok a funkció az adatokat a tömb fft_input []. és az eredményt tárolja array fft_log_out []. Összege ugyan azonos nagyságrendű, mint a kimeneti minták az FFT. és a teljes minták száma N / 2. mivel a második felében a FFT azonos a teljes első tartományban a kezdeti értékeket.
fft_mag_octave ()
fft_mag_octave () függvény adja a négyzetes középértékét a kimeneti minta, bemutatva az egészet oktáv (frekvencia duplázás) formátumban. Ez a formátum általában sokkal hasznosabb, mert közel van az emberek érzékelik hangot. Nem kell semmilyen érvet, és visszatér semmi. Kezdeti adatok a funkció az adatokat a tömb fft_input []. és az eredményt tárolja array fft_oct_out []. A kapott adatokat képviselnek 8-bites érték, képlet alapján számítható 16 * log2 (Blocks (Vp)). A számú kimeneti minták a következőképpen számítjuk ki:
Itt például, 5: 8 - az összeg az összes minta található, az 5., a 8.. Az adatok az egyes mintákban a négyzeten (és valós és komplex értékek), majd hozzáadjuk az összes amplitúdója (is négyszögesítése) található ebben a tartományban. Ezután a száma kimeneti mintákat vesznek, és elosztjuk azt a számot (amely egyébként, ki lehet kapcsolni - lásd a következő részt), majd négyzetgyökét, és a logaritmus számítjuk.
Szeretné, hogy „nézz a motorháztető alatt.” Oké, megpróbálom elmagyarázni, hogy minden működik megfelelően, hogy milyen elveket. Mert sebességnövekedés a FFT könyvtárban találkozik két dolgot.
Először is, az egyes FFT meg kell szorozni a beállított kezdeti érték a szinusz és koszinusz állandók. A ATmega igényel nagy számítási erőforrásokat, mivel a szorzás a 16-bites és 16-bites előírja, hogy 18 órát ciklus. Másrészt, a 16 bites és 16-bites igényel csak 2 órajel ciklust. Ezért azt a következtetést, hogy ez jobb, mint a hajtás, hogy szaporodnak. Az a tény, hogy a szinusz és koszinusz állandók használt FFT - ez csak egy „0” és „1”. így nem kell használni szorzás, mert elég kívül. Például, ha az FFT 256 kimeneti minta. akkor szükséges végrehajtani egy komplex szorzás, 1024, amelyből 382 - ez a „0” vagy „1”. Majdnem a fele!
FFT könyvtár Arduino keres feltételeket, amelyek az „0” és „1”. és egyszerűen azt teszi kívül. Az a tény, hogy ezek az állandók jelennek rendszeres időközönként, úgy néz rájuk elég egyszerű. Azonban a növekvő számú kimeneti minták előnye ennek a módszernek csökken. Ha a szám a kimeneti minták az FFT jelen N. időmegtakarítás lenne (1,5 * N - 2), és a teljes száma szaporításukra jelentése (N / 2) * log2 (N). Így, a képlet, amely a számított megtakarítások lesz 3 / log2 (N). N. és minél nagyobb, annál kevesebb időt takaríthat meg.
A második módszer célja a gyorsulás a FFT - egy táblázat kiszámításához használt négyzetgyöke amplitúdója. A komplexitás a módszerrel, hogy a nyers adatok sokkal több, mint a tartalom a keresési táblázat. Így, hogy ne pazarolja program memória, az eredeti adatok tömörítve. Például, ha a négyzetgyök 16 bites érték. megkapjuk 64000 bemeneti értékek. hogy meg kell valahogy beállítani, hogy 256 kimeneti értékek. A programmemória Arduino lehetetlen elvégezni ilyen mennyiségű számítás, így a lineáris interpolációt használunk a könyvtárban, hogy a teljes tömb bemeneti adatok, ami a különböző vonalak fogják kiszámítani a különböző régiókban. Például, egy lineáris 8-bites formátumú elég lesz 3-4 lineáris szakaszok. és veszteség nélkül az állásfoglalás.
Így a könyvtár számítja bemeneti érték az egyik ezek egyenes szakaszokat, majd a négyzetgyök, és kb 12 órajel ciklust. Ez sokkal kevesebb, mint a 150 ciklus. amelyek szükségesek a szabványos könyvtár négyzetgyök.
Verzió 32 bites bemeneti adatot kicsit nehezebb, mert most be kell állítani a kimenet 16 bit. és lineáris interpoláció itt nem segít, mert nem képes tömöríteni érték nagyobb felbontás 16 bit. Ezért is használnak egy hibrid megközelítés, amelyben a bemeneti érték alakítjuk 16-bites érték, 8-bites érdekében. Ezt meg lehet tenni nagyon gyorsan a bázis „2”. amely lehetővé teszi a használatát a négyzetgyök look-up table és az értékeket a felbontása nagyobb, mint 16 bit. Ha a tömörítés a bemeneti érték eltolta 2 bittel jobbra. a kimeneti érték rekonstruálni lehet a műszak 1 kicsit balra. Jellemzően, miután a létrehozása érdekében (azaz, exponenciális) kerekítve a páros szám, ahol a négyzetgyök visszatérhet egy egész számot.
Természetesen a 32 bites verzió nem olyan pontos, mint a könyvtár négyzetgyökszámító, de ehhez csak 40 ciklus. mivel ezt a könyvtárat igényel 500. A keresési táblázat egy értéket ad vissza, ami a helyes, lehetséges, csak az első 8 bit. de ez a pontosság elegendő erre FFT. Összesen FFT bit mélysége nem sokkal rosszabb, mint a 12 bites. mert használ egy fix pont (hogy elkerüljük a túlfolyó hozzáadása előtt minden értéket el kell osztani 2 ;. ha az FFT követő 256 kimenőjelmintáját ez végül meghozta osztás 256). A pontosság függ a felbontás a kimeneti adatok. Ha egy 8-bites értéket. A pontosság lesz maximum. Ha ez egy 9-bites értéket. Az egyik legkisebb helyiértékű lehet rossz. Ha ez a 10-bites értéket. A két legkevésbé szignifikáns bit lehet rossz, stb Ez a legrosszabb forgatókönyv - egy 16 bites érték pontossággal +/- 0,5%.
Ezek az értékek lehetővé teszik, hogy módosítsa a FFT kódot, hogy megfeleljen az Ön igényeinek. Legtöbbjük kapcsolja ki és be bizonyos könyvtári funkciókat. Alapértelmezésben a legtöbb funkció ki van kapcsolva, így használni őket, először engedélyeznie kell azt. Ezek az irányelvek alkalmazásával illesztjük #define építési és meg kell tenni, mielőtt csatlakoztatja a könyvtárak, ami a tervezési #include.
- FFT_N direktíva meghatározza az FFT méretét. Az opciók: 16. 32. 64. 128 és 256. Az alapértelmezett beállítási lehetőség 256.
- MÉRLEG irányelv felelős nagyítás fft_mag_lin8 () függvényt. Mivel a 8-bit - ez elég gyenge felbontás, a felhasználó szeretné bővíteni az adatokat, hogy maximalizálja azok teljes körű.
- Irányelv SCALE megszorozza a kibocsátás állandó mielőtt a négyzetgyök, ami a kimenet maximális felbontás. Ez megköveteli egy kicsit több erőforrást igényel, mint a normál, de túlzott fogyasztása nagyon kicsi. Scale Az irányelv megadhat bármilyen szám 1-től 255-ig Az alapbeállítás 1 legkevesebb erőforrás felhasználásával elfogyasztott 1. 2. 4. 128 és 256.
- WINDOW irányelv engedélyezi vagy letiltja a doboz. Ha nem használja fft_window (). Ezután meg kell adnia WINDOW 0 (ki). Az alapértelmezett érték 1 ablak (ON).
- REORDER irányelv engedélyezi vagy tiltja az átszervezés. Ha nem használja fft_reorder (). Ezután meg kell adnia REORDER 0 (ki). Az alapértelmezett érték REORDER 1 (be).
- LOG_OUT irányelv engedélyezi vagy letiltja a logaritmikus formátumban. Ha ön használ fft_mag_log (). Ezután meg kell adnia LOG_OUT 1 (be). Az alapértelmezett beállítás LOG_OUT 0 (ki).
- LIN_OUT irányelv engedélyezi vagy tiltja a lineáris (16 bites) formátumban. Ha ön használ fft_mag_lin (). Ezután meg kell adnia LIN_OUT 1 (be). Az alapértelmezett beállítás LIN_OUT 0 (ki).
- LIN_OUT8 irányelv engedélyezi vagy tiltja a lineáris (8 bites) formátumban. Ha ön használ fft_mag_lin8 (). Ezután meg kell adnia LIN_OUT8 1 (be). Az alapértelmezett beállítás LIN_OUT8 0 (ki).
- Octave irányelv engedélyezi vagy letiltja a funkciót oktáv formátumban. Ha ön használ fft_mag_octave (). Ezután meg kell adnunk az Octave 1 (be). Octave alapértelmezett értéke 0 (ki).
- OCT_NORM irányelv be- és kikapcsolja az oktáv formátumú normalizálás funkciót. Ez része fft_mag_octave () függvény. mely elválasztja az egyes csoportosított számítva az átlagos beütésszámot. Mivel sok hangforrások bocsátanak úgynevezett „rózsaszín zaj” (ősszel az amplitúdó egyre gyakrabban), ez vezet a csökkenés mértéke. Mivel off (OCT_NORM 0), ez az irányelv mesterségesen növeli az amplitúdó magas frekvenciákon. Az alapértelmezett normalizálás tartalmazza (OCT_NORM 1).
- FFT adc - alkalmazása az FFT származó adatok az ADC és elküldésével az eredmény write ()
- FFT adc soros - alkalmazása az FFT származó adatok az ADC és elküldjük az eredményt keresztül println ()
- FFT codec - alkalmazása FFT az adatokat a modul Codec Shield