我已将已签名的单声道16位PCM音频样本存储在SInt16缓冲区中,并试图将它们转换为存储在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位
比特优化是不必要的,但我当然不会拒绝它们。
对于较大的值,这将失败,因为您需要除以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 -