将WAV格式从32位浮点转换为16位PCM

3
我试图将我的32位浮点采样WAVE文件转换为16位整数WAVE文件。
我想从范围为-1.414到1.414的超声正弦波生成16位整数WAV文件。在SciPy.io.wavfile中,输出格式根据我生成的类型数组固定。但是,我通过将“32767”与转换乘法相结合,将我的32位浮点格式数组更改为16位,以获得整数格式值,但结果频率完全不相似。
是否有任何方法可以使用SciPy库将我的32位浮点转换为16位PCM?

你是否必须将 wav 转换为 16 位,或者 32 位就可以了?将 float32 转换为 int32 对我来说似乎保持了相同的音频。虽然我测试了可听频率。如果您可以发布您的 wav 文件的一部分,那将有助于测试。 - Anil_M
1
如果输入的范围在-1.414到1.414之间,则应将数据乘以32767/1.414以将其缩放到16位范围。 然后将数组转换为np.int16 - Warren Weckesser
我使用原始的32位浮点样本进行测试,将其转换为16位PCM样本,并通过将其乘以32767并转换为整数来实现。但是我的原始wav文件无法听到声音,而我的转换后的文件有噪音而不是信号。 - JayHeo
哦,谢谢@WarrenWeckesser,你的建议很有用!感谢您回答我的简单问题。谢谢大家! - JayHeo
或者,您可以使用soundfile模块,它可以为您完成大部分转换工作。在将其保存到16位文件之前,您只需要将范围从+-1.414缩小到+-1.0即可。 - Matthias
1个回答

7

对于这个问题,我不确定是否可以使用SciPy,但您可以轻松地将数据转换为16位整数,然后使用任何音频包将其写入wav文件。

将您的数据除以1.414,使其在范围[-1,1]内,然后将其乘以32767,使其在int16变量的范围内。然后使用numpy.astype()进行强制类型转换。解决方案应该如下所示:

import numpy as np

float32_data /=1.414
float32_data *= 32767
int16_data = float32_data.astype(np.int16)

1
那不应该是:int16_data = float32_data.astype(np.int16) 吗? - silicontrip
是的,应该是这样的!谢谢。 - michael_question_answerer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接