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

Valerio Montagnani tech@vmontagnani.it
Lun 1 Mar 2004 19:17:24 CET


On Mon, 1 Mar 2004 16:35:50 +0100
Valerio Montagnani <tech@vmontagnani.it> wrote:

Ok grazie amici. 
E' proprio una ca***ta quella che ho scritto. Bestia che sono! Ho fatto tutti i conti pensando alla rappresentazione degli int, pur lavorando con numeri floating.

Il problema è nato dall'elaborazione successiva all'acquisizione dei dati. Infatti i dati audio acquisiti saranno successivamente elaborati con una una funzione che fa fft e poi rimaneggiati ancora da altre funzioni, fino all'estrazione di coefficienti mel. Dato che le funzioni che fanno tutto questo lavoro hanno bisogno di trattare i dati con una precisione superiore agli 8 bit (in genere è sufficiente creare un array di tipo unsigned char, per accogliere i dati audio), ho pensato di allocare dinamicamente un buffer di tipo float invece che unsigned char, per evitare il casting successivamente. Quindi ho continuato a ragionare come se avessi a che fare con i numeri interi, non considerando affatto come sono rappresentati i float.

Bene. Ricominciamo. 
Se ho 2 canali e rappresento un campione come float significa che nei primi 64 bit del buffer ho la rappresentazione float del primo campione acquisito dal canale sx e quindi dal canale dx. Nei successivi 64 ho di nuovo 32 bit riservati al canale sx e 32 al dx e così via... Se effettivamente il kernel di linux disponga prima il canale sx e poi il dx non è rilevante (per il mio problema, tuttavia se qualcuno sapesse in che ordine sono disposti i canali, mi farebbe piacere saperlo).
Volendo estrarre dal buffer un canale solo per fare tutte le elaborazioni che vi ho descritto a grandi linee sopra, basta impostare un ciclo che si sposti a salti di 64 bit (di cui solo dei primi 32 sono quelli che devo usare), lungo tutto il buffer. Giusto vero? In questo modo, indipendentemente da come sarà rappresentato il campione di tipo float (24 bit + 8 bit o altro), mi becco sempre il campione del canale sx rappresentato in virgola mobile.

Un'ultima cosa, una bischerata, ma sono un programmatore alla prime armi. Su tutti i manuali che ho letto c'è sempre un esempio per descrivere l'allocazione dimanica di un vettore usando malloc, calloc o altro.
Ma qual'è la sintassi per allocare un array a due o tre dimensioni?

Grazie per l'attenzione, 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



Maggiori informazioni sulla lista flug-tech