[Tech] Domanda di C

Valerio Montagnani tech@vmontagnani.it
Gio 27 Maggio 2004 16:25:17 CEST


On Thu, 27 May 2004 15:52:58 +0200 (CEST)
Franco Bagnoli <bagnoli@dma.unifi.it> wrote:

> On Thu, 27 May 2004, Valerio Montagnani wrote:

> > Se vado a rappresentare con un programma di elaborazione di tracce
> > musicali, come audacity, il vettore acquisito,
> 
> intendi prima della conversione a float? quando sono ancora signed char?
> 

si


> assolutamente no. Se i dati sono signed char non c'è nessun little o 
> big-endian. Sono char e basta. Se, supponiamo, prendi uno short 
> little-endian su una macchina big-endian e lo moltiplichi per qualcosa, 
> ottieni un numero che ha poco a che fare con quello di partenza, dato che 
> i bit delle due parti si sono rimescolati. Peggio che mai se lo converti 
> in float. 
> 
> diciamo che ti funziona perché i processori intel sono little-endian e 
> quindi non fai nessuna cornversione. 
> 

L'applicazione deve girare solo su PC (per lo meno il prototipo); la scheda che ho a disposizione ha un solo modo per codificare i dati: il little-endian.
Ma fammi capire bene, se io dichiaro:

int buffer[1920000];

il cui compito è quello di contenere i dati acquisiti dal sensore, me ne posso fregare della codifica little-endian, e trattare tranquillamente dati a 16 bit, come se fossero generati da una qualsiasi funzione?
E' questo quello che mi volevi dire?

> 
> > 
> > Ora, se io volessi rivedere l'effetto di questa elaborazione su
> > audacity, devo far capire a audacity che ha a che fare con una serie di
> > dati little-endian a 32 bit (float), impostare il numero dei canali e la
> > freq di campionamento giusti, e non più little-endian 16 bit; così
> > facendo mi aspetto di poter vedere opportunamente il mio nuovo segnale.
> 
> little-endian sono solo per interi (o meglio: parole), non esistono 
> little-endian per i float (anche se ovviamente, dato che i float sono 
> memorizzati su delle parole è differente memorizzare un float in una 
> parola little-endian o big-endian). Ma per i float ci sono anche altri 
> problemi, sul tipo di rappresentazione. 

Hai ragione. Avevo letto male le specifiche. I formati AFMT_S32_XX a cui mi riferivo lavorano come int o come 3 word.
> 

> 
> Supponiamo di lavorare con un computer big-endian (ovvero di scrivere i 
> dati come siamo abituati: 
> 
> a = 03 10 (in esadecimale per fare prima) = (0*16+3)*256+(1*16+0) = 784
> Se il dato viene da un file little-endian invece diventa, quando lo stampi 
> per esempio: (1*16+0)*256+(0*16+3)=4099.
> 
> Chiaramente se converti a float ottieni li stessi numeri (con la virgola): 
> a=784.0 in un caso, a=4099.0 nell'altro. Non mi sembrano la stessa cosa. 
> 
> Se  moltiplichi gli interi per 16 per esempio (shiftando il numero di 4 
> bit), ottieni nel primo caso 31 00 = 4864, nel secondo 
> 00 30 (l'1 si perde) = 48
> 
> Se invece moltiplichi i float ottieni 12544.0 nel primo caso, 65584.0 nel 
> secondo. Ma quando poi li riconveri a interi ottieni il valore di cui 
> sopra, in nessun caso "è uguale" moltiplicare i numeri con una 
> rappresentazione diversa da quella della macchina, perché la macchina fa 
> le operazioni seguendo le regole sue. 
> 

ok, avevo interpretato male

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



Maggiori informazioni sulla lista flug-tech