Frage

Ich habe einen Puffer mit vielen positiven 16bit-Werte (die als Doppel gespeichert sind), dass ich auf 8bit quantisiert möchte (0-255 Werte).

Nach Wikipedia der Prozess wäre:

  • Normalisieren 16-Bit-Werte. D. h findet die größte und teilt mit diesem.
  • Mit der Q (x) mit der Formel M = 8.

So frage ich mich, wenn C eine Funktion haben, die diese Quantisierung tun können, oder hat jemand weiß von einer C-Implementierung, dass ich verwenden könnte?

Alles Liebe, Louise

War es hilfreich?

Lösung

den Wert d Unter der Annahme, im Intervall [0.0, max]:

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

Ich bin nicht sicher, was Sie unter „16-Bit-Werten;“ double precision Werte sind 64-Bit auf jedem System unter Verwendung von IEEE-754. Wenn Sie jedoch Werte eines anderen numerischen Typ haben, der Prozess ist effektiv gleich.

Andere Tipps

Das klingt wie Wellenform Audioverarbeitung, wo Sie Ihre Eingabe ist 16 PCM-Daten, die Ausgabe ist 8-Bit-PCM-Daten und Sie sind mit Doppel als ein Zwischenwert.

Allerdings 8-Bit-PCM-Wellendaten sind nicht nur quantisiert, ist die Darstellung unsigned Werte von über 128 Notation. (Wie die Art und Weise Exponenten gespeichert sind, in Gleitkommazahlen)

Die Suche nach dem größten Wert würde zunächst nur nicht Quantisierung, sondern auch die Skalierung. So in Pseudo-Code

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

Sie könnten Runde statt Kürzen, wenn Sie mehr Genauigkeit wünschen, aber in der Audio-Verarbeitung, ist es im Allgemeinen besser, die Kürzung um Randomisierung oder sogar im Wesentlichen Form durch einen Filteralgorithmus als Teil der Verkürzung von verdoppelt unterzeichnet Zeichen ausgeführt wird.

. Hinweis: dass signed char ist nicht korrekt, wenn der Ausgang 8-Bit-PCM-Daten, aber da die Fragen verlangt nicht ausdrücklich, dass, Ich habe es aus

Edit: wenn diese als Pixeldaten verwendet werden soll, dann möchten Sie Werte ohne Vorzeichen. Ich sehe James gab bereits die richtige Antwort für Werte ohne Vorzeichen, wenn der Eingang nicht signiert ist (dB-Werte von normalisierten Daten sollten alle negativ sein, tatsächlich)

Es ist nicht von der Frage klar, was die Codierung da ist „ positive 16bit-Werte (die als Doppel gespeichert werden) “ macht keinen wirklichen Sinn; sie sind entweder 16 Bit oder sie sind doppelt, sie können nicht beides sein.

jedoch davon aus, dass diese 16 bis 1,0 normalisiert unsigned Datenbit (so werden die Werte aus dem Bereich 0.0 <= s <= 1,0), dann brauchen Sie zu tun, um sie ganzzahlige Werte zu 8bit erweitern von 255 ist jede Probe zu multiplizieren.

unsigned char s8 = s * 255 ;

Wenn der Bereich nicht 0,0 <= s <= 1,0, sondern 0,0 <= s <= max dann:

unsigned char s8 = s / max * 255 ;

So oder so, es gibt keine „Quantisierung“ andere Funktion als eine Sie selbst schreiben kann; aber die notwendige Transformation ohne Zweifel ein einfacher arithmetischer Ausdruck sein (wenn auch nicht so einfach, wenn die Daten vielleicht kompandiert werden - d.h. μ-lay oder A-Gesetz beispielsweise codiert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top