16-битные сэмплы обычно знаковые, а 8-битные обычно беззнаковые, поэтому самый простой ответ заключается в том, что вам нужно преобразовать 16-битные сэмплы из знаковых (16-битные сэмплы почти всегда хранятся в диапазоне от -32768 до +32767) до беззнакового, а затем взять старшие 8 бит результата. В C это может быть выражено как output = (unsigned char)((unsigned short)(input + 32768) >> 8). Это хорошее начало, и оно может быть достаточно хорошим для ваших нужд, но звучит не очень хорошо. Звучит грубо из-за "шума квантования".
Шум квантования — это разница между исходным входом и выходом вашего алгоритма. Независимо от того, что вы делаете, у вас будет шум, и шум будет в среднем «полбита». С этим ничего не поделаешь, но есть способы сделать шум менее заметным.
Основная проблема с шумом квантования заключается в том, что он имеет тенденцию формировать шаблоны. Если бы разница между входом и выходом была полностью случайной, все на самом деле звучало бы нормально, но вместо этого выходной сигнал постоянно был бы слишком высоким для определенной части сигнала и слишком низким для следующей части. Ваше ухо улавливает этот образец.
Чтобы получить результат, который звучит хорошо, вам нужно добавить дизеринг. Дизеринг — это метод, который пытается сгладить шум квантования. Самый простой дизеринг просто удаляет шаблоны из шума, чтобы шаблоны шума не отвлекали от реальных шаблонов сигнала. Лучшее сглаживание может пойти еще дальше и предпринять шаги для уменьшения шума путем сложения значений ошибок из нескольких выборок, а затем добавления коррекции, когда общая ошибка становится достаточно большой, чтобы ее можно было исправить.
Объяснения и примеры кода для различных алгоритмов сглаживания можно найти в Интернете. Одной из хороших областей для изучения может быть инструмент SoX, http://en.wikipedia.org/wiki/SoX< /а>. Проверьте источник на наличие эффекта сглаживания и поэкспериментируйте с преобразованием различных звуков из 16-битного в 8-битное с включенным сглаживанием и без него. Вы будете удивлены той разницей в качестве, которую может дать дизеринг при преобразовании в 8-битный звук.
person
user2774867
schedule
13.09.2013