Отсечение при преобразовании 16-битных семплов PCM со знаком в 8-битные сэмплы PCM без знака

Я подписал монофонические 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-битный

Побитовые оптимизации не нужны, но я бы точно не отказался от них.


person Halle    schedule 23.07.2012    source источник


Ответы (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 -
person Paul R    schedule 23.07.2012