. : New eShop! - Mobilní verze - Pandatron.cz - Pandatron.sk - Diskuzní fórum - Zakázkový vývoj : .
 
FFT na jednočipu
12. ledna 2009 | Pandatron | FFT na jednočipu | Komentářů: 13  

FFT na jednočipu

Příklad knihoven a ukázka jejich použití pro výpočet kmitočtového spektra libovolného signálu.

FFT:
Fourierova transformace je ideální nástroj na provádění konvolučních a korelačních operací. Krom toho hraje důležitou roli při filtraci nežádoucích signálů a to ať již je to šum či libovolný signál mimo požadovaný kmitočtový rozsah zpracovávaného signálu.
Rychlá Fourierova transformace (zkráceně FFT) je poté speciální algoritmus diskrétní Fourierovy transformace, která zpracovává data vzorkovaná s konstantním časovým krokem. Více teorie o FFT a dalších principech je možné nalézt například na Wikipedii
. Jakkoliv jsou však principy FFT složité, je její použití poměrně snadné.

Na internetu je možné nalézt hned celou řadu již hotových knihoven pro FFT a jak pro malé osmibitové mikrokontroléry, tak i pro velké 32b mikroprocesory. Jelikož je jejich princip vždy více méně totožný a my přeci jen nechceme zpracovávat například DVB-X data, hledal jsem na internetu nějakou menší knihovnu, která by byla použitelná i na malém procesoru s omezenými možnostmi. Jako jednu z nejlepších jsem poté zvolil knihovnu pocházející z webu ELM, jejíž odkaz je uveden na konci článku.
Knihovna je napsaná v ANSI-C pro AVR procesory s tím, že samotný FFT algoritmus je napsán v assembleru. Tato skutečnost výrazně urychluje následné zpracování signálů i použití v celé řadě speciálních aplikací.

AVRFFT:
Jde o komplexní a vyladěnou knihovnu od autora ChaN možnou použít v libovolné aplikaci. Celý balík se skládá celkem z osmi souborů.


Obr. 1: Soubory AVRFFT knihovny

Výchozím souborem je fftest.c, ve kterém je základní funkce main() a to na řádku č.66. V té se po úvodní inicializaci v podobě nastavení I/O pinů zajistí čekání na příkaz od PC. Příkaz je vždy v podobě jediného znaku a může být buď „w“ (řádek č.87) pro vyčtení analogového průběhu, nebo „s“ (řádek č.98) pro vyčtení spektra kmitočtů. Obě tyto funkce jsou samozřejmě pro demonstraci možností a jelikož jsou napsány velice přehledně, je možné je snadno nahradit vlastními.
Obě funkce však začínají totožně. Nejprve je voláním funkce void capture_wave (int16_t *buffer, uint16_t count); zajištěno nevzorkování určeného množství analogových hodnot do paměti. Funkce se nachází v tomtéž souboru na řádku č.27 a v jejím úvodu je případně možné upravit vybraný AD kanál. První jí předávanou hodnotou je ukazatel v paměťovém prostoru určeném pro uložení naměřených dat, druhou hodnotou je poté požadovaný počet vzorků. Ten je v podobě konstanty FFT_N definován v souboru ffft.h a může být v rozsahu 64 až 1024 bodů.

Dále se již jednotlivé W a S funkce liší. První z nich jednoduše vyšle naměřené analogové hodnoty do PC, druhá z nich však na naměřené hodnoty ještě použije FFT algoritmu a až poté vyšle do počítače výsledek procesu.

Samotný FFT algoritmus je uveden v assembleru v souboru ffft.S a obsahuje tyto funkce i včetně jejich popisu:
void fft_input (const int16_t *array_src, complex_t *array_bfly);
void fft_execute (complex_t *array_bfly);
void fft_output (complex_t *array_bfly, uint16_t *array_dst);

Jednotlivé funkce by pro FFT měli být spouštěny postupně jedna za druhou, neboť každá provádí pouze určenou funkci. První z nich vyplní tabulku naměřenými hodnotami včetně vytvoření hammingova okna. Druhá funkce provede samotné zpracování hodnot a poslední vyčte výsledek pro další zpracování.
Výsledkem této FFT operace je naplnění pole spektrum[], vekterém jsou již hodnoty připraveny k dalšímu zpracování (zde tedy odeslání do PC).

Samotná přesnost (a kmitočtový krok) výstupních dat závisí na nastavení již zmíněné konstanty FFT_N. V následující tabulce je uvedena doba trvání jednotlivých výpočetních funkcí i celého algoritmu v závislosti na nastaveném počtu vzorků.

;----------------------------------------------------------------------------;
; 16bit fixed-point FFT performance with MegaAVRs
; (Running at 16MHz/internal SRAM)
;
;  Points:   Input, Execute,  Output,    Total:  Throughput
;   64pts:   .17ms,   2.0ms,   1.2ms,    3.4ms:   19.0kpps
;  128pts:   .33ms,   4.6ms,   2.4ms,    7.3ms:   17.5kpps
;  256pts:   .66ms,  10.4ms,   4.9ms,   15.9ms:   16.1kpps
;  512pts:   1.3ms,  23.2ms,   9.7ms,   34.2ms:   14.9kpps
; 1024pts:   2.7ms,  51.7ms,  19.4ms,   73.7ms:   13.9kpps
;----------------------------------------------------------------------------;

Příklad použití:
Něž byla knihovna použita v aplikaci a než byl napsán tento článek, byla samozřejmě ověřena její funkce. Podle následujícího zapojení byl zapojen procesor ATmega64.


Obr. 2: Schéma zapojení

Analogový signál z generátoru funkcí byl přímo přiveden na pin č.35 (samozřejmě je potřeba zajistit jeho optimální velikost nepřesahující VDD). Sériový port je přes libovolný RS232(USB)/TTL převodník připojen na piny č.31 a 32.

Modifikované knihovny vhodné pro tento procesor jsou opět ke stažení na konci článku.


Obr. 3: Pojistky procesoru ATmega64

Naměřené hodnoty:
Aktuálním výstupem pro vypočtená data je libovolný počítač se zapnutým terminálem. Data obsahující spektrum kmitočtů jsou vysílána v podobě svislého frekvenčního grafu.

Tak například sinusový a obdélníkový signál s frekvencí 1kHz nasnímaný s hodnotou FFT_N=64 vypadají následovně:

1kHz sinus FFT_N=64
   0: 1486 **
   1:  683 *
   2:  144
   3:11373 **********************
   4:21490 *****************************************
   5: 7311 **************
   6:  116
   7:  891 *
   8: 1265 **
   9:  366
  10:  312
  11: 3930 *******
  12: 4882 *********
  13:  969 *
  14:  187
  15:  730 *
  16:  689 *
  17:  248
  18:  379
  19: 1480 **
  20: 1176 **
  21:  193
  22:  230
  23:  251
  24:  208
  25:  313
  26:  218
  27:  177
  28:  100
  29:  286
  30:   96
  31:  176
input=41, execute=495, output=303 (x64clk)
 
1kHz obdelnik FFT_N=64
   0: 1004 *
   1:  556 *
   2: 1312 **
   3:11387 **********************
   4:22304 *******************************************
   5: 8144 ***************
   6: 1515 **
   7:  502
   8:  967 *
   9:  832 *
  10: 1024 **
  11: 5136 **********
  12: 6954 *************
  13: 2436 ****
  14: 1562 ***
  15:  747 *
  16:  762 *
  17: 1087 **
  18:  821 *
  19: 3805 *******
  20: 3772 *******
  21: 2089 ****
  22: 1437 **
  23: 1022 *
  24:  478
  25: 1218 **
  26:  904 *
  27: 3055 *****
  28: 2634 *****
  29: 2473 ****
  30: 1181 **
  31: 1195 **
input=42, execute=495, output=302 (x64clk)

Naměřená data je možné snadno vyjmout a přenést například do Excelu pro vytvoření obrázkového grafu:


Obr. 4: Graf vytvořený z dat (1kHz obdélník FFT_N=512)

Na konci článku je poté ke stažení soubor s dalšími změřenými daty.

Závěr:
Knihovny AVRFFT autora ChaN se tedy ukázaly jako velice ideální pro konstrukci zařízení vyžadujících použití FFT. Přitom se nemusí jednat jen o speciální rádiové přijímače a měřící zařízení. Knihovny mohou posloužit i pro stavbu různých audio spektrálních analyzátorů zobrazujících výsledek v podobě grafu na displeji a podobně.

Odkazy & Download:
Domovská stránka autora knihoven - http://elm-chan.org

Oficiální AVRFFT knihovny - http://elm-chan.org/docs/avrlib/avrfft.zip
Modifikované knihovny pro ATmega64 - DOWNLOAD
Změřené průběhy - DOWNLOAD







GooglePlus1 FaceBook Twitter del.icio.us DiGG Google StumbleUpon Google Buzz Email RSS PDF Tisk

Komentáře (13):

Zobrazit starší 30 dnů (13)...

13. Dne 02. 01. 2011 v 11:12 zaslal StandaM
Numericka chyba
Implementace je to moc hezka - nez jsem si napsal vlastni (DIT radix 2), tak jsem ji po drobnych upravach pouzival. Nicmene je tam jedna z meho pohledu zasadni vada na krase: autor budto z optimalizacnich duvodu ci omylem povazuje operaci x/2 za totoznou s x>>1, coz ovsem pro negativni cisla neplati. Vysledkem je, ze s kazdou dalsi sekci algoritmu roste numericka chyba a zhorsuje se odstup signal/sum. Pro nejaky zobrazovac spektra u audio aplikaci to je fuk (na to by mozna stacilo i 8 bit misto 16), ale pokud se vysledky transformace maji pouzit k nejakym smysluplnym vypoctum, jako treba vypocet zkresleni nebo primo k mereni odstupu S/N ...


Název příspěvku: Vaše jméno: host
                 
  Zakázat formátování [Zakáže kódování a nahrazování smajlíky.]
Připojit soubory
reklama:
M66 QUECTEL
Quad-Band GSM/GPRS SMD modul s Bluetooth a rozměry 15,8 x 17,7 mm.
Skladem od 289 Kč

Informace uvedené v článcích jsou platné v době jejich vydání a samotné články jsou určeny pouze jako zdroj informací. Autor článku ani správce webu nenesou žádnou zodpovědnost za případné újmy na majetku a zdraví. Názvy společností a výrobků, loga a další multimediální materiál mohou být ochrannými známkami příslušných společností.
RSS kanály: | |
+420 723 846 377
info@pandatron.cz
Všechna práva vyhrazena | mobilní verze | © Copyright 2000 - 2016 ISSN 1803-6007