DFT Marche sur signal cos pur (allelujah)

This commit is contained in:
Maelle Cros 2023-04-21 18:07:07 +02:00
parent 84401c6d9e
commit 4dddce3b0f
3 changed files with 91 additions and 18 deletions

View file

@ -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

View file

@ -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);

View file

@ -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<M ; j++) {
int test =DFT_ModuleAuCarre(&(LeSignal[0]), 17);
//}
for (int j=0; j<64 ; j++) {
moduleSignal[j] = DFT_ModuleAuCarre(&(LeSignal[0]), j);
}
while (1)