Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
|
b8f784ba1b | ||
|
ec321a1a5f | ||
|
5868ca0b18 |
3 changed files with 91 additions and 44 deletions
41
README.md
41
README.md
|
@ -2,7 +2,40 @@
|
||||||
|
|
||||||
Groupe: Yohan Simard, Arnaud Vergnet
|
Groupe: Yohan Simard, Arnaud Vergnet
|
||||||
|
|
||||||
## Avancement
|
**Chaque projet contient des commentaires pour faciliter la compréhension du code.**
|
||||||
* 1.1 - Terminé
|
|
||||||
* 2.1 - Terminé
|
## 1.1 Signal carré de précision
|
||||||
* 2.2 - Terminé, verif en cours
|
|
||||||
|
**Partie terminée et fonctionnant comme attendu.** Pour tester, ouvrir le fichier `Project.uvprojx` dans le dossier **1.1** puis suivre les étapes suivantes :
|
||||||
|
|
||||||
|
* Compiler le projet
|
||||||
|
* Lancer le mode Debug
|
||||||
|
* Ouvrir le logic analyser. Tout devrait être préconfiguré.
|
||||||
|
* Appuyer sur run et observer le signal carré dans le logic analyser.
|
||||||
|
|
||||||
|
## 2.1 Préliminaire : Tables trigo
|
||||||
|
|
||||||
|
**Partie terminée et fonctionnant comme attendu.** Pour tester, ouvrir le fichier `Project.uvprojx` dans le dossier **2.1** puis suivre les étapes suivantes :
|
||||||
|
|
||||||
|
* Compiler le projet
|
||||||
|
* Lancer le mode Debug
|
||||||
|
* Ouvrir la **Watch Window 1**. Vous devrez y trouver les variables `max` et `min`.
|
||||||
|
* Appuyer sur run et observer les valeurs de ces deux variables. Elles devraient être autour de 32767, soit 1 en format virgule fixe 1.15.
|
||||||
|
|
||||||
|
## 2.2 Calcul DFT
|
||||||
|
|
||||||
|
**Partie terminée et fonctionnant comme attendu.** Cette partie à été testée avec les [jeux de test officiels](https://noullet-gei.gitlab.io/asm/BE/TEST_DFT/test_DFT.7z) Pour tester, ouvrir le fichier `Project.uvprojx` dans le dossier **2.2** puis suivre les étapes suivantes :
|
||||||
|
|
||||||
|
* Choisir une fonction du jeu de test officiel et copier son contenu dans le fichier `calcul_dft.s`, sous le label `TabSig`.
|
||||||
|
* Si le signal choisi ne possède pas 64 points, changez la variable `N` dans le fichier `principal.c` par le nombre de points du signal choisi.
|
||||||
|
* Compiler le projet
|
||||||
|
* Lancer le mode Debug
|
||||||
|
* Ouvrir la **Watch Window 1**. Vous devrez y trouver la variable `resultats`, un tableau contenant le résultat de la DFT du signal choisi pour k variant de 0 à N-1.
|
||||||
|
* Appuyer sur run et vérifier que les résultats correspondent bien à ceux attendus par le test.
|
||||||
|
|
||||||
|
|
||||||
|
## Challenge
|
||||||
|
|
||||||
|
Cette partie se comporte comme la précédente (2.2). La procédure de test est donc identique. Nous avons ici cherché à optimiser en vitesse (nombre de cycles) notre calcul de DFT.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -157,38 +157,6 @@
|
||||||
<Bp>
|
<Bp>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
<LineNumber>38</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>134218234</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
|
||||||
<Filename>.\Src\calcul_dft.s</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression>\\CHTI\Src/calcul_dft.s\38</Expression>
|
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>1</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>0</LineNumber>
|
|
||||||
<EnabledFlag>0</EnabledFlag>
|
|
||||||
<Address>134218136</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
|
||||||
<Filename></Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression>0x08000198</Expression>
|
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>2</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>10</LineNumber>
|
<LineNumber>10</LineNumber>
|
||||||
<EnabledFlag>1</EnabledFlag>
|
<EnabledFlag>1</EnabledFlag>
|
||||||
<Address>134218152</Address>
|
<Address>134218152</Address>
|
||||||
|
@ -202,6 +170,38 @@
|
||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression>\\CHTI\Src/principal.c\10</Expression>
|
<Expression>\\CHTI\Src/principal.c\10</Expression>
|
||||||
</Bp>
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>1</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>7</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134218128</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>.\Src\principal.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CHTI\Src/principal.c\7</Expression>
|
||||||
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>2</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>52</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>134218270</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>1</BreakIfRCount>
|
||||||
|
<Filename>.\Src\calcul_dft.s</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression>\\CHTI\Src/calcul_dft.s\52</Expression>
|
||||||
|
</Bp>
|
||||||
<Bp>
|
<Bp>
|
||||||
<Number>3</Number>
|
<Number>3</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
|
|
|
@ -4,34 +4,48 @@
|
||||||
N equ 64
|
N equ 64
|
||||||
|
|
||||||
; vitesse initiale : 1726
|
; vitesse initiale : 1726
|
||||||
; vitesse actuelle : 1119
|
; vitesse actuelle : 1101
|
||||||
dft proc
|
dft proc
|
||||||
; r0 = x (signal), r1 = k
|
; r0 = x (signal), r1 = k
|
||||||
push {r4, r5, r6, r7, r8, r9}
|
push {r4, r5, r6, r7, r8, r9}
|
||||||
ldr r2, =TabCos
|
ldr r2, =TabCos
|
||||||
ldr r3, =TabSin
|
ldr r3, =TabSin
|
||||||
|
|
||||||
mov r4, #0 ; r4 = i
|
|
||||||
mov r5, #0 ; r5 = ik
|
mov r5, #0 ; r5 = ik
|
||||||
mov r9, #0 ; r9 = résultat réel
|
|
||||||
mov r12, #0 ; r10 = résultat imaginaire
|
; première itération de la boucle
|
||||||
|
ldrh r6, [r0], #2 ; r6 = x[i] (puis mise à jour de r0) | format 4.12
|
||||||
|
mov r7, #32767 ; r7 = cos [ik%N] | format 1.15
|
||||||
|
mov r8, #0 ; r8 = sin [ik%N] | format 1.15
|
||||||
|
mul r9, r6, r7 ; r9 = x[i] * cos[ik%n] | format 5.27
|
||||||
|
mul r12, r6, r8 ; r12 = x[i] * sin[ik%n] | format 5.27
|
||||||
|
|
||||||
|
add r5, r1 ; r5 = (i-1)k + k
|
||||||
|
and r5, #N-1 ; r5 = r5 % 64
|
||||||
|
mov r4, #1 ; r4 = i = 1
|
||||||
|
|
||||||
deb_somme ldrh r6, [r0, r4, LSL #1] ; r6 = x[i], LSL #1 pour faire ×2 car chaque valeur est sur 2 octets | format 4.12
|
deb_somme ldrh r6, [r0], #2 ; r6 = x[i] (puis mise à jour de r0) | format 4.12
|
||||||
ldrsh r7, [r2, r5, LSL #1] ; r7 = cos [ik%N] | format 1.15
|
ldrsh r7, [r2, r5, LSL #1] ; r7 = cos [ik%N] | format 1.15
|
||||||
ldrsh r8, [r3, r5, LSL #1] ; r8 = sin [ik%N] | format 1.15
|
ldrsh r8, [r3, r5, LSL #1] ; r8 = sin [ik%N] | format 1.15
|
||||||
mla r9, r6, r7, r9 ; r9 += x[i] * cos[ik%n] | format 5.27
|
mla r9, r6, r7, r9 ; r9 += x[i] * cos[ik%n] | format 5.27
|
||||||
mla r12, r6, r8, r12 ; r10 += x[i] * sin[ik%n] | format 5.27
|
mla r12, r6, r8, r12 ; r12 += x[i] * sin[ik%n] | format 5.27
|
||||||
|
|
||||||
add r5, r1 ; r5 = (i-1)k + k
|
add r5, r1 ; r5 = (i-1)k + k
|
||||||
and r5, #N-1 ; r5 = r5 % 64
|
and r5, #N-1 ; r5 = r5 % 64
|
||||||
add r4, #1 ; on incrémente i
|
add r4, #1 ; on incrémente i
|
||||||
cmp r4, #N ;
|
cmp r4, #N-1
|
||||||
bne deb_somme
|
bne deb_somme
|
||||||
|
|
||||||
|
; dernière itération de la boucle (pour éviter les 4 instructions inutiles à la fin)
|
||||||
|
ldrh r6, [r0] ; r6 = x[i] | format 4.12
|
||||||
|
ldrsh r7, [r2, r5, LSL #1] ; r7 = cos [ik%N] | format 1.15
|
||||||
|
ldrsh r8, [r3, r5, LSL #1] ; r8 = sin [ik%N] | format 1.15
|
||||||
|
mla r9, r6, r7, r9 ; r9 += x[i] * cos[ik%n] | format 5.27
|
||||||
|
mla r12, r6, r8, r12 ; r10 += x[i] * sin[ik%n] | format 5.27
|
||||||
|
|
||||||
; etat des registres : r0 = x, r1 = k, r9 = Re, r10 = Im, autres libres
|
; etat des registres : r0 = x, r1 = k, r9 = Re, r10 = Im, autres libres
|
||||||
|
|
||||||
smull r2, r0, r9, r9 ; (r2,r0) = Re(k)² | format : 10.54
|
smull r2, r0, r9, r9 ; (r2,r0) = Re(k)² | format : 10.54
|
||||||
|
|
||||||
smlal r2, r0, r12, r12 ; (r2,r0) = Re(k)² + Im(k)² | format : 10.54
|
smlal r2, r0, r12, r12 ; (r2,r0) = Re(k)² + Im(k)² | format : 10.54
|
||||||
|
|
||||||
pop {r4, r5, r6, r7, r8, r9}
|
pop {r4, r5, r6, r7, r8, r9}
|
||||||
|
|
Loading…
Reference in a new issue