forked from acco/chti23
DFT Marche sur signal cos pur (allelujah)
This commit is contained in:
parent
84401c6d9e
commit
4dddce3b0f
3 changed files with 91 additions and 18 deletions
|
@ -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
|
||||
|
|
38
PjtKEIL_StepDFT/Src/Signal.m
Normal file
38
PjtKEIL_StepDFT/Src/Signal.m
Normal 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);
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue