Fourierova transformácia na mikrokontroléri. Spektrálna analýza signálov. Rýchla Fourierova transformácia
Existuje mnoho špecializovaných procesorov na digitálne spracovanie signálu (DSP), ako napríklad DSP od Texas Instruments série TMS320, ktorý zahŕňa jednoduché celočíselné jadrá a také monštrá, ako je podrodina rodiny C6000, ktorá spracováva dáta s pohyblivou rádovou čiarkou. Existuje celý rad ADSP od Analog Devices (ktorý zahŕňa viac-menej univerzálny BlackFin), existujú aj jednoduchšie riešenia od MicroChip - dsPIC.
Špecializovaný DSP je však dobrý, ale je vždy taký potrebný? Áno, pri obrovskom toku informácií je jednoducho nenahraditeľná, no existujú aj jednoduchšie úlohy spracovania. Konkrétne ma zaujala úloha dvojitej konverzie - audio signál je konvolvovaný, čím sa získa spektrum, potom je možné na spektre vykonávať ľubovoľné operácie a vykonávať inverznú konverziu, čím sa získa spracovaný signál. To všetko je potrebné urobiť v reálnom čase a získať kvalitu nie nižšiu ako kvalita telefónu.
Nepíše sa rok 2000, existujú jednočipové riešenia založené na vysokovýkonných jadrách ARM7/Cortex-M3, ktoré výrazne klesli na cene, sú 32-bitové, majú hardvérovú implementáciu 32-bitovej operácie násobenia (navyše , takmer operácia násobenia a akumulácie DSP a 64 bitový výsledok) a Cortex-M3 zahŕňa aj hardvérovú divíziu.
Chcem vás hneď upozorniť, že spracovanie signálov nie je mojou špecializáciou, takmer všetky znalosti (alebo skôr pochopenie princípov) sa zachovali z inštitútu, ale teraz som to chcel len otestovať a implementovať. Mám na mysli, že môžu existovať nepresnosti v popise, zámene pojmov atď. V skutočnosti ma akademická presnosť veľmi neznepokojovala.
Pre takmer každý DSP je vyššie uvedená úloha jednoduchá a priamočiara. Ako sa však na ňom bude správať jadro RISC na všeobecné použitie? Ak vezmeme do úvahy AVR alebo PIC, je nepravdepodobné, že budú stačiť. Vplyv má 8-bitová a nízka taktovacia frekvencia. Hoci Elm-Chan má návrhy, v ktorých vykonáva FFT na AVR a kreslí spektrum signálu. V tomto prípade sa však v reálnom čase vykonáva jednoduchá vizualizácia (s minimálnou presnosťou spracovania) a nie úplné spracovanie signálu s prijateľnou kvalitou zvuku.
Ako experimentálny čip bol vybraný LPC2146, založený na jadre ARM7TDMI-S s maximálnou taktovacou frekvenciou 60 MHz (v praxi nepracuje na 72 a dokonca ani na 84 MHz). prečo? Jednak mám na to ladiacu dosku a jednak je na doske ADC a DAC, t.j. minimálna potrebná vonkajšia úprava.
Trochu teórie
V prvom rade bolo zaujímavé zhodnotiť výkon FFT (Fast Fourier Transform) na mikrokontroléroch ARM. Na základe tohto hodnotenia môžeme usudzovať, či má dostatočnú rýchlosť na spracovanie toku zvukových dát a signál s akou vzorkovacou frekvenciou a koľko kanálov je možné spracovať na takomto mikrokontroléri.
Na základe Fourierovej transformácie môžete zostaviť chytré filtre (s veľmi atraktívnymi vlastnosťami). Zaujímala ma predovšetkým problematika zmeny tónu signálu (zvyšovanie a znižovanie spektra) a „odrážanie“ spektra. Ten je potrebný v rádiách SDR na počúvanie rádiového vysielania LSB v dolnom postrannom pásme.
Nebudem vás zaťažovať teóriou a vysvetľovať, čo je Fourierova transformácia, na túto tému je pomerne veľa materiálov, z toho, čo som použil: wiki a kapitola z veľmi dobrej a poučnej knihy.
Softvérová implementácia
Existuje veľa softvérových implementácií FFT, ja som však napísal svoju vlastnú. Hlavným cieľom, ktorý som sledoval, bola optimalizácia kódu pre konkrétnu architektúru. Po prvé som sa hneď zameral na 32-bit, po druhé boli potrebné len celočíselné výpočty a bolo žiaduce vyhnúť sa operácii delenia. Nájsť niečo hotové, čo by tieto požiadavky spĺňalo, je už problematické.
Všetky konštanty, ktoré bolo možné vypočítať vopred, boli vypočítané a umiestnené do tabuliek (väčšinou hodnoty goniometrických funkcií). Toto je hlavná optimalizácia algoritmu, inak takmer úplne opakuje opísaný algoritmus.
Najdôležitejšia je požiadavka na celočíselné výpočty. Počas procesu implementácie dokonca došlo k chybe, ktorá spôsobila pretečenie v jednej z 32-bitových premenných slučky. Navyše sa neobjavil na všetkých testovacích údajoch, takže spôsoboval dosť bolesti hlavy, kým sa nenašiel.
Všetky pramenné texty som zhromaždil v jednom archíve. Implementácia nie je konečná, existujú duplicitné výpočty (neberie sa do úvahy spektrálna a fázová symetria) a je potrebná optimalizácia použitia vyrovnávacích pamätí, keďže v súčasnosti sa na výpočty používa príliš veľa RAM (takmer 12k na prepočet 1024 bodov ).
Prvé testy
Drum roll: Testujem rýchlosť prevodu na vzorke 1024 bodov, frekvencia jadra procesora je 60 MHz. Testovanie bolo vykonané v emulátore, takže si netvrdí, že je 100% presné, ale tento výsledok sa dá použiť ako indikátor (podľa mojich predchádzajúcich skúseností, hoci emulátor klamal, nebolo to veľa). Test prvej verzie kódu, kompilátor RealView MDK, možnosť optimalizácie O3, režim generovania kódu ARM.
Čo teda vidíme:
6 ms pre každú konverziu, celkovo niečo cez 12 ms pre spiatočnú konverziu. Ukazuje sa, že pri vzorkovacej frekvencii 44100 Hz (štandard pre zvuk) a vzorkách s rozlíšením až 16 bitov budú čisté výpočty trvať ~44*12ms = 528ms. A to je na prechodnej verzii firmvéru, keď niektoré optimalizácie kódu ešte neboli dokončené (podľa odhadov môže byť algoritmus zrýchlený takmer dvakrát)! Podľa mňa je to len výborný ukazovateľ.
Celkovo sa očakáva zaťaženie jadra okolo 50 %, ďalších 50 % zostáva na konverzie cez spektrum a režijné náklady pri práci s ADC, DAC a inými dátovými prenosmi. Ak znížite vzorkovaciu frekvenciu na „telefónnu“ úroveň (asi 4800-9600Hz), zaťaženie jadra bude ešte nižšie (asi 15-30%).
Takže matematická časť je viac-menej jasná. Môžete pristúpiť ku konkrétnej realizácii.
Železo
Pre testovaciu platformu sme použili vývojovú dosku Keil MCB2140 s reproduktorom. Kábel Mini-Jack je prispájkovaný na pripojenie k lineárnemu výstupu zariadenia a je zostavený jednoduchý vstupný reťazec. Ako už bolo spomenuté, na doske je už pripojený reproduktor na analógový výstup mikrokontroléra a nechýbajú ovládacie prvky (tlačidlo a potenciometer).
Tu je náčrt vstupného obvodu:
Ladenie softvéru prebiehalo v etapách:
- Odladenie všetkých potrebných periférií: ADC, DAC, časovače, LED indikácia.
- Test s digitalizáciou signálu: Dáta zdigitalizujem požadovanou rýchlosťou a vložím do vyrovnávacej pamäte, potom údaje z vyrovnávacej pamäte vytiahnem a prehrám signál. Tie. jednoduchý posun signálu v čase, bez akýchkoľvek transformácií. V tejto fáze sa testuje mechanizmus práce s 2 nárazníkmi, potrebnými pre ďalšiu prácu.
- Dopredná a inverzná Fourierova transformácia sú pridané k predchádzajúcej verzii. Tento test nakoniec overí správne fungovanie kódu FFT, ako aj skontroluje, či kód zapadá do dostupného výkonu.
- Potom je hlavná kostra aplikácie hotová, môžete prejsť k praktickým aplikáciám.
Problém nastal po pridaní FFT do kódu: v signáli sa objavil cudzí šum a píšťalky. Vo všeobecnosti sa mi toto správanie zdalo dosť zvláštne, pretože... Bez konverzie zostal signál prechádzajúci digitálnou cestou celkom čistý. Prvý dôvod: po analógovom obvode nebola amplitúda signálu na ADC plná (0-3,3V), ale iba v rozmedzí 0,5-2V pri maximálnej hlasitosti prehrávača, druhý: dosť silný šum spôsobený celým číslom výpočty (+-1 jednotka, čo sa ukázalo ako dostatočné na to, aby spôsobilo počuteľné rušenie).
Na boj proti prvému problému bolo rozhodnuté začať s úpravou analógovej časti. A na vyriešenie problému so šumom skúste použiť dolnopriepustný filter.
Aplikácia 1: zmena tónu signálu
Doska má potenciometer (variabilný odpor), ktorý je možné použiť na ovládanie. V tomto prípade nastaví posun spektra signálu nahor a nadol, čo je dosť na „transformáciu“ vašich obľúbených skladieb.
Čo sa deje vo frekvenčnej doméne:
V tomto prípade je výsledok konverzie obsiahnutý v 2 bufferoch. Jeden nárazník je skutočná časť a druhý je imaginárna časť. Fyzický význam čísel získaných v nich: skutočná časť obsahuje hodnoty harmonických, imaginárna časť obsahuje fázový posun pre tieto harmonické. Navyše, ako vidíte, počiatočný signál je opísaný N-hodnotami a po konverzii sa získajú 2N-hodnoty. Množstvo informácií sa nemení a k 2-násobnému zvýšeniu množstva informácií dochádza v dôsledku toho, že dáta vyrovnávacej pamäte majú redundanciu vo forme duplicitných hodnôt.
Ako zobrazovacie zariadenie sa používa dvojriadkový znakový LCD indikátor. Hlavným bodom pri realizácii tohto projektu nie je hardvér, ale softvér, presnejšie implementácia diskrétnej Fourierovej transformácie (DFT) na 8-bitovom mikrokontroléri. Hneď je potrebné poznamenať, že autor nie je odborníkom v tejto oblasti a preto začal základmi - jednoduchou diskrétnou Fourierovou transformáciou. Algoritmus rýchlej Fourierovej transformácie je nielen rýchly, ale aj pomerne zložitý.
Diskrétna Fourierova transformácia (v anglickej literatúre DFT, Discrete Fourier Transform) je jednou z Fourierových transformácií široko používaných v algoritmoch digitálneho spracovania signálu (jej modifikácie sa používajú pri kompresii zvuku v MP3, kompresii obrazu v JPEG atď.), ako aj v iné oblasti súvisiace s analýzou frekvencií v diskrétnom (napríklad digitalizovanom analógovom) signáli. Diskrétna Fourierova transformácia vyžaduje ako vstup diskrétnu funkciu. Takéto funkcie sa často vytvárajú vzorkovaním (vzorkovanie hodnôt zo spojitých funkcií).
Schéma zapojenia spektrálneho analyzátora audio signálu je veľmi jednoduchá a možno ju rozdeliť na digitálnu a analógovú časť.
Digitálnu časť tvorí mikrokontrolér a k nemu pripojený LCD indikátor. Mikrokontrolér je taktovaný z kremenného rezonátora 16 MHz; napájacie napätie +5 V sa používa ako referenčné napätie pre ADC mikrokontroléra.
Dátová zbernica LCD indikátora je pripojená na port C mikrokontroléra (vstupné/výstupné linky PC0-PC3), riadiaca zbernica je pripojená na port D (PD5, PD6) mikrokontroléra. Indikátor pracuje v 4-bitovom režime. Na nastavenie kontrastu sa používa variabilný odpor s nominálnou hodnotou 4,7 kOhm. Pre prácu s indikátorom boli vytvorené vlastné symboly na zobrazenie 8 horizontálnych stĺpcov analyzátora; tieto vlastné symboly zaberajú všetkých 64 bajtov RAM indikátora LCD.
Mikrokontrolér pracuje z externého 16 MHz kremenného rezonátora.
Analógová časť zariadenia je najdôležitejšou časťou a je predzosilňovačom signálu elektretového mikrofónu, ktorého výstup je pripojený na kanál ADC0 ADC zabudovaného v mikrokontroléri. Nulovú úroveň na vstupe ADC potrebujeme nastaviť presne na polovicu referenčného napätia, t.j. 2,5 V. V tomto prípade môžeme použiť kladnú a zápornú polvlnu signálu, ale jej amplitúda by nemala prekročiť stanovenú hranicu, t.j. Zisk musí byť jemne nastavený, aby sa zabránilo preťaženiu. Všetky vyššie uvedené podmienky spĺňa bežný mikroobvod operačného zosilňovača s nízkym výkonom.
Algoritmus DFT je o niečo pomalší v porovnaní s rýchlou Fourierovou transformáciou. Náš spektrálny analyzátor však nevyžaduje vysokú rýchlosť a ak dokáže poskytnúť rýchlosť aktualizácie približne 30 snímok za sekundu, bude to viac než dosť na vizualizáciu spektra zvukového signálu. V každom prípade je v našej verzii možné dosiahnuť rýchlosť 100 snímok za sekundu, ale to je už príliš vysoká hodnota parametra pre dvojriadkový znakový LCD indikátor a neodporúča sa. Vzorkovacia frekvencia je 20 kHz pre 32 bodovú diskrétnu Fourierovu transformáciu a keďže výsledok transformácie je symetrický, stačí nám použiť len prvú polovicu, t.j. prvých 16 výsledkov. Preto môžeme zobraziť frekvenčné spektrum až do 10 kHz a rozlíšenie analyzátora je 10 kHz/16 = 625 Hz.
Autor návrhu sa pokúsil zvýšiť rýchlosť výpočtov DFT. Ak má táto transformácia N bodov, musíme nájsť hodnoty N2/2 sínusu a kosínusu. Pre našu 32-bodovú transformáciu potrebujeme nájsť 512 sínusových a kosínusových hodnôt. Pred ich nájdením však musíme vypočítať uhol (stupne), ktorý zaberie určitý čas procesora, takže bolo rozhodnuté použiť na tieto výpočty tabuľky hodnôt. Pri výpočte v programe mikrokontroléra sa nepoužívajú čísla s pohyblivou rádovou čiarkou a čísla s dvojnásobnou presnosťou, pretože ich spracovanie na 8-bitovom mikrokontroléri bude trvať dlhšie. Namiesto toho hodnoty vo vyhľadávacích tabuľkách používajú 16-bitové celočíselné údaje vynásobené 10 000. Potom sa po vykonaní konverzie výsledky vydelia číslom 10 000. S týmto prístupom je možné vykonať 120 32-bodových konverzií za sekundu , čo je pre naše zariadenia viac než dosť.
Ukážka činnosti spektrálneho analyzátora na mikrokontroléri ATmega32
K stiahnutiu
Zdrojový kód (program mikrokontroléra, tabuľky sínusových, kosínusových a uhlových údajov) -
- Je jasné, že na AVR je ťažké zájsť ďalej ako svetlo a hudba, parametre nie sú v poriadku. Ale 120 32-bodových konverzií za sekundu môže stačiť na väčšinu úloh. A môžete si samozrejme vziať ďalšiu vzorku 625 Hz, alebo skôr stratiť obnovovaciu frekvenciu. Stojí za zmienku, že MK sa bude cítiť zle, pokiaľ ide o výkon, nie je na ňom možné nič iné. Ale tu môžete usporiadať výstup výsledku pomocou hardvérových metód prenosu údajov. Potom to bude pomocný mikrokontrolér a ten hlavný bude z neho iba prijímať dáta a spracovávať ich kompatibilne s inými procesmi. Vo všeobecnosti to stále závisí od frekvencie procesora. Kedysi bolo možné pretaktovať mega nad 20 MHz, no na tieto úlohy sa zrejme dočkáme len glitchov na vysokých frekvenciách. Myšlienka je dobrá, len keby bolo napísaných viac matematických častí... je to jej implementácia na MK
- Urobil som aj zaujímavejšie analyzátory: You Tube alebo verzia na farebnom LCD: You Tube je založená na slávnej Chen knižnici :)
- „Musíme vypočítať uhol (stupne)“ Môže nám niekto povedať podrobnejšie, ako sa vypočítavajú hodnoty pre tieto tabuľky?
- S tabuľkou sínusov a kosínusov je všetko jasné. Nie je jasné, ako sa vypočítavajú hodnoty v tabuľke degree_lookup?