

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.
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.