You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中soundfile与scipy.io.wavfile读取wav文件的幅值响应差异问题

问题原因

两个库对整数编码WAV文件的默认输出格式不同:

  • scipy.io.wavfile.read 默认输出和文件位深对应的整数数组,比如16位WAV会输出int16类型的数组,取值范围为[-32768, 32767]
  • soundfile.read 默认会将整数编码的音频自动归一化到[-1.0, 1.0]的浮点数范围
    这就是二者幅值、PSD计算结果存在明显差异的核心原因。

解决方法

只需对wavfile.read输出的整数信号做对应位深的归一化处理即可,修改你的代码中wavfile.read相关片段如下:

plt.subplot(212)
sample_rate, signal1 = wavfile.read(input_file1)
# 新增归一化逻辑,适配不同位深的整数WAV
if np.issubdtype(signal1.dtype, np.integer):
    # 获取当前整型的最大取值范围,做浮点归一化
    norm_factor = np.iinfo(signal1.dtype).max + 1
    signal1 = signal1.astype(np.float64) / norm_factor
Pxx, freq = plt.psd(signal1, 512, sample_rate)
# 后续代码保持不变

上述代码会自动适配16位、24位、32位等不同整数位深的WAV文件,处理后的信号幅值范围和soundfile.read的输出完全一致,最终得到的PSD谱图也会相同。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:12:01