将32位浮点PCM转换为无符号8位后的噪声

时间:2014-08-17 18:16:12

标签: audio pcm noise

我正在尝试将浮动PCM音频流转换为8位并获得可接受的结果,但它会产生一些噪音。是应该发生还是我的功能还不够?转换为带符号的16位变得更好。是否可以获得没有噪声的8位流?

def float32_to_unsigned8(pcm_data_f32):
    pcm_u8 = b''
    for c in chunks(pcm_data_f32, 4):
        f32 = struct.unpack('f', c)[0]
        u8 = int(f32 * 127 + 128)
        if u8 > 255:
            u8 = 255
        if u8 < 0:
            u8 = 0
        pcm_u8 += struct.pack('B', u8)
    return pcm_u8

2 个答案:

答案 0 :(得分:2)

噪音是预期的结果。 8位信号的最大信噪比为48dB。当减少位数时,通常的做法是应用抖动以消除一些更令人讨厌的伪像。抖动会随着时间的推移将量化误差扩散为宽带噪声。

http://en.wikipedia.org/wiki/Dither

答案 1 :(得分:1)

正如Oli所说,如果您的目标是将每个样本的信息负载从32位降低到8位,那么噪声就是讨价还价的一部分,因为您故意丢弃每个样本的信息。但是,如果这不是您的意图,并且您希望将32位浮点PCM转换为8位,其中您保留每个样本的完整信息负载,则可以将每个32位浮点数输出为四个单独的8位字节,而不是一个在你的上述算法中。这不会引入任何噪音,因为您将保持完整的信息负载。如果这是你的意图,请告诉我们,我们/我可以建议一种替代算法,它基本上是一系列带掩码的位移。