Pregunta

Tengo un tampón con muchos valores de 16 bits positiva (que se almacenan como dobles) que me gustaría cuantizar a 8 bits (0-255 valores).

De acuerdo con Wikipedia el proceso sería el siguiente:

  • Normalizar 16 valores de bit. Es decir. encontrar el más grande y se dividen con esto.
  • Usar la fórmula Q (x) con M = 8.

Así que me pregunto, si C tiene una función que puede hacer esto de cuantificación, o ¿alguien sabe de una implementación de C que podría utilizar?

Con mucho amor, Louise

¿Fue útil?

Solución

Suponiendo que el d valor está en el intervalo de [0.0, max]:

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

No estoy seguro de lo que quiere decir con "valores de 16 bits;" valores de precisión doble son de 64 bits en cualquier sistema usando IEEE-754. Sin embargo, si tiene valores de otro tipo numérico, el proceso es efectivamente el mismo.

Otros consejos

Esto suena como el procesamiento de audio de forma de onda, donde la entrada es de 16 datos PCM, la salida es de 8 bits de datos PCM y utiliza los dobles como un valor intermedio.

Sin embargo, los datos de onda PCM de 8 bits no es sólo cuantizada, la representación es valores sin signo en exceso de 128 notación. (Al igual que la forma en que los exponentes son almacenados en números de punto flotante)

Encontrar el valor más grande primero, no sólo sería cuantificación, sino también la ampliación. Así que en pseudo código

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

redonda en lugar de podría truncar si quieres más exactitud, pero en el procesamiento de audio, es generalmente mejor para aleatorizar el orden de truncamiento o incluso darle forma mediante la ejecución esencialmente un algoritmo de filtrado como parte del truncamiento desde dobles a caracteres firmados.

Nota:. Signed char que no es correcta si la salida es de 8 bits de datos PCM, pero ya que las preguntas no solicita específicamente que, me dejó fuera

Edit: si esto se va a utilizar como datos de píxeles, entonces usted quiere valores sin signo. Veo James ya dio la respuesta correcta para valores sin signo cuando la entrada es sin signo (valores de dB a partir de datos normalizados deben ser todos negativos, en realidad)

No está claro por su pregunta cuál es la codificación es ya " Los valores de 16 bits positivo (que se almacenan como dobles) " no tiene ningún sentido real; o bien son 16 bits o que son dobles, no pueden ser ambas cosas.

Sin embargo suponiendo que se trata de 16 bit de datos sin signo normalizó a 1,0 (lo que los valores van desde 0,0 <= s <= 1,0), entonces todo lo que necesita hacer para expandirlos a 8bit número entero valores es multiplicar cada muestra por 255.

unsigned char s8 = s * 255 ;

Si el rango no es 0,0 <= s <= 1,0, pero 0,0 <= s <= max a continuación:

unsigned char s8 = s / max * 255 ;

De cualquier manera, no hay ninguna función "cuantificación" que no sea uno puede escribir usted mismo; pero la necesaria transformación que será sin duda una expresión aritmética simple (aunque no es tan sencillo si los datos se compande tal vez - es decir, μ-lay o ley codificada por ejemplo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top