Sunteți pe pagina 1din 21

# PROCESOARE NUMERICE

DE SEMNAL

CURS 3
Funcii pentru operaii
aritmetice i logice
n virgul fix (1.15)
Lector universitar (CS III)

Cuprins

## Formate numerice - reprezentarea numerelor n

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

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 )

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)

+32 767

2N-1-1

0,99996...

0x7FFF

+16 384

0,500000

0x4000

+1

0,00003...

0x0001

0,000000

0x0000

-1

-1

- 0,00003...

0xFFFF

- 2N-1

- 1,00000

0x8000

Binar

- 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

## Operaii aritmetice binare

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

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

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.

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

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

## 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];