Rychlá Fourierova transformace (FFT) do ATmega64

Ahoj, nedelal nekdo FFT vcetne faze do nejakeho AVR? Na netu jsem brouzdal a neco jsem nasel ale nepocita to fazi. Popripade poradili byste mi prosim jak na to?

:arrow_right: administrator: přejmenováno z "FFT do ATmega64"

Tak jsem nasel na strankach (elektronika.kvalitne.cz/ATMEL/necoteorie/transformation/AVRFFT/AVRFFT.html) popis jednoho programku, jenom nerozumim moc FFT. Kdyz mam komplexni cislo, pak amplituda by mela bejt
AMPLITUDA=sqrt(RE^2+IM^2)
a faze pak asi
FAZE=> sin^-1(FAZE)=RE/AMPLITUDA
Je to tak? Jenom jak to udelat? pouzit tabulku s hodnotama sinu?

:arrow_right: administrator: příspěvek byl upraven
Opraven zápis URL.

Sinus úhlu je protilehlá/přepona. Protilehlá (svislá) je imaginární část, tedy:
sin(fi)=Im/amplituda => fi = arcsin(Im/ampl)
Obdobně to lze zjistit pomocí kosínu.

Jesli použít tabulku nebo výpočet bude asi nejvíc záležet na tom, kolik máš na výpočet času a v jakym formátu to počítáš(tabulka pro 16 bit by se ti asi nevešla :slight_smile:).

Edit: uvedený zdroj počítá v 16bitech (podle popisu, do kódu jsem nekoukal), takže jedině aproximace goniom. fce.

Dekuju:-) Udelal jsem v matlabu tabulku tak to tam zkusim nejak nabouchat a uvidim:-)

Ahoj, tak jsem an tom zacal zase delat, tak amplitudu z tech knihoven dostanu. Mam porad problem s tim vypoctem uhlu. Pouzivam ASM knihovny ffft ktere se voleji z C. Vsechno je rozdelene do 3 bloku. Chtel jsem si vzit bfly_buff po 2. funkci v C. Ale to bohuzel nejde. Potreboval bych to nejak dostat z toho ASM ale tam se v tom celkem ztracim. :frowning:

.global fft_output
.func fft_output
fft_output:
pushw T2H,T2L
pushw T4H,T4L
pushw T6H,T6L
pushw T8H,T8L
pushw T10H,T10L
pushw AH,AL
pushw YH,YL

movw	T10L, EL			;T10 = array_bfly;
movw	YL, DL				;Y = array_output;
ldiw	ZH,ZL, tbl_bitrev		;Z = tbl_bitrev;
clr	EH				;Zero

#ifdef INPUT_IQ
ldiw AH,AL, FFT_N ;A = FFT_N; (plus/minus)
#else
ldiw AH,AL, FFT_N / 2 ;A = FFT_N / 2; (plus only)
#endif
1: lpmw XH,XL, Z+ ;X = *Z++;
addw XH,XL, T10H,T10L ;X += array_bfly;
ldw BH,BL, X+ ;B = *X++;
ldw CH,CL, X+ ;C = *X++;
FMULS16 T4H,T4L,T2H,T2L, BH,BL, BH,BL ;T4:T2 = B * B;
FMULS16 T8H,T8L,T6H,T6L, CH,CL, CH,CL ;T8:T6 = C * C;
addd T4H,T4L,T2H,T2L, T8H,T8L,T6H,T6L;T4:T2 += T8:T6;
SQRT32 ;B = sqrt(T4:T2);
stw Y+, BH,BL ;*Y++ = B;
subiw AH,AL, 1 ;while(–A)
rjne 1b ;/

popw	YH,YL
popw	AH,AL
popw	T10H,T10L
popw	T8H,T8L
popw	T6H,T6L
popw	T4H,T4L
popw	T2H,T2L
clr	r1
ret

.endfunc

Nevim ale asi bych potreboval hodnoty tesne pred tim nasobenim ;T4:T2 = B * B; abych z tehle hodnot dopocitat uhel. Uhel potrebuju pocitat jenom pro jednu caru.

Prosim pomozte :frowning:
FFT.rar (155 KB)

Vyřešeno. Uz pocita spektrum i uhel :wink:

Este ze sisa podelil

Tak sa stym trocha hram, pri pretaktovani previdnika na at mega2560 to vie ukazovat az do 20kHz co je velmi pekne.
Makol som natrepal tam 63 stlpcov a viac menej zbytocne je to sice funkcne ale opticky nic moc. F max som dal na 11kHz.

Pouzit len 16stlpcov sa mi vidi rozumnejsie. Tj zobrazovat len to hlavne v spodnej casti spektra a par hodnot z zvysku po f max.