1 回答
TA贡献1891条经验 获得超3个赞
很长一段时间后,并没有得到满意的赏金,我自己找到了答案。
MATLAB 函数spectrogram()输出一个时间向量,该向量对应于每个窗口的中间,同时省略最后一个窗口。例如,具有 3 个样本窗口和 1 个样本重叠的 10 个样本长度的信号将产生以下 4 个窗口:
1:3, 3:5, 5:7, 7:9, 其中m:n表示一个窗口,包括从m到n包括第nth 个样本的样本。
因此,窗户的中心将是:2,4,6,8。请注意,不包括第 10 个样本。
似乎 MATLAB 需要number_of_windows对(number_of_windows-1)*hop_length+window_size<=number_of_samples.
另一方面,在 python 版本liberosa.core.stft()上,t 是每个帧的第一个样本的时间,帧覆盖的比输入信号多。例如,具有 3 个样本窗口和 2 个样本跳(跳和不重叠)的 10 个样本长度的信号将产生以下 4 个窗口:
1:3, , 3:5, 5:7, 7:9, 9:11, 其中m:n表示一个窗口,包括从m到n包括第nth 个样本的样本。
因此,窗口的开头将是:1,3,5,7,9。请注意,包括第 11 个不存在的样本。
似乎 liberosa 需要最小number_of_windows化到number_of_windows*hop_length>number_of_samples.
就我而言:
(2999-1)*960+1920=2880000<=2880000 对于 MATLAB。3001*960=2880960>2880000 而 30000*960=2880000 !> 2880000 在 python 中。
请注意,时间可以通过设置center=True标志以 python 为中心。
这是我能找到的最好的解释。欢迎任何其他解释作为答案。
添加回答
举报
