Question

I doivent réduire la profondeur de bits d'un signal audio numérique de 24 à 16 bits.

on considère seulement les (à savoir troncature) 16 bits les plus significatifs de chaque échantillon est équivalent à faire un calcul proportionnel (out = en * 0xFFFF / 0xFFFFFF)?

Était-ce utile?

La solution

Je suppose que vous (in * 0xFFFF) / 0xFFFFFF moyenne, auquel cas, oui.

Autres conseils

Vous obtiendrez de meilleurs résultats de sondage en ajoutant un signal sonore soigneusement conçu pour le signal original, juste au-dessous du seuil tronquer, avant la troncation (tramage a.k.a.).

tramage en ajoutant bruit en général vous donner de meilleurs résultats. La clé est la forme du bruit. La popula pow-r algorithmes de tramage ont une forme spécifique est très populaire dans beaucoup d'applications de station de travail audio numérique (SONAR de Cakewalk, Logic, etc).

Si vous n'avez pas besoin pleinement sur la fidélité de pow-r, vous pouvez simplement générer des bruit à une amplitude assez faible et le mélanger dans votre signal. Vous trouverez ce masque certains des effets de quantification.

x * 0xffff / 0xffffff est trop de pédant, mais pas une bonne façon si vos échantillons sont signés -. Et probablement pas une bonne façon en général

Oui, vous voulez la valeur maximale dans votre plage source pour correspondre à la valeur maximale dans votre gamme de destination, mais les valeurs utilisées il n'y a que pour les gammes non signés, et la répartition des étapes de quantification signifie que ce sera très rare vous utilisez la plus grande valeur de sortie possible.

Si les échantillons sont signés alors les valeurs positives de pointe seraient 0x7fff et 0x7fffff, tandis que les valeurs négatives de pointe seraient -0x8000 et -0x800000. Votre premier problème est de décider si +1 est égal à 0x7fff, ou -1 est égal à -0x8000. Si vous choisissez cette dernière alors il est une opération de décalage simple. Si vous essayez d'avoir les deux alors zéro cesse d'être égal à zéro.

Après que vous avez un problème que les tours de division vers zéro. Cela signifie que trop de valeurs se arrondi à zéro par rapport à d'autres valeurs. Cela provoque une distorsion.

Si vous voulez à l'échelle en fonction des pics de valeurs positives, la forme correcte serait:

out = rint((float)in * 0x7fff / 0x7fffff);

Si vous pêchez un peu autour, vous pouvez probablement un moyen efficace de le faire avec l'arithmétique entier et pas de division.

Ce formulaire doit correctement autour de la valeur de sortie disponible le plus proche pour une entrée donnée, et il devrait cartographier la plus grande valeur d'entrée possible de la plus grande valeur de sortie possible, mais il va avoir une distribution laide des étapes de quantification dispersées dans toute la gamme .

La plupart des gens préfèrent:

out = (in + 128) >> 8;
if (out > 0x7fff) out = 0x7fff;

Cette forme rend les choses le plus fort de tout petit peu, au point que les valeurs positives peuvent couper un peu, mais les étapes de quantification sont répartis uniformément.

Vous ajoutez 128 parce que rounds droit vers l'infini décalage. moyenne erreur de quantification est -128 et vous ajoutez 128 pour corriger cela pour garder 0 précisément 0. Le test de dépassement est nécessaire, car une valeur d'entrée de 0x7fffff donne par ailleurs un résultat de 0x8000, et quand vous stockez cela dans un mot de 16 bits, il serait enrouler autour de donner une valeur négative de pointe.

C pédants peut faire des trous dans les hypothèses sur déplacement vers la droite et le comportement de division, mais je donne sur ceux pour plus de clarté.

Cependant, comme d'autres l'ont souligné, vous réduire ne devraient généralement pas la profondeur de bits audio sans tramage, et idéalement de formation de bruit. TPDF tramage est la suivante:

out = (in + (rand() & 255) - (rand() & 255)) >> 8;
if (out < -0x8000) out = -0x8000;
if (out > 0x7fff) out = 0x7fff;

Encore une fois, les grands problèmes avec l'utilisation de rand() que je vais négliger pour plus de clarté.

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