From 4dddce3b0f7abff61c14d40ee415747cb3eccbda Mon Sep 17 00:00:00 2001 From: MaelleCros Date: Fri, 21 Apr 2023 18:07:07 +0200 Subject: [PATCH] DFT Marche sur signal cos pur (allelujah) --- PjtKEIL_StepDFT/Src/DFT.s | 61 +++++++++++++++++++++++++-------- PjtKEIL_StepDFT/Src/Signal.m | 38 ++++++++++++++++++++ PjtKEIL_StepDFT/Src/principal.c | 10 ++++-- 3 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 PjtKEIL_StepDFT/Src/Signal.m diff --git a/PjtKEIL_StepDFT/Src/DFT.s b/PjtKEIL_StepDFT/Src/DFT.s index 78cc2bf..80d835f 100644 --- a/PjtKEIL_StepDFT/Src/DFT.s +++ b/PjtKEIL_StepDFT/Src/DFT.s @@ -26,58 +26,89 @@ ;int DFT_ModuleAuCarre( short int * Signal64ech, char k) { ; int reelle = 0; +; int imag = 0; ; for(int i=0; i<64; i++) { ; reelle += Signal64ech[i] * TabCos[k*i]; +; imag += Signal64ech[i] * TabSin[k*i]; ; } -; return reelle; +; return (imag*imag + reelle*reelle); ;} EXPORT DFT_ModuleAuCarre DFT_ModuleAuCarre proc push{lr} - push{r4-r7} + push{r4-r11} - + ;r0 adresse Signa164ech + ;r1 k + ;r2 Signal64ech[i] + ;r3 adresse TabCos puis valeur de TabCos[k*i] + ;r4 itérateur + ;r5 M (64) + ;r6 k*i + ;r7 reelle + ;r8 imag + ;r9 adresse TabSin puis valeur de TabSin[k*i] + ;r10 Signal64ech[i] * TabCos[k*i] + ;r11 Signal64ech[i] * TabSin[k*i] + + ;NB il faut utiliser smull et smlal + mov r8,#0 + mov r7,#0 ; init de reelle à 0 -> r7 ; for(int i=0; i<64; i++) mov r4, #0 ; r4 = 0 (init de l'itérateur) + mov r5, #63 BoucleFor - mov r5, #64 cmp r4, r5 bgt FinBoucle -; reelle += Signal64ech[i] * TabCos[k*i]; (on le décompose en plusieurs étapes) - mov r7,#0 ; init de reelle à 0 -> r7 +; reelle += Signal64ech[i] * TabCos[k*i]; (on le décompose en plusieurs étapes) ; Signal64ech[i] ldrsh r2, [r0, r4, lsl #1] ; TabCos[k*i] ldr r3, =TabCos - ;k*i->r6 +; TabSin[k*i] + ldr r9, =TabSin + +; k*i->r6 mul r6, r1, r4 - ;TabCos[r6] +;(k*i)%64 + and r6,#63 ;On fait un masque pour faire mod 64 + +; TabCos[r6] ldrsh r3,[r3,r6,lsl #1] +; TabSin[r6] + ldrsh r9,[r9,r6,lsl #1] ; Signal64ech[i] * TabCos[k*i] - mul r2, r2, r3 -; on ajoute notre réelle au calcul - add r7, r2 + mul r10, r2, r3 +; Signal64ech[i] * TabSin[k*i] + mul r11, r2, r9 + +; on ajoute notre réelle et imag au calcul + add r7, r10 + add r8, r11 -; incrémenter l'itérateur +; incrémenter l'itérateur add r4, #1 b BoucleFor - FinBoucle ; on met le résultat à disposition dans r0 - mov r0, r7 + ;mov r1, r7 + ;mov r0, r8 + smull r1, r0, r7, r7 ;NB :poids fort en 2eme pos + smlal r1, r0, r8, r8 ; - pop {r4-r7} + pop {r4-r11} pop {pc} endp + ;Section ROM code (read only) : AREA Trigo, DATA, READONLY ; codage fractionnaire 1.15 diff --git a/PjtKEIL_StepDFT/Src/Signal.m b/PjtKEIL_StepDFT/Src/Signal.m new file mode 100644 index 0000000..b88fee7 --- /dev/null +++ b/PjtKEIL_StepDFT/Src/Signal.m @@ -0,0 +1,38 @@ +clc +clear + +N = input('Nombre d''échantilllons pour ce signal : '); +Frel = input('Fréquence normalisée (nombre de périodes dans la durée totale) : '); +Ph0 = input('Phase a l''origine (en degrés) : '); +Ph0 = Ph0 * pi / 180.0; % a present en radian + +Ampl = 2048; +Offset = 2048; +%% Création du fichier .asm + +fileID = fopen(['Signal.asm'], 'w'); +fprintf(fileID,'\tAREA Signal, DATA, READONLY\n'); +fprintf(fileID,'\texport LeSignal\n'); + +fprintf(fileID,'LeSignal\n'); + +for i = 1: N + % fonction a modifier en fonction des besoins + Sig(i) = Offset + Ampl * cos( 2*pi*Frel*(i-1)/N + Ph0 ); + % arrondi + iSig = int16(Sig(i)); + % bornage du signal similaire a la sortie brute de l'ADC 12 bits + if ( iSig < 0 ) + iSig = 0; + end + if ( iSig > 4095 ) + iSig = 4095; + end + + fprintf(fileID,'\tDCW\t0x%04x\t; %2d %4d %7.5f\n',iSig, i-1, iSig, double(iSig) / 4096.0 ); + +end + +fprintf(fileID,'\tEND\n'); +fclose(fileID); +plot(Sig); \ No newline at end of file diff --git a/PjtKEIL_StepDFT/Src/principal.c b/PjtKEIL_StepDFT/Src/principal.c index ba5bb7c..8456a48 100644 --- a/PjtKEIL_StepDFT/Src/principal.c +++ b/PjtKEIL_StepDFT/Src/principal.c @@ -5,6 +5,8 @@ extern short int LeSignal[]; extern int DFT_ModuleAuCarre( short int * Signal64ech, char k); +int moduleSignal[64] ; + int main(void) { @@ -20,9 +22,11 @@ CLOCK_Configure(); //============================================================================ -//for (int j=0; j