Domanda

Ho un buffer con molti valori 16 bit positiva (che sono memorizzati come doppio) che desidero quantizzare a 8bit (0-255 valori).

Wikipedia il processo potrebbe essere:

  • I valori Normalizzare 16 bit. Cioè trovare la più grande e dividere con questo.
  • Utilizzare la formula Q (x) con M = 8.

Allora mi chiedo, se C ha una funzione che può fare questo quantizzazione, o qualcuno sa di un'implementazione C che potrei usare?

Un sacco di amore, Louise

È stato utile?

Soluzione

Supponendo che il valore è d nella [0.0, max] intervallo:

unsigned char quantize(double d, double max)
{
    return (unsigned char)((d / max) * 255.0);
}

Non sono sicuro di cosa si intende per "valori a 16 bit;" valori doppi di precisione sono 64 bit su qualsiasi sistema utilizzando IEEE-754. Tuttavia, se si dispone di valori di un altro tipo numerico, il processo è effettivamente la stessa.

Altri suggerimenti

Questo suona come l'elaborazione audio forma d'onda, dove l'input è di 16 dati PCM, l'output è di 8 bit di dati PCM e si utilizza doppie come un valore intermedio.

Tuttavia, 8 bit dati onda PCM non è solo quantizzato, la rappresentazione è valori senza segno superiori 128 notazione. (Come il modo in cui esponenti sono memorizzati in numeri in virgola mobile)

Trovare il valore più basso non solo sarebbe quantizzazione, ma anche il ridimensionamento. Quindi, in pseudo codice

double dMax = max_of_all_values(); // 
...
foreach (dValue in array_of_doubles)
{
   signed char bValue = (signed char)((dValue / dMax)*127.0);
}

Si potrebbe concludere piuttosto che il troncamento se si vuole più precisione, ma in elaborazione audio, è generalmente preferibile casuale l'ordine troncamento o anche plasmarla, sostanzialmente, l'esecuzione di un algoritmo di filtraggio come parte del troncamento da doppie a caratteri firmati.

Nota: che char firmato non è corretto se l'uscita è 8 bit di dati PCM, ma dal momento che le domande non fa specificamente chiedere che, ho lasciato fuori

.

Edit: se questo deve essere usato come i dati dei pixel, quindi si desidera valori senza segno. Vedo James ha già dato la risposta corretta per i valori senza segno quando l'ingresso è senza segno (valori in dB da dati normalizzati devono essere tutti negativi, in realtà)

Non è chiaro dalla tua domanda che cosa la codifica è dato " valori 16bit positiva (che vengono memorizzati come doppie) " non ha senso reale; essi sono o 16 bit o sono doppia, non possono essere entrambi.

Tuttavia nell'ipotesi che ciò è di 16 bit di dati senza segno normalizzati a 1,0 (quindi i valori sono compresi tra 0,0 <= s <= 1.0), allora tutto è necessario fare per espandere loro a 8bit valori interi è moltiplicare ciascun campione da 255.

unsigned char s8 = s * 255 ;

Se l'intervallo non è 0,0 <= s <= 1,0, ma 0,0 <= s <= max , allora:

unsigned char s8 = s / max * 255 ;

In entrambi i casi, non esiste una funzione "quantizzazione" diverso da quello che si potrebbe scrivere da soli; ma la necessaria trasformazione sarà senza dubbio una semplice espressione aritmetica (anche se non così semplice se i dati sono companded forse - cioè μ-lay o A-law codificato per esempio).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top