/ / Hat C eine Quantisierungsfunktion? - c, Quantisierung

Hat C eine Quantisierungsfunktion? - c, Quantisierung

Ich habe einen Puffer mit vielen positiven 16bit-Werten (die als Doubles gespeichert werden), die ich auf 8bit (0-255-Werte) quantisieren möchte.

Gemäß Wikipedia Der Prozess wäre:

  • 16-Bit-Werte normalisieren. Das heißt Finde das Größte und teile damit.
  • Verwenden Sie die Formel Q (x) mit M = 8.

Ich frage mich also, ob C eine Funktion hat, die diese Quantisierung durchführen kann, oder kennt jemand eine C-Implementierung, die ich verwenden könnte?

Viele Liebe, Louise

Antworten:

2 für die Antwort № 1

Wert annehmen d ist 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 mit "16-Bit-Werten" meinen.Werte mit doppelter Genauigkeit sind auf jedem System, das IEEE-754 verwendet, 64-Bit. Wenn Sie jedoch Werte eines anderen numerischen Typs haben, ist der Prozess praktisch derselbe.


3 für die Antwort № 2

Dies klingt wie Wellenform-Audioverarbeitung, bei der Ihre Eingabe 16 PCM-Daten, Ihre Ausgabe 8-Bit-PCM-Daten ist und Sie als Zwischenwert Doppelwerte verwenden.

8-Bit-PCM-Wellendaten werden jedoch NICHT nur quantisiert, sondern die Darstellung ist vorzeichenlose Werte in über 128 Schreibweise. (wie die Exponenten in Gleitkommazahlen gespeichert werden)

Den größten Wert zuerst zu finden, wäre nicht nur Quantisierung, sondern auch Skalierung. Also im Pseudocode

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

Sie könnten eher abrunden als abschneiden, wenn SieIch möchte mehr Genauigkeit, aber bei der Audioverarbeitung ist es im Allgemeinen besser, die Abschneidereihenfolge zufällig zu gestalten oder sogar zu formen, indem im Wesentlichen ein Filteralgorithmus als Teil der Abschneidung von doppelten Zeichen auf vorzeichenbehaftete Zeichen ausgeführt wird.

Hinweis: Dieses signierte Zeichen ist NICHT korrekt, wenn die Ausgabe 8-Bit-PCM-Daten ist. Da die Fragen dies jedoch nicht ausdrücklich verlangen, habe ich es ausgelassen.

Bearbeiten: Wenn dies als Pixeldaten verwendet werden soll, möchten Sie vorzeichenlose Werte. Ich sehe, dass James bereits die richtige Antwort für unsignierte Werte gab, wenn die Eingabe unsigniert ist (dB-Werte aus normalisierten Daten sollten eigentlich alle negativ sein)


1 für die Antwort № 3

Aus Ihrer Frage ist nicht klar, was die Kodierung seit "positive 16bit-Werte (die als Doppelwerte gespeichert werden)"macht keinen wirklichen Sinn; sie sind entweder 16 Bit oder doppelt, sie können nicht beides sein.

Unter der Annahme, dass dies 16-Bit-Daten ohne Vorzeichen sind, die auf 1,0 normiert sind (die Werte liegen also zwischen 0,0 <= s <= 1.0), dann müssen Sie sie nur mit 255 multiplizieren, um sie auf 8-Bit-Ganzzahlwerte zu erweitern.

unsigned char s8 = s * 255 ;

Wenn der Bereich nicht 0.0 <= ist s <= 1,0, aber 0,0 <= s <= max dann:

unsigned char s8 = s / max * 255 ;

In beiden Fällen gibt es keine "Quantisierungsfunktion"außer einem könnten Sie sich selbst schreiben; Die notwendige Transformation wird jedoch zweifellos ein einfacher arithmetischer Ausdruck sein (obwohl dies nicht so einfach ist, wenn die Daten vielleicht kompandiert sind - d. h. μ-Lay oder A-Law beispielsweise codiert).