python librosa.core.stft()和matlab频谱图(x)的输出之间的差异

时间:2019-04-02 12:16:16

标签: python matlab

我正在将python代码转换为MATLAB。 python代码使用以下命令:

stft_ch = librosa.core.stft(audio_input[:, ch_cnt], n_fft=self._nfft, hop_length=self._hop_len,win_length=self._win_len, window='hann')

audio_input.shape=(2880000,4)self._nfft=2048self._hop_len=960self._win_len=1920所在的位置。转换为MATLAB时,我使用了:

stft_ch = spectrogram(audio_input(:, ch_cnt), hann(win_len), win_len-hop_len, nfft);

我在其中验证了size(audio_input)=2880000,4win_len=1920win_len-hop_len=960nfft=2048的位置。

我得到一个size(stft_ch)=1025,2999的输出,其中python显示stft_ch.shape=(1025, 3001)的2999大小的MATLAB输出清晰可见,并壮大了documentation,其中k =⌊(Nx – noverlap)/ (length(window)– noverlap)⌋如果窗口是矢量。

但是,我在python documentation中找不到t的范围的设置。

为什么尺寸之间有区别?我的转换好吗?

1 个答案:

答案 0 :(得分:4)

很长一段时间之后,赏金未得到满足,我自己找到了答案。

MATLAB函数spectrogram()输出一个时间向量,该向量对应于每个窗口的中间,而省略了最后一个窗口。例如,一个10个样本长度的信号具有3个样本窗口和1个样本重叠,将导致以下4个窗口:

1:33:55:77:9,其中m:n代表一个窗口,其中包含从mn的样本包括第n个示例。

因此,窗口的中心为: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:33:55:77:99:11,其中m:n代表一个窗口,其中包含来自m的样本到第n个样本,到第n个。

因此,窗口的开头应为: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中。

这是我能找到的最好的解释。 任何其他解释都将作为答复。