;************************************************************************ ; Transformee de Fourier rapide (FFT) ; ; Benoit Decoux, cours-TP DSP 2002-2003, EFREI ;************************************************************************ include 'fft.asm' ; macroinstruction du calcul de la TFR ; DEFINITION des adresses des registres utilisés ;************************************************************************* M_PCTL equ x:$FFFFFD ; registre de commande de la PLL M_BCR equ x:$FFFFFB ; registre de commande des BUS ; DEFINITION des constantes ;************************************************************************* points equ 64 ; nombre de points de la TFR pi equ 3.141592654 ; no comment np equ 8 freq2 equ 2.0*pi/@cvf(points/np) ; "fréquence" du signal de test cosinus : 'np' périodes dans le tableau de 'points' valeurs data equ $100 ; adresse mémoire de la zone de données à traiter coef equ data+points ; adresse mémoire de la zone de mémorisation des facteurs de phase affi equ $160 ; adresse mémoire de la zone de mémorisation des résultats de la FFT freq equ 2.0*pi/@cvf(points) ; 1 période de sinus sur 'point' pour les facteurs de phase W(n,k) ; allocations en memoire X ;************************************************************************* org x:data ds points ; pour les données à traiter org x:coef ; ligne facultative puisque l'adresse 'coef' est à la suite de 'data' ds points/2 ; pour les cos & sin utilisés par la FFT org x:affi ds points ; pour les résultats du traitement ; allocations en memoire Y ;************************************************************************* org y:data ds points ; idem pour parties imaginaires org y:coef ds points/2 ;***************table generation macro*********************************** ; Sine-Cosine Table Generator ; ; sincosr - macro to generate sine and cosine coefficient ; lookup tables for Decimation in Time FFT ; twiddle factors. Only points/2 coefficients ; are generted. ; points - number of points (2 - 32768, power of 2) ; coef - base address of sine/cosine table ; negative cosine value in X memory ; negative sine value in Y memory ;************************************************************************** sincosr macro points,coef sincosr ident 1,1 org x:coef count set 0 dup points/2 dc @cos(@cvf(count)*freq) count set count+1 endm org y:coef count set 0 dup points/2 dc @sin(@cvf(count)*freq) count set count+1 endm endm ; fin macro sincos ; macro de génération de signal de test (cosinus) ;*********************************************** sigtst macro points,coef org x:data count set 0 ; generate a cosine input dup points dc @cos(@cvf(count)*freq2)/256 count set count+1 endm ; fin de la boucle dup org y:data count set 0 ; 0 fill the corresponding imaginary input dup points dc 0 count set count+1 endm ; fin de la boucle dup endm ; fin de la macro sincosr points,coef ; macro à lancer avant le programme : sigtst points,coef ; elle contiennent des directives d'assemblage ; Programme principal ;********************************** org p:$100 START main movep #$040003,x:M_PCTL ; set PLL for MPY of 4X movep #$012421,x:M_BCR ; set up one ext. wait state for all AAR areas ori #3,mr ; mask interrupts movec #0,sp ; clear hardware stack pointer move #0,omr ; operating mode 0 fft points,data,coef jsr module jmp * ; routine de calcul du module au carre et de re-arrangement ;********************************************************** module move #data,R3 ; R3 pointe en début de tableau des sorties de la FFT (pour les parties réelles) move R3,R4 ; R4 pointe en début de tableau (pour les parties imaginaires) move #affi,R2 move #0,M3 ; R3 en adressage binaire inversé pour remettre les résultats dans l'ordre naturel move M3,M4 ; idem pour R4 move #points/2,N3 ; adressage binaire inversé sur 'points/2' points (moitié du tableau) move N3,N4 ; idem pour R4 debmod do #points,finmod ; boucle de 'points' itérations move X:(R3)+N3,X0 move Y:(R4)+N4,Y0 mpy X0,X0,A macr Y0,Y0,A move A,X:(R2)+ finmod rts end