[Tech] OT: C, linux e la rappresentazione in mem

Carlo Baffa baffa@arcetri.astro.it
Lun 1 Mar 2004 16:49:41 CET


On Mon, 1 Mar 2004, Valerio Montagnani wrote:

> 16 bit
> 2 canali
> 8000 Hz di freq. di campionamento.
> durata acquisizione 60 sec.
>
> la quantità di memoria da allocare è: 60*16*2*8000=15360000 bit.
>
> Voglio che il buffer che dovrà contenere i dati audio, sia un buffer in
> allocazione dinamica di tipo float, per cui:

Perche' float? e' molto piu' efficiente lo int!

> p=(float *)calloc(size,sizeof(float));
> in linux sizeof(float)=4 (32 bit), quindi per esprimere in bytes la quantità
> di memoria sopra calcolata e tenendo conto del numero di bit necessari per
> la rappresentazione di un numero di tipo float, si ha:
> 60*16*2*8000/32 = 480 Kb.

> Qui viene il mio dubbio. La scheda audio quantizza il suono con 16 bit (come
> richiesto). Un tipo float usa 32 bit per la rappresentazione di un numero.
> Quindi nel mio buffer avrò i 16 bit più rappresentativi tutti con il valore
> 0, mentre i meno significativi saranno effettivamente impiegati per la

No questo sarebbe giusto se tu usassi degli int (32bit). I float usano 24 bit
per rappesentare la mnatissa e 8 (credo) per l'esponente.

Se tu invece usassi degli short unsigned (16 bit) avresti un'occupazione
pari alla meta' e riempiresti tutti i bit.

Non ho sottomano dei benchmark aggiornati sugli short unsigned, ma una volta
(nel neolitico superiore) la loro aritmetica era piu' lenta, e conveniva
convertirli ad int (32bit) per farci sopra i conti. Oggigiorno non lo so.
Ciao
Carlo

----
 Carlo Baffa                   INAF - Osservatorio Astrofisico di Arcetri
 baffa@arcetri.astro.it               Largo Fermi 5
 http://www.arcetri.astro.it/~baffa/  I-50125-Firenze ITALY
-------------------------------------------------------------------------
 http://www.skysoft.org  The new Astronomical Software Directory



Maggiori informazioni sulla lista flug-tech