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

Daniele Masini d.masini@tiscali.it
Lun 1 Mar 2004 17:20:36 CET


In C, i valori float vengono memorizzati in mantissa ed esponente. Quindi
non è vero che i bit più significativi saranno a zero, ma dipende dal valore
rappresentato (per una spiegazione più dettagliata v. anche la sezione "I
numeri con parte non intera" su
http://vandali.org/DanieleMasini/MyLinux/MyLinuxsu1.html#x24-100001.2.1).
Comunque, per evitare lo spreco di memoria, secondo me potresti memorizzare
i valori acquisiti semplicemente come unsigned short int, ovvero valori a 16
bit senza segno, e quindi convertirli (cast) a float quando ti serve
lavorarci sopra.

Daniele

----- Original Message ----- 
From: "Valerio Montagnani" <tech@vmontagnani.it>
To: "FLug-Tech" <tech@firenze.linux.it>
Sent: Monday, March 01, 2004 4:35 PM
Subject: [Tech] OT: C, linux e la rappresentazione in mem


Ciao amici, vi vorri sottoporre questo quisito:

devo acquisire un segnale audio e poi elaborarlo successivamente.
I seguenti parametri non possono essere cambiati:

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:

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
rappresentazione del campione audio.
Inoltre dato che l'acquisizione avviene su 2 canali (acquisizione stereo)
significa che nel buffer finiscono 32 bit per il canale sx e 32 bit per il
canale dx, rappresentati come descritto prima.

E' giusto questo ragionamento vero?

Ciao e grazie, Vale


-- 
Valerio Montagnani        (Lug-Account)        <tech@vmontagnani.it>
              pub 1024/C7E4BC57    sub 2048g/0E170155
Key fingerprint = D5A4 EDFC 060C 5BD6 E2DD  8252 3B67 C1EB C7E4 BC57
_______________________________________________
FLUG - Discussioni tecniche - tech@firenze.linux.it
URL: http://lists.firenze.linux.it/mailman/listinfo/tech
Archivio: http://lists.firenze.linux.it/pipermail/tech
Ricerca nell'archivio: http://www.firenze.linux.it/search




Maggiori informazioni sulla lista flug-tech