Клиппинг при конвертировании 16-битных образцов ПКМ для беззнаковых 8-битных образцов ПКМ
У меня есть подписанные моно 16-битные аудиосэмплы PCM, хранящиеся в буфере SInt16, и я пытаюсь преобразовать их в неподписанные моно 8-битные аудиосэмплы PCM, хранящиеся в буфере UInt8. Я написал следующий в основном рабочий код:
for (int i=0; i < numSamples; i++) {
SInt8 tempSigned8Bit = signed16BitBuffer[i]/127; // In 2 passes
unsigned8BitBuffer[i] = tempSigned8Bit + 127; // for clarity
}
Тем не менее, я могу слышать отсечение на максимальных амплитудах в результирующем звуке, или, по крайней мере, это мое впечатление о том, где происходит искажение. Является ли это артефактом повторного квантования или мне нужно включить какой-то зажим, как описано в этот вопрос о подобном преобразовании, но без какого-либо преобразования означенности:
Преобразование 16 бит pcm в 8 бит
Побитовые оптимизации излишни, но я, конечно, не сказал бы им "нет".
1 ответ:
Это не сработает для больших значений, потому что вам нужно разделить на 256, а не на 127. Также смещение должно быть 128, а не 127.
for (int i = 0; i < numSamples; i++) { SInt8 tempSigned8Bit = signed16BitBuffer[i] / 256; unsigned8BitBuffer[i] = tempSigned8Bit + 128; }
Преобразование для + / - полной шкалы и нуля выглядит следующим образом:
Signed Divide Add 16 bit by 256 128 sample 32767 -> 127 -> 255 ; Full scale + 0 -> 0 -> 128 ; 0 -32768 -> -128 -> 0 ; Full scale -