我试图将浮点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发布于 2014-08-18 09:23:30
噪音是预期的结果。8位信号的最大信噪比为48dB。在减少位数时,通常的做法是应用抖动,以消除一些更令人反感的伪像。抖动将量化误差随时间扩展为宽带噪声。
http://en.wikipedia.org/wiki/Dither
发布于 2014-08-18 03:51:36
正如Oli所说,如果您的目标是将每个样本的信息负载从32位降低到8位,则噪声是交易的一部分,因为您故意丢弃每个样本的信息。但是,如果这不是您的意图,并且您希望将您的32位浮点PCM向下转换为8位,以便保留每个样本的完整信息负载,您可以选择将每个32位浮点输出为四个独立的8位字节,而不是上述算法中的一个。这不会引入任何噪音,因为您将保持完整的信息负载。如果这是您的意图,请让我们知道,我们/我可以建议一个替代算法,该算法基本上是一系列带有掩码的位移位。
https://stackoverflow.com/questions/25352195
复制相似问题