【问题标题】:Noise after converting 32-bit float PCM to unsigned 8-bit将 32 位浮点 PCM 转换为无符号 8 位后的噪声
【发布时间】:2014-10-10 17:03:22
【问题描述】:

我正在尝试将浮动 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

【问题讨论】:

  • 8 位音频本身比 32 位音频具有更多的量化噪声。

标签: audio pcm noise


【解决方案1】:

噪音是预期的结果。 8 位信号的最大信噪比为 48dB。在减少比特数时,通常的做法是应用抖动以消除一些更令人反感的伪影。抖动会随着时间的推移将量化误差作为宽带噪声传播出去。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,斯科特!我想减小流的大小,最终以 16 位结束,因为 8 位噪声影响了语音识别。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多