Клиппинг при конвертировании 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 2

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 -