FFT algoritmus
VFX
vinczef at westel900.net
Thu Nov 16 20:20:31 CET 2000
Hali!
Szelindi Gabor wrote:
>
> Sziasztok!
>
> Problemam a kovetkezo: elvileg FFT-t csak 2 egesz szamu hatvanyanak
> megfelelo szamu mintara lehet kiszamolni. De mi van akkor, ha a mintak
> szama nem pont ennyi? Es nem is kicsit ter el, hanem pl 800 mintara kene
> FFT-t szamolni. Van valami algoritmus, ami szerint ki kell egesziteni a
> mintasorozatot 0-kal, addig mig 2 egsz szamu hatvanyat nem kapjuk. De ekkor
> torz eredmenyt kapunk. Allitolag ekkor valami korrekciot kell bevetni, de
> milyet, hogyan?
>
> Udv,
> Gabor
Kostansok es egyebek nelkul itt egy progi ADSP21020-ra. Remelem
kimazsolazhato a mag.
Lebegopontos szamabrazolas, a muveletek eleg erthetoek (a DM() & PM()
memoria muveletek)
UDV. VFX.
{_______________________________________________________________________
DFT.ASM ADSP-21020 Discrete Fourier Transform
This routine performs an N point real DFT according to the following
equation:
N-1
real(k)+j*imag(k) = SUM input(n)[C - j*S]; k=0 to N-1
n=0
where: C=cos(2*pi*k*n/N), S=sin(2*pi*k*n/N), j=sqrt(-1)
Author: 27-APR-91, Steven Cox, Analog Devices DSP Div. (617) 461-3672
_________________________________________________________________________}
{ Constant for number of points in input }
#define N 64
.SEGMENT/DM dm_data; { Declare variables in data memory }
.VAR input[N]= "inreal.dat";
.VAR real[N];
.VAR imag[N];
.ENDSEG;
.SEGMENT/PM pm_data; { Sine array is N points of one cycle }
.VAR sine[N]= "sine.dat"; { Cosine is derived using a shifted }
.ENDSEG; { pointer to this circular buffer.}
.SEGMENT/PM rst_svc; { The reset vector resides in this space }
dmwait=0X21; { Set data memory waitstates to zero }
pmwait=0X21; { Set program memory waitstates to zero }
jump start;
.ENDSEG;
.SEGMENT/PM pm_code; { Example setup for DFT routine }
start: m1=1;
m9=1;
b0=input;
l0=@input; { Input buffer is circular }
i1=imag;
l1=0;
call dft (db); { Example delayed call instruction }
i2=real; { In delay field of call }
l2=0; { '' }
end: idle;
{___________________________DFT Subroutine___________________________}
dft: b8=sine; { Sine pointer }
l8=@sine;
b9=sine; { Derive cosine from sine by }
i9=sine+N/4; { shifting pointer over 2pi/4 }
l9=@sine; { and using a circular buffer.}
i10=0; { I10 is used to increment the }
l10=0; { frequency of sine lookup.}
f15=0; { Zero to clear accumulators }
lcntr=N, do outer until lce;
f8=pass f15, m8=i10; { Update frequency }
f9=pass f15, f0=dm(i0,m1), f5=pm(i9,m8);
f12=f0*f5, f4=pm(i8,m8);
lcntr=N-1, do inner until lce;
f13=f0*f4, f9=f9+f12, f0=dm(i0,m1), f5=pm(i9,m8);
inner: f12=f0*f5, f8=f8-f13, f4=pm(i8,m8);
f13=f0*f4, f9=f9+f12;
f8=f8-f13, dm(i2,m1)=f9; { Write real result }
modify(i10,m9); { Increment frequency }
outer: dm(i1,m1)=f8; { Write imaginary result }
rts;
.ENDSEG;
More information about the Elektro
mailing list