在Matlab中:

[s, fs] = wavread(file);

由于s中每个元素的值在-1和1之间,因此我们使用其wavread函数导入scikits.audiolab。
from scikits.audiolab import wavread
s, fs, enc = wavread(filename)

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

ps。 wav文件是简单的16位单声道通道文件,采样率为44100Hz。

最佳答案

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

10-04 12:25