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 THUMB
@ -22,41 +22,42 @@
; écrire le code ici ; écrire le code ici
export DFT_ModuleAuCarre export DFT_ModuleAuCarre
;for i in 0...63
;signal[i]*Cos[k*i]
DFT_ModuleAuCarre proc DFT_ModuleAuCarre proc
push {r4, r5, r6, r8, r9, r10} ; push{r4-r10}; Sauvegarde des registres r4 à r10 dans la pile
mov r2, #0 ; partie imaginaire = 0 mov r2, #0 ;initialisation de la partie imaginaire à zero
mov r3, #0 ; partie reelle = 0 mov r3, #0 ;initialisation de la partie relle à zero
mov r7, #0 ; compteur pour parcourir les tableaux "TabCos" et "TabSin" mov r7 ,#0 ;initialisation de p(=n*k) à zero
mov r4, #0 ; compteur pour parcourir le signal d'entrée mov r4 ,#0 ;initialisation de l'indice n à zero
ldr r5, =TabCos ; les adresses du tableau "TabCos" ldr r5, =TabCos ; chargement de l'adresse de TabCos dans r5
ldr r6, =TabSin ; les adresses du tableau "TabSin" ldr r6, =TabSin ; chargement de l'adresse de TabCos dans r5
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 Sommation
and r7, #0x3F ; mod 64 ;Rsom += Signal[i] * TabCos[k*i]
add r4, #1 ; ++n ldrsh r8,[r0, r4, lsl#1] ; chargement du LeSignal[n] dans r8
cmp r4, #64 ; ldrsh r9,[r5, r7, lsl #1] ; chargement de TabCos[p] dans r9
blt SumLoop ; if n < 64 refaire 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
mov r0, r3 ; 5.27 add r7, r1 ; Calcul de p = (n+1) * k
smull r0, r9, r3, r3 ; reel*reel and r7, 63 ; modulo 64 pour ne pas depasser la taille du tableau
mov r0, r9 add r4, r4, #1 ; incrémentation de l'indice n
smull r0, r10, r2, r2 ; im*im cmp r4 ,#64 ; comparaison de n à 64
add r0, r9, r10 ; 10.22 blt Sommation ; si n<64 on continue la boucle
pop {r4, r5, r6, r8, r9, r10} 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 bx lr
endp endp