From 5fad572de4ff1b421fc3e80b9c1edd2a06869455 Mon Sep 17 00:00:00 2001 From: Oussama Hannouch Date: Tue, 23 May 2023 21:38:59 +0200 Subject: [PATCH] Update 'soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s' --- soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s | 81 +++++++++++++------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s b/soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s index f196410..edbeaf6 100644 --- a/soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s +++ b/soft/PjtKEIL_DFT_Signal_Reel/Src/DFT.s @@ -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