Sunteți pe pagina 1din 21

PROCESOARE NUMERICE

DE SEMNAL

CURS 3
Funcii pentru operaii
aritmetice i logice
n virgul fix (1.15)
Toma tefan-Adrian (cpt. dr. ing.)
Lector universitar (CS III)
Academia Tehnic Miltiar

Cuprins

Formate numerice - reprezentarea numerelor n


virgul fix, formatul 1.15 (recapitulare)
Funcii pentru operaii aritmetice cu numere
fracionare

Reprezentarea numerelor n virgul fix


M.N

0111 . 1111 1111 1111


(-1)0 (1(2)+2 + 1(2)+1 + 1(2)+0 + 1(2) -1 + 1(2) -2 + + 12 -12 )

Gama dinamic i precizia


Format
(N.M)
(1.15)
(2.14)
(3.13)
(4.12)
(5.11)
(6.10)
(7.9)
(8.8)
(9.7)
(10.6)
(11.5)
(12.4)
(13.3)
(14.2)
(15.1)
(16.0)

Cea mai mare val. poz.


(0x7FFF)
0.999969482421875
1.99993896484375
3.9998779296875
7.999755859375
15.99951171875
31.9990234375
63.998046875
127.99609375
255.9921875
511.984375
1023.96875
2047.9375
4095.875
8191.75
16383.5
32767

Cea mai mic val. neg


Precizia
(0x8000)
(0x0001)
0.00003051757813
1
0.00006103515625
2
0.00012207031250
4
0.00024414062500
8
0.00048828125000
16
0.00097656250000
32
0.00195312500000
64
0.00390625000000
128
0.00781250000000
256
0.01562500000000
512
0.03125000000000
1024
0.06250000000000
2048
0.12500000000000
4096
0.25000000000000
8192
0.50000000000000
16384
1.00000000000000
32768

Formatul 1.15
Reprezentarea numerelor cu semn pe 16 bii
N=16 bii
General
ntreg

ntreg

Fracionar
(1.15)

0111 1111 1111 1111

+32 767

2N-1-1

0,99996...

0x7FFF

0100 0000 0000 0000

+16 384

0,500000

0x4000

0000 0000 0000 0001

+1

0,00003...

0x0001

0000 0000 0000 0000

0,000000

0x0000

-1

-1

- 0,00003...

0xFFFF

- 2N-1

- 1,00000

0x8000

Binar

1111 1111 1111 1111

1000 0000 0000 0000

- 32768

Hexa

Conversia ntre diferite formate pe 16 bii


ntreg (i) Fracionar 1.15 (f)
f = i/(2N-1) = i/(32768)
Exemplu:
i = 12.000; f = 12000/(32768) = 0,3662109375

Fracionar 1.15 (f) ntreg (i)


i = round(f * 2N-1) = round (f * 32768)
Exemplu:
f = 0,62; i = round (0,62 * 32768) = round (20316,16) = 20 316
Verificare: f = 20.316/32.768 = 0,6199951171875

!!! Conversia nu este ntotdeauna exact !!!

Operaii aritmetice binare


Adunarea
0+0=0
1+0=1
0+1=1
1 + 1 = 0 i se deplaseaz 1 ctre cel mai semnificativ bit
00011010 + 00001100 = 00100110

1 1
0 0 0 1 1 0 1 0 = 26(10)
+ 0 0 0 0 1 1 0 0 = 12(10)
0 0 1 0 0 1 1 0 = 38(10)

Operaii aritmetice binare


Scderea
0011-

0=0
1 = 1 mprumut un 1 de la bitul semnificativ
0=1
1=0

00100101 - 00010001 = 00010100


0
0 0 1 10 0 1 0 1
-0 0 0 1 0 0 0 1
0 0 0 1 0 1 0 0

=
=
=

37(10)
17(10)
20(10)

Operaii aritmetice binare


nmulirea
0x0=0
0x1=0
1x0=0
1x1=1
00101001 x 00000110 = 11110110
0 0 1 0 1 0 0 1
0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 1
0 0 1 0 1 0 0 1
0 0 1 1 1 1 0 1 1 0

=
=

41(10)
6(10)

246(10)

Notaii

LSB = least significant bit


MSB = most significant bit
1 Nybble (sau nibble) = 4 bii
1 Byte = 2 nybbles = 8 bii
1 Kilobyte (KB) (Kilooctet) = 1024 bytes (octei)
1 Megabyte (MB) (Megaoctet) = 1024 kilobytes = 1,048,576 bytes
1 Gigabyte (GB) (Megaoctet) = 1024 megabytes = 1,073,741,824 bytes

Operaii elementare n format fracional


Adunarea

Operaii elementare n format fracional


nmulirea

Exemplu:
ntreg: 14.000*14.000=196.000.000
Binar: 0011 0110 1011 0000 * 0011 0110 1011 0000 =
= 0000 1011 1010 1110 1011 1001 0000 0000
Fracionar: 0,42724609375 * 0,42724609375 =
0,09126961231231689453125 (nereprezentabil pe 16 bii)
!!! Aproximarea prin selectarea MSW pe 16 bii, rezultatul devine:
0000 1011 1010 1110 (b) 2990 (i) 0,09124755859375 (f 1.15)

Tipuri de date utilizate de compilatorul C


pentru BlackFin
Virgul fix:

Echivalente

Virgul mobil:
- float i double, ambele sunt reprezentate pe 32 de bii
(simpl precizie)

Funcii intrinseci
funcii incluse n compilatorul C (built-in) pentru valori fracionare;
suport ETSI;
funcii incluse n compilatorul C (built-in) pentru valori fracionare;
conversie ntre valori n virgul fix i virgul mobil;
funcii incluse n compilatorul C (built-in) pentru valori fracionare
complexe;
operaii complexe n C++;
funcii pentru mprire;
funcii pentru decodare;
funcii incluse n compilatorul C (built-in) pentru implementarea
bufferelor circulare;
funcii incluse n compilatorul C (built-in) pentru operaii cu semnale
video;
funcii incluse n compilator pentru accesul regitrilor mapai n
memorie;
etc

Funcii intrinseci
Funcii C specifice compilatorului C pentru BlackFin.

fract.h fiier header

Aceste funcii au nume cu sufixele _fr1x16 pentru tipul fract16,


_fr2x16 pentru fract2x16 i _fr1x32 pentru fract32. Toate
funciile din fract.h sunt de tipul inline astfel nct atunci cnd
se compileaz cu opiunea de optimizare, funciile sunt copiate
n liniile din care sunt apelate.

Funcii intrinseci

Dac nu se specific altfel, toate funciile descrise n continuare


satureaz rezultatul n cazul depirilor de gam. De asemenea,
toate funciile descrise n continuare au ca operanzi tipul fract16.
Totui unele dintre aceste returneaz valori de tipul fract32.

Funcii intrinseci - exemple


fract16 add_fr1x16(fract16 f1,fract16 f2)
Adunare pe 16-bii a celor doi parametri de intrare (f1+f2)
fract16 sub_fr1x16(fract16 f1,fract16 f2)
Scdere pe 16-bii a celor doi parametri de intrare (f1+f2)
fract16 mult_fr1x16(fract16 f1,fract16 f2)
nmulire pe 16-bii a celor doi parametri de intrare (f1*f2).
Rezultatul este trunchiat la 16 bii.
fract16 abs_fr1x16(fract16 f1)
Returneaz valoarea pe 16 bii care reprezint valoarea
absolut a parametrului de intrare. Cnd intrarea are valoarea
0x8000 rezultatul se satureaz returnndu-se 0x7fff.

Funcii intrinseci - exemple

fe=48000;
f1=1000;
f2=3200;
fn1=f1/fe;
fn2=f2/fe;
n=0:199;
s1=sin(2*pi*fn1*n);
s2=sin(2*pi*fn2*n);
figure
subplot(211),plot(n,s1);
subplot(212),plot(n,s2);

Funcii intrinseci - exemple

salveaza_dat(s1, s1.dat ,1);


salveaza_dat(s2, s2.dat ,1);

Funcii intrinseci - exemple


#include <fract.h >
fract16 s1[200]={
#include "s1.dat"
};
fract16 s2[200]={
#include "s2.dat"
};
fract16 s_rez1[200];
fract16 s_rez2[200];
int i;
int main()
{
for(i=0;i<200;i++)
{
s_rez1[i]=s1[i]+s2[i];
s_rez2[i]=add_fr1x16(s1[i],s2[i]);
}
return 0;
}

Funcii intrinseci - exemple