Frage

Sagen, ich habe einen Schwimmer im Bereich von [0, 1] und ich möchte quantisiert und speichern sie in einem Byte ohne Vorzeichen. Klingt wie ein Kinderspiel, aber in Wirklichkeit ist es ziemlich kompliziert:

Die offensichtliche Lösung sieht wie folgt aus:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f);
}

Das funktioniert so weit, dass ich alle Zahlen von 0 bis 255, aber die Verteilung der Zahlen ist nicht einmal. Die Funktion nur 255 wenn ein genau 1.0f. Keine gute Lösung.

Wenn ich die richtige Rundung kann ich verschieben nur das Problem:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

Hier ist das das Ergebnis 0 deckt nur die Hälfte des Schwimmers-Bereich als jede andere Zahl.

Wie mache ich eine Quantisierung mit der gleichen Verteilung der Floating-Point-Bereich? Im Idealfall würde Ich mag eine gleiche Verteilung von ganzen Zahlen bekommen, wenn ich gleich zufälligen Schwimmer verteilt quantisieren.

Irgendwelche Ideen?


BTW: Auch mein Code in C das Problem ist sprachunabhängig. Für die Nicht-C Personen: einfach annehmen, dass float int Umwandlung des Schwimmers kürzt

.

EDIT: Da wir einige Verwirrung hier hatten: Ich brauche eine Abbildung, die den kleinsten Eingang Schwimmer (0) auf den kleinsten unsigned char abbildet, und den höchsten Schwimmer meiner Reichweite (1.0f) zu das höchste Byte ohne Vorzeichen (255).

War es hilfreich?

Lösung

Wie wäre es a * 256f mit einem Scheck von 256 bis 255 zu reduzieren? So etwas wie:

return (unsigned char) (min(255, (int) (a * 256f)));

(Für eine geeignete min Funktion auf Ihrer Plattform -. Ich die C-Funktion für sie nicht mehr erinnern kann)

Im Grunde wollen Sie den Bereich in 256 gleiche Abschnitte teilen, das ist, was das tun sollte. Der Rand Fall für 1,0 bis 256 gehen und erfordern Abrunden ist, nur weil die Domäne an beiden Enden inklusive ist.

Andere Tipps

Ich denke, was Sie suchen ist dies:

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

Dies wird einheitliche Float-Werte in der Karte [0, 1], um einheitliche Byte-Werte in [0, 255]. Alle Werte in [i / 256, (i + 1) / 256 [(das heißt ohne (i + 1) / 256), für i in 0..255, sind i zugeordnet. Was könnte unerwünscht sein, dass 1.0f zu 256.0f abgebildet wird, die um Wraps auf 0.

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