Les échantillons de 16 bits sont généralement signés et les échantillons de 8 bits sont généralement non signés. La réponse la plus simple est de convertir les échantillons de 16 bits en échantillons signés (les échantillons de 16 bits sont presque toujours stockés de -32768 à +32767) à unsigned et ensuite prendre les 8 premiers bits du résultat. En C, cela pourrait être exprimé comme output = (unsigned char) ((unsigned short) (entrée + 32768) >> 8). C'est un bon début, et pourrait être assez bon pour vos besoins, mais cela ne vous semblera pas très agréable. Cela semble rugueux à cause du "bruit de quantification".
Le bruit de quantification est la différence entre l'entrée d'origine et la sortie de votre algorithme. Peu importe ce que vous faites, vous allez avoir du bruit, et le bruit sera "un demi-bit" en moyenne. Il n'y a rien que vous puissiez faire à ce sujet, mais il existe des moyens de rendre le bruit moins perceptible.
Le principal problème avec le bruit de quantification est qu'il a tendance à former des motifs. Si la différence entre l'entrée et la sortie était complètement aléatoire, les choses sembleraient bien, mais la sortie sera à plusieurs reprises trop élevée pour une certaine partie de la forme d'onde et trop faible pour la partie suivante. Votre oreille capte ce motif.
Pour avoir un résultat qui sonne bien, vous devez ajouter tramage. Le dithering est une technique qui essaie de lisser le bruit de quantification. Le tramage le plus simple supprime simplement les motifs du bruit de sorte que les motifs de bruit ne distraient pas des motifs de signal réels. Mieux tramage peut aller plus loin et prendre des mesures pour réduire le bruit en additionnant les valeurs d'erreur à partir de plusieurs échantillons, puis en ajoutant une correction lorsque l'erreur totale devient assez grand pour être utile de corriger.
Vous trouverez des explications et des exemples de code pour les différents algorithmes de tramage en ligne. Un bon domaine à étudier pourrait être l'outil SoX, http://en.wikipedia.org/wiki/SoX. Vérifiez l'origine de son effet de tramage et expérimentez la conversion de différents sons de 16 bits à 8 bits avec et sans tramage activé. Vous serez surpris par la différence de qualité que le tramage peut faire lors de la conversion en son 8 bits.
Le débit peut être important (mais pas nécessairement) - par ex. quand vous traitez avec des convertisseurs A/N (quand vous traitez avec l'audio vous le sortez finalement par A/D) vous pourriez augmenter la fréquence d'échantillonnage d'un facteur de 65k (si je calculais correctement) pour obtenir la plus haute résolution avec moins de bits). – flolo
Ce n'est pas Java, mais regardez comment ffmpeg l'implémente. Parcourir le code ici: http://ffmpeg.org/doxygen/0.5/pcm_8c-source.html – Aleadam
@gosho_ot_pochivka Pouvez-vous me faire savoir comment convertir 16bit pcm en 24 bits. Merci – ravi