【问题标题】:How can MATLAB function wavread() be implemented in Python?MATLAB 函数 wavread() 如何在 Python 中实现?
【发布时间】:2014-06-21 02:02:10
【问题描述】:

在 Matlab 中:

[s, fs] = wavread(file);  

由于 s 中每个元素的值都在 -1 和 1 之间,所以我们使用其 wavread 函数导入 scikits.audiolab。

from scikits.audiolab import wavread
s, fs, enc = wavread(filename)

但是当我对同一个输入wav文件进行reduce时,Matlab和Python中s的值是完全不同的。如何获得与 MATLAB 中相同的 s 输出?

附言wav 文件是简单的 16 位单声道文件,以 44100Hz 采样。

【问题讨论】:

  • 那么,s 的数据类型是什么,即type(s)?如果您使用 Matlab 的wavread 中的'native' 选项进行比较,怎么样?

标签: python matlab audio


【解决方案1】:

Matlab wavread() 函数默认返回标准化数据,即将所有数据缩放到 -1 到 +1 的范围内。如果您的音频文件是 16 位格式,那么原始数据值将在 -32768 到 +32767 的范围内,这应该与 scikits.audiolab.wavread() 返回的范围相匹配。

要将这些数据标准化到 -1 到 +1 的范围内,您只需将数据数组除以具有最大幅度的值(在这种情况下使用 numpy 模块):

from scikits.audiolab import wavread
import numpy

s, fs, enc = wavread(filename)  # s in range -32768 to +32767
s = numpy.array(s)
s = s / max(abs(s))             # s in range -1 to +1

请注意,您还可以将 'native' 选项与 Matlab 函数一起使用以返回未标准化的数据值,正如 horchler 在他的评论中所建议的那样。

[s, fs] = wavread(file, 'native');

【讨论】:

  • 我不能再在 MATLAB 中测试东西,但我认为它并没有像你说的那样缩放值。我认为它将最大和最小整数值(而不是最大和最小采样值)分别缩放到 -1 和 +1。因此,对于 16 位样本,您可以改为除以 (2**15 - 1),而不是除以 max(abs(s))。我还不确定如何在遇到其他位深度的情况下动态查找最大归一化值。如果您正在加载不同的文件并且需要级别具有可比性,这一点尤其重要。
  • 可以通过numpy.iinfo(s).max获取某个数据类型的最大值。
  • 注意:对于某些应用程序,除以 2^(n_bits - 1) 而不是最大值似乎更常见。见stackoverflow.com/questions/2060628/reading-wav-files-in-python
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2014-03-30
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多