将带符号的16位PCM采样转换为无符号8位PCM采样时的削波

Hal*_*lle 2 c audio signal-processing pcm ios

我签署了存储在SInt16缓冲区中的单声道16位PCM音频样本,我试图将它们转换为存储在UInt8缓冲区中的无符号单声道8位PCM样本.我写了以下基本工作代码:

for (int i=0; i < numSamples; i++) { 
    SInt8 tempSigned8Bit = signed16BitBuffer[i]/127; // In 2 passes
    unsigned8BitBuffer[i] = tempSigned8Bit + 127;    // for clarity
}
Run Code Online (Sandbox Code Playgroud)

但是,我可以听到结果音频中最大振幅的削波,或者至少是我对失真发生位置的印象.这是重新量化的工件还是我需要包含某种类型的钳位,如此问题中描述的类似转换但没有任何符号转换:

将16位pcm转换为8位

按位优化是不必要的,但我当然不会对它们说不.

Pau*_*l R 8

对于较大的值,这将失败,因为您需要除以256而不是127.此外,偏移量需要为128,而不是127.

for (int i = 0; i < numSamples; i++) { 
    SInt8 tempSigned8Bit = signed16BitBuffer[i] / 256;
    unsigned8BitBuffer[i] = tempSigned8Bit + 128;
}
Run Code Online (Sandbox Code Playgroud)

+/-满量程和零的转换如下所示:

Signed    Divide    Add
16 bit    by 256    128
sample

 32767 ->  127 ->   255    ; Full scale +
     0 ->    0 ->   128    ; 0
-32768 -> -128 ->     0    ; Full scale -
Run Code Online (Sandbox Code Playgroud)