2

我已经签署了存储在 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
}

但是,我可以在生成的音频中听到最大幅度的削波,或者至少这是我对失真发生位置的印象。这是重新量化的产物,还是我需要包含某种钳位,如本问题中所述,关于类似转换但没有任何符号转换:

将 16 位 pcm 转换为 8 位

不需要按位优化,但我当然不会拒绝它们。

4

1 回答 1

8

对于较大的值,这将失败,因为您需要除以 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 -
于 2012-07-23T17:56:26.667 回答