[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