如何在Python中实现MATLAB的wavread()函数?

2 投票
1 回答
3202 浏览
提问于 2025-04-18 05:21

在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');

撰写回答