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 DFT_ModuleAuCarre( short int * Signal64ech, char k) {
|
||||||
; int reelle = 0;
|
; int reelle = 0;
|
||||||
|
; int imag = 0;
|
||||||
; for(int i=0; i<64; i++) {
|
; for(int i=0; i<64; i++) {
|
||||||
; reelle += Signal64ech[i] * TabCos[k*i];
|
; reelle += Signal64ech[i] * TabCos[k*i];
|
||||||
|
; imag += Signal64ech[i] * TabSin[k*i];
|
||||||
; }
|
; }
|
||||||
; return reelle;
|
; return (imag*imag + reelle*reelle);
|
||||||
;}
|
;}
|
||||||
|
|
||||||
|
|
||||||
EXPORT DFT_ModuleAuCarre
|
EXPORT DFT_ModuleAuCarre
|
||||||
DFT_ModuleAuCarre proc
|
DFT_ModuleAuCarre proc
|
||||||
push{lr}
|
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++)
|
; for(int i=0; i<64; i++)
|
||||||
mov r4, #0 ; r4 = 0 (init de l'itérateur)
|
mov r4, #0 ; r4 = 0 (init de l'itérateur)
|
||||||
|
mov r5, #63
|
||||||
BoucleFor
|
BoucleFor
|
||||||
mov r5, #64
|
|
||||||
cmp r4, r5
|
cmp r4, r5
|
||||||
bgt FinBoucle
|
bgt FinBoucle
|
||||||
|
|
||||||
; reelle += Signal64ech[i] * TabCos[k*i]; (on le décompose en plusieurs étapes)
|
; reelle += Signal64ech[i] * TabCos[k*i]; (on le décompose en plusieurs étapes)
|
||||||
mov r7,#0 ; init de reelle à 0 -> r7
|
|
||||||
; Signal64ech[i]
|
; Signal64ech[i]
|
||||||
ldrsh r2, [r0, r4, lsl #1]
|
ldrsh r2, [r0, r4, lsl #1]
|
||||||
|
|
||||||
; TabCos[k*i]
|
; TabCos[k*i]
|
||||||
ldr r3, =TabCos
|
ldr r3, =TabCos
|
||||||
;k*i->r6
|
; TabSin[k*i]
|
||||||
|
ldr r9, =TabSin
|
||||||
|
|
||||||
|
; k*i->r6
|
||||||
mul r6, r1, r4
|
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]
|
ldrsh r3,[r3,r6,lsl #1]
|
||||||
|
; TabSin[r6]
|
||||||
|
ldrsh r9,[r9,r6,lsl #1]
|
||||||
|
|
||||||
; Signal64ech[i] * TabCos[k*i]
|
; Signal64ech[i] * TabCos[k*i]
|
||||||
mul r2, r2, r3
|
mul r10, r2, r3
|
||||||
; on ajoute notre réelle au calcul
|
; Signal64ech[i] * TabSin[k*i]
|
||||||
add r7, r2
|
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
|
add r4, #1
|
||||||
b BoucleFor
|
b BoucleFor
|
||||||
|
|
||||||
|
|
||||||
FinBoucle
|
FinBoucle
|
||||||
|
|
||||||
; on met le résultat à disposition dans r0
|
; 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}
|
pop {pc}
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;Section ROM code (read only) :
|
;Section ROM code (read only) :
|
||||||
AREA Trigo, DATA, READONLY
|
AREA Trigo, DATA, READONLY
|
||||||
; codage fractionnaire 1.15
|
; 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 short int LeSignal[];
|
||||||
extern int DFT_ModuleAuCarre( short int * Signal64ech, char k);
|
extern int DFT_ModuleAuCarre( short int * Signal64ech, char k);
|
||||||
|
|
||||||
|
int moduleSignal[64] ;
|
||||||
|
|
||||||
int main(void)
|
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)
|
while (1)
|
||||||
|
|
Loading…
Reference in a new issue