如何在Python中实现MATLAB的wavread()函数?
在Matlab中:
[s, fs] = wavread(file);
因为s中每个元素的值都在-1到1之间,所以我们使用scikits.audiolab的wavread函数来导入数据。
from scikits.audiolab import wavread
s, fs, enc = wavread(filename)
但是当我在Python中读取同一个输入的wav文件时,s的值和在Matlab中完全不一样。我该怎么做才能让Python中的s和Matlab中的输出一致呢?
附注:这个wav文件是简单的16位单声道文件,采样率为44100Hz。
1 个回答
4
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
另外,你也可以使用Matlab函数中的'native'
选项来返回未归一化的数据值,正如horchler在他的评论中提到的。
[s, fs] = wavread(file, 'native');