Verze pro tisk

Rychlá Fourierova transformace na AVR

Rychlá Fourierova transformace (FFT) slouží k převodu signálů z časové do frekvenční oblasti, inverzní (zpětná) Fourierova fransformace (IFFT) slouží k opačnému převodu. Jedná se o rychlou verzi diskrétní Fourierovy transformace (DFT). FFT je převážně doménou PCček a signálových procesorů (DSP), které jsou pro tento druh výpočtu patřičně výkonově vybavené. Možná proto si málokdo dokáže představit real-time výpočet FFT na 8-bitovém jednočipovém mikropočítači. Dnešní jednočipy ale dosahují výpočetních výkonů i přes 20 MIPS a proto tato představa není nereálná. Já jsem se ze zvědavosti pokusila tuto představu realizovat a výsledek mě pozitivně překvapil. Napsaný software zvládá real-time výpočet FFT a IFFT řádu 6 (64 bodů) na procesoru ATmega32 16MHz při vzorkovací frekvenci 3200Hz, data získaná FFT zobrazuje na LCD a ještě mu zbývá přes 40% výpočetního výkonu na případné další operace. Řád FFT je omezen velikostí vnitřní SRAM (2KB), na procesorech ATmega8 a ATmega16 lze se stejnými výsledky realizovat výpočet FFT řádu 5 (mají jen 1KB SRAM), na procesorech ATmega64 a 128 (4KB SRAM) by bylo možno počítat FFT až do řádu 7 (128 bodů).

Výpočet je prováděn v pevné řádové čárce, čísla jsou ve formátu 16.16 (16 bitů celá část, 16 bitů desetinná část). Jedno komplexní číslo tedy v paměti zabírá 8 bytů. Program je optimalizován na rychlost a přesnost, je při něm využito všech 32 vnitřních registrů procesoru. Délka celého programu včetně lookup tabulek s twiddle faktory je 2560 bytů. Přesnost výpočtu je velmi dobrá (pro některé aplikace možná až zbytečně), ve srovnání s MATLABem se vypočtené hodnoty liší až na čtvrtém desetinném místě. Pro vzorkování a výpočet je použita dvojice bufferů, obsah jednoho bufferu se vysílá ven přes PWM a zároveň plní novými hodnotami z A/D převodníku, paralelně s tím se obsah druhého bufferu zpracovává. Po provedení všech výpočtů a naplnění bufferu, do kterého se vzorkuje, se buffery prohodí. Vstupní signál se tedy nepřetržitě vzorkuje, fransformuje, zobrazuje, zpětně transformuje a převádí zpět na analogovou hodnotu. Parametry výpočtu jsou následující:

Parametry transformace na ATmega32, 16MHz:

Algoritmus výpočtu: Cooley-Tukey s decimací ve frekvenci (DIF), Radix-2

Počet bodů FFT (IFFT): 64

Vzorkovací frekvence: 3200 Hz

Rozlišení ve frekvenci: 50 Hz

Zobrazení: bargraf 16 sloupců na 2*16 znakovém LCD (zobrazuje se 16 dolních spektrálních čar)

Doba vzorkování: 20 ms (doba vzorkování 64 vzorků)

Doba výpočtu FFT: 4.04 ms

Doba výpočtu IFFT: 4.16 ms

Doba řazení dat (bitinverze): 222 us (provádí se dvakrát)

Doba zobrazování na LCD: 2.31 ms (včetně výpočtu absolutních hodnot)

Zbývá: cca 9ms

Možná oblast použití je široká, od efektního zobrazování spektra na domácím audio zesilovači, přes harmonickou analýzu sítě (do 32. harmonické) až po různé typy modulací, filtrací a kódování.

Následujících několik fotografií zachycuje spektra různých signálů v podobě sloupcového grafu, tak jak jsou vypočtena realizovaným algoritmem FFT. Zobrazuje se celkem 16 frekvencí od 0Hz do 750Hz s krokem 50Hz. Ač to není z obrázků patrné, výpočet probíhá v reálném čase a údaj na displeji se obnovuje každých 20 ms. Protože by byl při analýze neharmonických signálů (např. hudby) pohyb spektrálních čar pro lidské oko příliš rychlý a nepříjemný, je pohyb sloupců směrem dolů zpomalen, někdy bývá tento režim označován jako "slow decay".

Spektrum sinusového signálu 50 Hz Spektrum sinusového signálu 50 Hz
Spektrum sinusového signálu 80 Hz Spektrum sinusového signálu 80 Hz
Spektrum sinusového signálu 100 Hz Spektrum sinusového signálu 100 Hz
Spektrum sinusového signálu 230 Hz Spektrum sinusového signálu 230 Hz
Spektrum obdélníkového signálu 50 Hz Spektrum obdélníkového signálu 50 Hz
Takto vypadá spektrum písničky Rain
od Madonny někde na začátku druhé minuty :)
Spektrum písničky Rain od Madonny

Na následujících oscilogramech jsou zachyceny průběhy signálů po A/D převodu, provedení dopředné a zpětné Fourierovy transformace a následném převedení zpět do analogové podoby. K D/A převodu je použita 8-bitová PWM 31,25 kHz s aktivním filtrem typu Butterworth 2. řádu se zlomovou frekvencí 1600 Hz. Z obrázků není zcela zřejmá doba zpoždění mezi vstupním a výstupním signálem, jedná se od dvě délky vzorkovacích bufferů tj. o 40ms.

Stopa 1 (horní): sinusový signál 50 Hz před transformací
Stopa 2 (dolní): sinusový signál 50 Hz po průchodu řetězcem ADC - FFT - IFFT - DAC (PWM) - filtr
sinusový signál 50 Hz před a po transformaci
Stopa 1 (hladká): sinusový signál 200 Hz před transformací
Stopa 2 (zubatá): sinusový signál 200 Hz po průchodu řetězcem ADC - FFT - IFFT - DAC (PWM) - filtr
sinusový signál 200 Hz před a po transformaci