[Tech] Domanda di C

Valerio Montagnani tech@vmontagnani.it
Gio 27 Maggio 2004 15:31:21 CEST


On Thu, 27 May 2004 12:37:53 +0200 (CEST)
Franco Bagnoli <bagnoli@dma.unifi.it> wrote:

Hai ragione, ho un casino di confusione in testa.

> a questo punto sono io che non capisco. Se i dati sono signed char perché 
> li converti a short? Sei tu che li converti? e che te ne frega se sono 
> little endian in memoria? 

Ho un sensore acustico che acquisisce dati. La scheda audio di un computer opera da ADC (convertitore analogico-digitale) e mi restituisce un vettore signed char.
Il vettore signed char viene decimato, eliminando il segnale del canale dx. A questo punto trasformato in un vettore di dati float per l'elaborazione numerica e le varie misure da fare.

Se vado a rappresentare con un programma di elaborazione di tracce musicali, come audacity, il vettore acquisito, scopro che ha livelli molto bassi.
Ciò che mi è venuto in mente di fare, quindi è di aumentare i livelli del segnale, moltiplicando i campioni per un valore di amplificazione.
Tuttavia i dati signed char possono rappresentare valori compresi tra -128 e 127, quindi se voglio dei valori maggiori per i campioni, senza incorrere negli errori di rappresentazione in modulo 2, devo per forza trasformare i dati di partenza in qualcosa che mi permetta di rappresentare numeri più grossi. Visto che successivamente lovorerò con valori float, sicuramente trasformerò i dati di partenza in float prima di fare l'elaborazione numerica.

Il problema del little-endian era nato ieri quando leggevo dei documenti relativi alla rappresentazione dei dati audio, perchè mi piaceva vedere l'andamento del segnale dopo l'amplificazione (usando audacity). Tuttavia come vi dicevo oggi, mi sembra inutile disassemblare il dato little-endian amplificarlo singolarmente e riassemblarlo, basta moltiplicare tutto per il fattore di amplificazione, e automaticamente sia la parte low che la high del dato saranno opportunamente amplificate. Si incorre in un errore di rappresentazione solo se tratterò il dato secondo un formato NON little-endian.

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.

E' di tutto questo che chiedevo conferma.
Spero di aver fatto un po' più di chiarezza.


> il formato double è tutto diverso da quello int. Se prendi un numero che è 
> in una rapprensetazione diveersa da quella nativa, e lo converti a double, 
> direi che ha poco a che fare con il numero originario. 
> 

Lascia stare il fatto che nella mail precedente dicevo di trattare il dato come double. Parliamo in termini di float.
I float sono rappresentati come dati in virgola mobile, quindi come mantissa e esponente, a differenza dei dati int, char....

Non capisco che cosa significa che il dato ha poco a che fare con il numero originario: vuoi dirmi che è diversa la rappresentazione in macchina, vero?

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