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
相关产品推荐
相关产品推荐

