Update 'soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s'

This commit is contained in:
Oussama Hannouch 2023-05-23 21:38:59 +02:00
parent 4d5df875ef
commit 5fad572de4

View file

@ -1,4 +1,4 @@
PRESERVE8
PRESERVE8
THUMB
@ -10,7 +10,7 @@
;Section RAM (read write):
area maram,data,readwrite
; ===============================================================================================
@ -19,46 +19,47 @@
;Section ROM code (read only) :
area moncode,code,readonly
; écrire le code ici
export DFT_ModuleAuCarre
;for i in 0...63
;signal[i]*Cos[k*i]
; écrire le code ici
export DFT_ModuleAuCarre
DFT_ModuleAuCarre proc
push {r4, r5, r6, r8, r9, r10} ;
mov r2, #0 ; partie imaginaire = 0
mov r3, #0 ; partie reelle = 0
mov r7, #0 ; compteur pour parcourir les tableaux "TabCos" et "TabSin"
mov r4, #0 ; compteur pour parcourir le signal d'entrée
ldr r5, =TabCos ; les adresses du tableau "TabCos"
ldr r6, =TabSin ; les adresses du tableau "TabSin"
SumLoop
ldrsh r8, [r0, r4, lsl #1] ; Chargement des éléments du signal d'entrée
ldrsh r9, [r5, r7, lsl #1] ;Cos
ldrsh r10,[r6, r7, lsl #1] ;Sin
mul r9, r8, r9 ; Multiplication de l'élément du signal d'entrée avec l'élément correspondant des tableaux "TabCos" et "TabSin" (en utilisant une multiplication longue pour éviter la saturation).
mul r10, r8, r10
add r3, r3, r9 ; Mise à jour des parties réelles et imaginaires du résultat.
add r2, r2, r10
mul r7, r4, r1 ; i*k
and r7, #0x3F ; mod 64
add r4, #1 ; ++n
cmp r4, #64 ;
blt SumLoop ; if n < 64 refaire
mov r0, r3 ; 5.27
smull r0, r9, r3, r3 ; reel*reel
mov r0, r9
smull r0, r10, r2, r2 ; im*im
add r0, r9, r10 ; 10.22
pop {r4, r5, r6, r8, r9, r10}
bx lr
endp
push{r4-r10}; Sauvegarde des registres r4 à r10 dans la pile
mov r2, #0 ;initialisation de la partie imaginaire à zero
mov r3, #0 ;initialisation de la partie relle à zero
mov r7 ,#0 ;initialisation de p(=n*k) à zero
mov r4 ,#0 ;initialisation de l'indice n à zero
ldr r5, =TabCos ; chargement de l'adresse de TabCos dans r5
ldr r6, =TabSin ; chargement de l'adresse de TabCos dans r5
Sommation
;Rsom += Signal[i] * TabCos[k*i]
ldrsh r8,[r0, r4, lsl#1] ; chargement du LeSignal[n] dans r8
ldrsh r9,[r5, r7, lsl #1] ; chargement de TabCos[p] dans r9
ldrsh r10,[r6, r7, lsl #1] ; chargement de TabSin[p] dans r10
mul r9, r8, r9 ; multiplication de LeSignal[n] par TabCos[n*k]--> Format 5.27
mul r10, r8, r10 ; multiplication de LeSignal[n] par TabSin[n*k] --> Format 5.27
asr r9, #16 ; Réduction du format pour éviter le débordement
asr r10,#16 ; Réduction du format pour éviter le débordement
add r3,r3, r9 ; ajout de la partie réelle au résultat (conservation du format) --> Format 11.11
add r2,r2, r10 ; ajout de la partie imaginaire au résultat (conservation du format) --> Format 11.11
add r7, r1 ; Calcul de p = (n+1) * k
and r7, 63 ; modulo 64 pour ne pas depasser la taille du tableau
add r4, r4, #1 ; incrémentation de l'indice n
cmp r4 ,#64 ; comparaison de n à 64
blt Sommation ; si n<64 on continue la boucle
asr r3, #6 ; Réduction du format de la partie réelle pour le calcul au carré --> Format 11.5 (décalage 10 bits)
mul r3, r3, r3 ; Calcul du carré de la partie réelle --> Format 10.22
asr r2, #6 ; Réduction du format de la partie imaginaire pour le calcul au carré --> Format 11.5 (décalage 10 bits)
mul r2, r2, r2 ; Calcul du carré de la partie réelle --> Format 22.10
mov r0, r3 ; Copie de la partie réelle dans le registre r0
add r0, r0, r2 ; Addition de la partie imaginaire dans r0 (résultat final) --> Format 22.10
pop{r4-r10} ; restauration des registres depuis la pile
bx lr
endp