forked from acco/chti23
221 lines
No EOL
7.1 KiB
ArmAsm
221 lines
No EOL
7.1 KiB
ArmAsm
PRESERVE8
|
|
THUMB
|
|
|
|
export DFT_ModuleAuCarre
|
|
export TabCos
|
|
|
|
; ====================== zone de réservation de données, ======================================
|
|
;Section RAM (read only) :
|
|
area mesdata,data,readonly
|
|
|
|
|
|
;Section RAM (read write):
|
|
area maram,data,readwrite
|
|
|
|
|
|
|
|
; ===============================================================================================
|
|
|
|
|
|
|
|
|
|
;Section ROM code (read only) :
|
|
area moncode,code,readonly
|
|
; écrire le code ici
|
|
;r0 : signal d'entrée
|
|
;r1 : k
|
|
;r2 : n (compteur de boucle)
|
|
;r3 : TabCos ou TabSin selon le moment
|
|
;r4 : 64 = taille du tableau
|
|
;r5 : somme incrémentée à chaque itération de la boucle (partie imaginaire ou réelle selon l'itération
|
|
;r6 : LeSignal(i) = la bonne case du tableau de signal
|
|
;r7 : cos(2*pi*k*n/M) = la bonne case du tableau de cos ou sin
|
|
;r8 : signal entrée sécurisé (pour être sur su'il ne soit pas écrasé)
|
|
;r9 : k sécurisé (pour être sur qu'il ne soit pas écrasé)
|
|
|
|
|
|
DFT_ModuleAuCarre
|
|
push {LR, r9, r8}
|
|
;sécuriser r0 r1
|
|
mov r8, r0 ; stocker l'adresse du signal passée en argument
|
|
ldr r3, =TabCos
|
|
bl DFT_PartieRouI ; calcul de la partie réelle
|
|
mov r9, r0 ; stocker le résultat = partie réelle au format 12.20 dans un registre
|
|
mov r0, r8 ; renvoyer l'adresse du signal dans r0 pour qu'elle soit passée en argument du calcul de la partie imaginaire
|
|
ldr r3, =TabSin
|
|
bl DFT_PartieRouI ; résultat = partie imaginaire au format 12.20
|
|
;Calcul du module
|
|
asr r0, r0, #16 ;décalage de 16 vers la droite (on enlève de la précision) pour avoir la place de stocker le résultat du carré - format 12.4
|
|
asr r1, r9, #16 ;décalage de 16 vers la droite (on enlève de la précision) pour avoir la place de stocker le résultat du carré - format 12.4
|
|
mul r0, r0 ; partie imaginaire au carré au format 24.8
|
|
mul r1, r1 ; partie réelle au carré au format 24.8
|
|
add r0, r1 ;résultat au format 24.8
|
|
pop {r8, r9, LR}
|
|
bx lr
|
|
|
|
|
|
DFT_PartieRouI ;DFT_UnePartie
|
|
;Etape 1 : partie réelle
|
|
push {LR, r4, r5, r6, r7}
|
|
mov r2, #0 ;initialisation de n à 0
|
|
;ldr r3, =TabCos ;récupération de l'adresse de TabCos -- à enlever pour faire le sinus
|
|
mov r4, #64
|
|
mov r5, #0 ; initialisation de la somme à 0
|
|
|
|
CalculTerme
|
|
cmp r4, r2
|
|
ble fin
|
|
mul r6, r1, r2 ; k*n stocké dans r6 + modulo
|
|
and r6, #63 ; modulo 64 pour ramener k*n entre 0 et 63 qui sont les cases de notre tableau
|
|
ldrsh r7, [r3, r6, lsl #1] ; récupération de TabCos(2*pi*k*n/M) au format 1.15
|
|
ldrsh r6, [r0, r2, lsl #1] ; récupération de LeSignal(n) au format 4.12
|
|
mul r7, r6 ; multiplication de x(n)*cos(2*pi*k*n/M) au format 5.27
|
|
asr r7, r7, #7 ; décalage de 7 vers la droite (on enlève de la précision) pour avoir la place de stocker les retenues si besoin (64 retenues max, stockées sur 6 bits, mais 7 pour être sur) ; asr pour conserver le bit de signe
|
|
add r5, r7 ; ajout de ce terme à la somme totale au format 12.20
|
|
add r2, #1 ;incrémentation de n
|
|
b CalculTerme
|
|
|
|
fin
|
|
mov r0, r5
|
|
pop {r7, r6, r5, r4, LR}
|
|
bx lr
|
|
|
|
;Section ROM code (read only) :
|
|
AREA Trigo, DATA, READONLY
|
|
; codage fractionnaire 1.15
|
|
|
|
TabCos
|
|
DCW 32767 ; 0 0x7fff 0.99997
|
|
DCW 32610 ; 1 0x7f62 0.99518
|
|
DCW 32138 ; 2 0x7d8a 0.98077
|
|
DCW 31357 ; 3 0x7a7d 0.95694
|
|
DCW 30274 ; 4 0x7642 0.92389
|
|
DCW 28899 ; 5 0x70e3 0.88193
|
|
DCW 27246 ; 6 0x6a6e 0.83148
|
|
DCW 25330 ; 7 0x62f2 0.77301
|
|
DCW 23170 ; 8 0x5a82 0.70709
|
|
DCW 20788 ; 9 0x5134 0.63440
|
|
DCW 18205 ; 10 0x471d 0.55557
|
|
DCW 15447 ; 11 0x3c57 0.47141
|
|
DCW 12540 ; 12 0x30fc 0.38269
|
|
DCW 9512 ; 13 0x2528 0.29028
|
|
DCW 6393 ; 14 0x18f9 0.19510
|
|
DCW 3212 ; 15 0x0c8c 0.09802
|
|
DCW 0 ; 16 0x0000 0.00000
|
|
DCW -3212 ; 17 0xf374 -0.09802
|
|
DCW -6393 ; 18 0xe707 -0.19510
|
|
DCW -9512 ; 19 0xdad8 -0.29028
|
|
DCW -12540 ; 20 0xcf04 -0.38269
|
|
DCW -15447 ; 21 0xc3a9 -0.47141
|
|
DCW -18205 ; 22 0xb8e3 -0.55557
|
|
DCW -20788 ; 23 0xaecc -0.63440
|
|
DCW -23170 ; 24 0xa57e -0.70709
|
|
DCW -25330 ; 25 0x9d0e -0.77301
|
|
DCW -27246 ; 26 0x9592 -0.83148
|
|
DCW -28899 ; 27 0x8f1d -0.88193
|
|
DCW -30274 ; 28 0x89be -0.92389
|
|
DCW -31357 ; 29 0x8583 -0.95694
|
|
DCW -32138 ; 30 0x8276 -0.98077
|
|
DCW -32610 ; 31 0x809e -0.99518
|
|
DCW -32768 ; 32 0x8000 -1.00000
|
|
DCW -32610 ; 33 0x809e -0.99518
|
|
DCW -32138 ; 34 0x8276 -0.98077
|
|
DCW -31357 ; 35 0x8583 -0.95694
|
|
DCW -30274 ; 36 0x89be -0.92389
|
|
DCW -28899 ; 37 0x8f1d -0.88193
|
|
DCW -27246 ; 38 0x9592 -0.83148
|
|
DCW -25330 ; 39 0x9d0e -0.77301
|
|
DCW -23170 ; 40 0xa57e -0.70709
|
|
DCW -20788 ; 41 0xaecc -0.63440
|
|
DCW -18205 ; 42 0xb8e3 -0.55557
|
|
DCW -15447 ; 43 0xc3a9 -0.47141
|
|
DCW -12540 ; 44 0xcf04 -0.38269
|
|
DCW -9512 ; 45 0xdad8 -0.29028
|
|
DCW -6393 ; 46 0xe707 -0.19510
|
|
DCW -3212 ; 47 0xf374 -0.09802
|
|
DCW 0 ; 48 0x0000 0.00000
|
|
DCW 3212 ; 49 0x0c8c 0.09802
|
|
DCW 6393 ; 50 0x18f9 0.19510
|
|
DCW 9512 ; 51 0x2528 0.29028
|
|
DCW 12540 ; 52 0x30fc 0.38269
|
|
DCW 15447 ; 53 0x3c57 0.47141
|
|
DCW 18205 ; 54 0x471d 0.55557
|
|
DCW 20788 ; 55 0x5134 0.63440
|
|
DCW 23170 ; 56 0x5a82 0.70709
|
|
DCW 25330 ; 57 0x62f2 0.77301
|
|
DCW 27246 ; 58 0x6a6e 0.83148
|
|
DCW 28899 ; 59 0x70e3 0.88193
|
|
DCW 30274 ; 60 0x7642 0.92389
|
|
DCW 31357 ; 61 0x7a7d 0.95694
|
|
DCW 32138 ; 62 0x7d8a 0.98077
|
|
DCW 32610 ; 63 0x7f62 0.99518
|
|
TabSin
|
|
DCW 0 ; 0 0x0000 0.00000
|
|
DCW 3212 ; 1 0x0c8c 0.09802
|
|
DCW 6393 ; 2 0x18f9 0.19510
|
|
DCW 9512 ; 3 0x2528 0.29028
|
|
DCW 12540 ; 4 0x30fc 0.38269
|
|
DCW 15447 ; 5 0x3c57 0.47141
|
|
DCW 18205 ; 6 0x471d 0.55557
|
|
DCW 20788 ; 7 0x5134 0.63440
|
|
DCW 23170 ; 8 0x5a82 0.70709
|
|
DCW 25330 ; 9 0x62f2 0.77301
|
|
DCW 27246 ; 10 0x6a6e 0.83148
|
|
DCW 28899 ; 11 0x70e3 0.88193
|
|
DCW 30274 ; 12 0x7642 0.92389
|
|
DCW 31357 ; 13 0x7a7d 0.95694
|
|
DCW 32138 ; 14 0x7d8a 0.98077
|
|
DCW 32610 ; 15 0x7f62 0.99518
|
|
DCW 32767 ; 16 0x7fff 0.99997
|
|
DCW 32610 ; 17 0x7f62 0.99518
|
|
DCW 32138 ; 18 0x7d8a 0.98077
|
|
DCW 31357 ; 19 0x7a7d 0.95694
|
|
DCW 30274 ; 20 0x7642 0.92389
|
|
DCW 28899 ; 21 0x70e3 0.88193
|
|
DCW 27246 ; 22 0x6a6e 0.83148
|
|
DCW 25330 ; 23 0x62f2 0.77301
|
|
DCW 23170 ; 24 0x5a82 0.70709
|
|
DCW 20788 ; 25 0x5134 0.63440
|
|
DCW 18205 ; 26 0x471d 0.55557
|
|
DCW 15447 ; 27 0x3c57 0.47141
|
|
DCW 12540 ; 28 0x30fc 0.38269
|
|
DCW 9512 ; 29 0x2528 0.29028
|
|
DCW 6393 ; 30 0x18f9 0.19510
|
|
DCW 3212 ; 31 0x0c8c 0.09802
|
|
DCW 0 ; 32 0x0000 0.00000
|
|
DCW -3212 ; 33 0xf374 -0.09802
|
|
DCW -6393 ; 34 0xe707 -0.19510
|
|
DCW -9512 ; 35 0xdad8 -0.29028
|
|
DCW -12540 ; 36 0xcf04 -0.38269
|
|
DCW -15447 ; 37 0xc3a9 -0.47141
|
|
DCW -18205 ; 38 0xb8e3 -0.55557
|
|
DCW -20788 ; 39 0xaecc -0.63440
|
|
DCW -23170 ; 40 0xa57e -0.70709
|
|
DCW -25330 ; 41 0x9d0e -0.77301
|
|
DCW -27246 ; 42 0x9592 -0.83148
|
|
DCW -28899 ; 43 0x8f1d -0.88193
|
|
DCW -30274 ; 44 0x89be -0.92389
|
|
DCW -31357 ; 45 0x8583 -0.95694
|
|
DCW -32138 ; 46 0x8276 -0.98077
|
|
DCW -32610 ; 47 0x809e -0.99518
|
|
DCW -32768 ; 48 0x8000 -1.00000
|
|
DCW -32610 ; 49 0x809e -0.99518
|
|
DCW -32138 ; 50 0x8276 -0.98077
|
|
DCW -31357 ; 51 0x8583 -0.95694
|
|
DCW -30274 ; 52 0x89be -0.92389
|
|
DCW -28899 ; 53 0x8f1d -0.88193
|
|
DCW -27246 ; 54 0x9592 -0.83148
|
|
DCW -25330 ; 55 0x9d0e -0.77301
|
|
DCW -23170 ; 56 0xa57e -0.70709
|
|
DCW -20788 ; 57 0xaecc -0.63440
|
|
DCW -18205 ; 58 0xb8e3 -0.55557
|
|
DCW -15447 ; 59 0xc3a9 -0.47141
|
|
DCW -12540 ; 60 0xcf04 -0.38269
|
|
DCW -9512 ; 61 0xdad8 -0.29028
|
|
DCW -6393 ; 62 0xe707 -0.19510
|
|
DCW -3212 ; 63 0xf374 -0.09802
|
|
|
|
|
|
|
|
|
|
END
|