【问题标题】:Clipping when converting signed 16-bit PCM samples to unsigned 8-bit PCM samples将有符号 16 位 PCM 样本转换为无符号 8 位 PCM 样本时出现削波
【发布时间】:2012-07-23 17:52:36
【问题描述】:

我已将签名的单声道 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
}

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

Convert 16 bit pcm to 8 bit

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

【问题讨论】:

    标签: ios c audio signal-processing pcm


    【解决方案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 -
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2015-04-22
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多