

OT: Potřeboval bych pochopit Fourierovu transformaci, ale potřebuju nakopnout
Ahoj,
dělám zesilovač a jako jednu z komponent bych tam rád dal spektrální analyzátor (čip tam bude PIC16F887 @ 24Mhz, vývojové prostředí mikroC PRO). Strávil jsem pár hodin hledáním na Googlu, jaký algoritmus/teorie by pro mě byly vhodné a našel jsem Fourierovu transformaci, konkrétně rychlou Fourierovu transformaci (FFT). Našel jsem tenhle zdroj i s příklady, ale pořád to 100% nechápu (nechci to jen jednoduše zkopírovat, ale napsat si to sám):
http://www.codeproject.com/KB/recipes/howtofft.asp x
Teď popíšu, jak to chápu:
Musíme mít analogový signál - ten převedeme do vzorků
Píše se tam, že vstupní pole musí být z komplexních čísel - reálná složka čas a imaginární "napětí"? Nebo naopak?
kde počet těchto vzorků musí být mocnina dvou.
2. Otočit u první půlky reálnou a imaginární část??
3. A tady už to pomalu přestávám chápat, jak přichází na řadu ten Danielson-Lanzcos
Dokázal by mě nějaký dobrák nakopnout a přeložit "do lidštiny", co píší v tom odkazu? Byl bych neskonale vděčný. Můj mat. aparát končí asi někde u konce třetího ročníku SŠ (cca. základy integrálů a derivací), proto bych byl rád, kdybyste se snažili vysvětlit mi to polopatě .
Díky moc za všechny odpovědi.
metod je vice, zkus se podivat na toto, snad to lepe pochopis...
http://elektronika.kvalitne.cz/ATMEL/necoteorie/tr ansformation/AVRFFT/AVRFFT.html
Tak je mi to zase o trochu jasnější
Takže u Cooley-Tukey algoritmu je jako první krok třeba udělat bitovou inverzi vstupního pole a poté to "motýlkové" zpřeházení viz obrázek?
![[http://elektronika.kvalitne.cz/ATMEL/necoteorie/tr ansformation/AVRFFT/obr/butterfly_DITFFTR21.png]](http://elektronika.kvalitne.cz/ATMEL/necoteorie/transformation/AVRFFT/obr/butterfly_DITFFTR21.png)
Když budu mít tedy 64 (256) vzorků, tak bude třeba tohle provést 6 resp. 8 zpřeházení (vždy N, kde 2^N = počet vzorků)?
A potom se tam píše, že je třeba provést vlastní FFT. A tam už mi to není jasné, pokoušel jsem si přepsat ten algoritmus do mat. výrazů, ale bez úspěchu. Konkrétně se mi jedná o tenhle kód:
Hele já se Tě jenom trošku zeptám... K čemu je dobrá ta Furiérova transformace ( jestli to jde nějak vysvětlit ).
Chci si postavit spektrální analyzátor - watch
A nechci tam cpát 10-30 analogových filtrů, PIC stejnak nemá ani tolik analogových vstupů. Takhle mi to spočítá, jaké všechny frekvence vzorek hudby obsahuje a dá se s tím krásně pracovat. Taky to využiju do dig. osciloskopu a spekt. analyzátoru s PICama.
Jinak význam té fourierovy transformace spočívá v tom, že ty máš nějakej signál:
![[http://ac3filter.net/files/docs/ac3filter_1_30b/pi c_loudness/a_signal.png]](http://ac3filter.net/files/docs/ac3filter_1_30b/pic_loudness/a_signal.png)
![[spec50.jpg]](http://www.nitehawk.com/rasmit/spec50.jpg)
Třeba po 100 mikrosekundách si zapíšeš hodnoty - třeba 0,7V;1,2V,1,1V,0,2V atd. To proženeš fourierem a vyhodí ti to komplexní čísla - ve výsledku pak dostaneš informace o tom, jaké tam jsou frekvence (třeba 200Hz, 1100Hz, 2200Hz) a jejich amplituda ("síla") a z toho vytvoříš takovýto podobný graf:
Toto konkrétně vypadá na spektrum obdélníkového signálu.
Když jsem někde napsal blbost, tak mě opravte, taky v tom nejsem zběhlej
.
U toho youtube odkazu ma odkaz na postup - je tem i nekompilovaný kód na Atmega8 http://diy.elektroda.eu/analizator-widma-akustyczn ego/. Třeba tam něco najdeš, je to polsky - a já tam nic jako FFt nenašel.
popis zpracovani signalu od str. 9, DFT od str. 15 BP.pdf
algoritmus Cooley-Turkey - od str. 49 https://dip.felk.cvut.cz/browse/pdfcache/zdarsj1_2 007bach.pdf
Tohle si prectu
, abych nevypadnul ze cviku. Mozna se matika stane opet mym konickem (na vejsce me od ni dokonale odradili).
Je to věda o lži, to se hodí.
To su zlozite veci tykajuce sa rozkladu periodickeho signalu, zabudni na to ze to pochopis sposobom ze 2 jablka + 2 jablka = 4 jablka :) Teoria sa hra so zlozitymi diferencialnymi rovnicami a nekonecnymi radami a ja neviem co vsetko (ja osobne som tie dokazy do detailu tiez nechapal a verim ze to okrem uja Fouriera nechape nikto :D, a veria tomu co ujo Fourier povedal ze to tak sa da urobit a ze to plati, a nelamu si s tym viac hlavu :D)
Zober nejaky algoritmus a pouzi. Algoritmov je mnoho roznych, vyber si taky ktory ti najviac vyhovuje co sa tyka moznosti toho uC. Osobne si nie som isty ci ti to bude uC stihat, povedal by som ze nebude, takze sa snaz hladat algoritmus s minimom vypoctovych operacii a s minimom potrebnej RAM (asi http://en.wikipedia.org/wiki/Split-radix_FFT_algor ithm, neviem zhlavy)
V principe FFT je par problemov z dovodu ze ta analyza akokeby zobere tvoj "vysek" signalu a urobi z neho periodicky signal - t.j. polozi ten vysek za sebou nekonecne vela krat, a to sa analyzuje. Z toho vyplyva ze vlnova dlzka minimalnej zdetekovanej frekvencie sa rovna dlzke vzorky, t.j. ked budes analyzovat len 41 vzoriek pri 41kHz vzorkovacej frekvecnii tak nemozes tam v tom detekovat frekvencie nizsie ako 1kHz. Ked chces detekovat aj frekvencie napr. 20Hz tak musis zobrat aspon 2050 vzoriek.
Druha vec je tusim ze ziskas silu nejakych klucovych (harmonickych) frekvencii, ktore ale nemusia byt nutne to co bolo na vstupe nepriklad ak mas cistu sinusovku 1kHz a tvoja transformacia analyzuje 100, 200, 400, 800, 1600, 3400, atd Hz, tak zistis ze tvoja 1kHz neni 1kHz ale zmes 800 a 1600 Hz alebo tak nejak, uz neviem zhlavy (pisem zhlavy takze to ber s rezervou, FFT som nevidel uz asi 10 rokov a nechce sa mi to znova studovat vsetko).
Citaj wikipediu apod. Idealne ak si najdes rovno nejaky zdrojak spektralneho analyzera, aby si tam v tom videl jaku to presne bere dlzkou vzorky a jake s tym tam potom robi finty aby odrbal problemy popisane vyssie, resp. jak ten cely analyzer je urobeny.
Kukni si napr. tu
http://www.relisoft.com/Science/Physics/sound.html
citaj a klikaj na next, next, je to tam pekne vysvetlene uplne od zakladov (ten web som si cital kedysi davno ked som robil analyzer s FFT). Strana 6 je nakoniec samotne FFT a je tam aj nejaky jednoduchy priklad z ktoreho by ti malo byt jasne jak vytvara zo vzoriek tie komplexne cisla a co s nimi robi. Uplne na konci je aj link na stiahnutie zdrojakov frequencneho analyzera. Ten som nikdy nepouzil takze neviem co to je zac :)
Este k tvojmu konkretnemu dotazu o tom komplexnom poli, na tom tvojom webe:
T.j. do komplexneho pola nadrbes tvoje vzorky do realnej casti, imaginarna cast naplnis nulami. Ak to tam spravne chapem to co tam pise.
Potom na to pustis tie vsetky algoritmy a vypadne ti z toho vysledok ako pole komplexnych cisel.
Ak to pole obsahovalo tolko komplexnych cisel kolko je tvoja samplovacia frekvencia (t.j. naplnil si to 1 sekundovym usekom) tak kazdy prvok (komplexne cislo) pola zodpoveda jednej zanalyzovanej frekvencii s krokom 1Hz (ak tam nacpes pocet vzoriek rovny polovici vzorkovacej frekvencie t.j. 0,5s usek tak mas vysledky s krokom 2Hz, atd)
T.j. vyslednu silu signalu (pre nejaku frekvenciu) z prislusneho komplexneho cisla vyratas ako velkost vektora komplexneho cisla, t.j. z pytagorovej vety, druha odmocnina z (realna cast ^ 2 + imaginarna cast ^ 2).
Ak to spravne chapem. Pisem FFT som to 10rokov nevidel tak to ber s rezervou :)
P.S. skus si ale najst efektivnejsi algoritmus, skus pohladat Split-radix, ptz toto co si nasiel asi neni najefektivnejsi (ten danielson lanczos je z 1942 ci kolko, split-radix je z 1984). Ale neviem zhlavy ktory je najefektivnejsi. Na wikipedii pisu ze split-radix.
Díky a sorry, že jsem se k tomu dostal až teď. Našel jsem Split Radix:
) Nepotřebuju nic superpřesného, stačí mi bohatě těch 8 frekvencí, je to do zesilovače jen pro parádu, aby se tam něco hejbalo
). Hodil jsem to do mého zdrojáku, vložil tam nějaká data (funkci sinus, kroky po 0.3):
http://www.mit.edu/~emin/source_code/fft/index.htm l
To se mi zdálo ze všech kodů zatím nejstravitelnější (dá se to "pochopit" stylem 2 hrušky + 2 hrušky = 4 hrušky
A vyplivlo mi to:
Už tohle je úspěch, že to "něco" spočítalo a vypadá to, že by to mohlo být dobře (jedna hlavní frekvence a potom malinké další, které tam vznikly tím, že mezi jednotlivými vzorky je nějaká doba a kdybych si nakreslil graf, tak tam budou ostré hrany = spousta malých sinusovek). Tys mi popsal způsob získání dat o frekvenci a amplitudě u Danielsona-Lanzcose, tady je to úplně to samé? Všechno nejlíp chápu z příkladů, mohl bys mi prosím napsat, jak by to vypadalo při vzorkovací frekvenci 100Hz? Vstupní pole jsem udělal jako sinus v krocích po 0.3, 2 pi je cca. 6.3, tedy 21 samplů na jednu plnou sinusovku, 0.21s jedna sinusovka = cca. 4,76Hz a amplituda 1.
Uf, tak jsem na konci. Nepotřeboval jsem fourierovu transformaci, stačil mi Goertzelův algoritmus:
Goertzel_algorithm
Díky všem za pomoc.
Alespon sis rozsiril obzory.