Question

J'ai un tampon avec de nombreuses valeurs positives (16bit qui sont stockés en double) que je voudrais à quantifie 8bit (0-255 valeurs).

Selon Wikipedia le processus serait:

  • Normaliser valeurs 16 bits. C'est à dire. trouver le plus grand et le partager avec cela.
  • Utiliser la formule Q (x) avec M = 8.

Je me demande, si C ont une fonction qui peut faire cette quantification, ou que quelqu'un sait d'une implémentation C que je pourrais utiliser?

Beaucoup d'amour, Louise

Était-ce utile?

La solution

En supposant que la valeur d est dans l'intervalle [0.0, max]:

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

Je ne sais pas ce que vous entendez par « valeurs 16 bits; » les valeurs en double précision sont de 64 bits sur un système utilisant IEEE-754. Toutefois, si vous avez des valeurs d'un autre type numérique, le processus est effectivement le même.

Autres conseils

Cela ressemble à un traitement audio forme d'onde, où votre entrée est de 16 données PCM, votre sortie est de 8 données PCM bits et que vous utilisez doubles comme une valeur intermédiaire.

Cependant, 8 bits de données d'onde PCM est pas seulement quantifiée, la représentation est des valeurs non signées dépassant la notation 128. (Comme les exposants sont stockés dans les nombres à virgule flottante)

Trouver la plus grande valeur première serait non seulement quantification, mais aussi mise à l'échelle. Ainsi, dans le code pseudo

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

Vous pouvez arrondir plutôt que tronquer si vous voulez plus de précision, mais dans le traitement audio, il est généralement préférable de randomiser l'ordre de troncature ou la forme même par essentiellement l'exécution d'un algorithme de filtrage dans le cadre de la troncation du double de caractères signés.

Note: que signed char n'est pas correct si la sortie est de 8 données PCM bits, mais puisque les questions ne demande pas expressément que, je l'ai laissé sur

.

Edit: si cela doit être utilisé comme données de pixels, alors vous voulez des valeurs non signées. Je vois James a déjà donné la bonne réponse pour les valeurs non signées lorsque l'entrée est non signé (valeurs en dB à partir de données normalisées doivent être tous négatifs, en fait)

Il est pas clair de votre question ce que l'encodage est depuis « valeurs positives (16bit qui sont stockés en double) » n'a pas de sens réel; ils sont soit 16 bits ou ils sont doubles, ils ne peuvent pas être à la fois.

Cependant en supposant que ce soit 16 bits de données normalisé non signé à 1,0 (de sorte que les valeurs sont comprises entre 0.0 <= <= 1.0), tout ce que vous devez faire pour les étendre à 8bit valeurs entières est de multiplier chaque échantillon par 255.

unsigned char s8 = s * 255 ;

Si la plage est pas 0.0 <= <= 1,0, mais 0,0 <= s <= max puis:

unsigned char s8 = s / max * 255 ;

De toute façon, il n'y a pas de fonction « de quantification » autre que celui que vous pourriez vous écrire; mais le nécessaire transform sera sans aucun doute une expression arithmétique simple (mais pas si simple si les données sont companded peut-être - à savoir μ-lay ou A-loi codé par exemple).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top