;*************************************************************************************** ; Transformee de Fourier rapide (FFT) ; Version avec calcul du module du resultat et remise dans l'ordre des sorties ; 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 $190 ; 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) data2 equ $200 ; 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 org x:data2 ds points ; allocations en memoire Y ;************************************************************************* org y:data ds points ; idem pour parties imaginaires org y:coef ds points/2 org y:data2 ds points ; macro de génération de signal de test (cosinus) ;*********************************************** sigtst macro points,coef org x:data2 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:data2 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 ; macros à 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 jsr copsig ; (variables utilisées : points,data,data2) do #100,finfft boucle fft points,data,coef ; macro de calcul de la FFT jsr module ; routine de calcul du module jsr copsig ; (variables utilisées : points,data,data2) nop finfft jmp * ; routine de calcul du module au carre ;************************************** module move #affi,R3 ; R3 pointe en début de tableau des parties réelles des coef de fourier move R3,R4 ; R4 pointe en début de tableau des 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 ;recopie du signal de test de la zone 'data2' vers la zone 'data' en adressage bits inverses ;******************************************************************************************* copsig move #-1,m0 move m0,m1 ;parties réelles move #data2,r0 move #data,r1 do #points,fincop1 move x:(r0)+,x0 move x0,x:(r1)+ fincop1 ;parties imaginaires move #data2,r0 move #data,r1 do #points,fincop2 move y:(r0)+,x0 move x0,y:(r1)+ fincop2 rts end