python librosa.core.stft()和matlab spectrogram(x)的输出有什么区别?

3

我正在将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);

在验证过程中,我发现音频输入的大小为2880000, 4win_len=1920win_len-hop_len=960,以及nfft=2048

从MATLAB中获得的输出结果是size(stft_ch)=1025, 2999,而Python中则显示stft_ch.shape=(1025, 3001)。其中MATLAB输出结果中的2999符合文档说明,因为当window是一个向量时,k = ⌊(Nx – noverlap)/(length(window) – noverlap)⌋

然而,我并没有在Python文档中找到如何设置t长度的方法。

为什么会出现大小不同的差异?我的转换是否正确?

是否有一种Python函数可以产生类似于MATLAB的spectrogram()的输出结果,从而使我能够获得相同大小的复杂输出结果?

1个回答

5
我已经找到了答案。
MATLAB函数输出一系列对应于每个窗口中间的时间向量,但会省略最后一个窗口。例如,长度为10个样本、3个样本宽和1个样本重叠的信号将产生以下4个窗口:1:3,3:5,5:7,7: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版本的librosa.core.stft()则是相反的情况,对于每个帧,t是第一个样本的时间,并且框架涵盖超过输入信号。例如,长度为10个样本、3个样本宽和2个样本跃进(不是重叠)的信号将产生以下4个窗口:1:3,3:5,5:7,7:9,9:11,其中m:n表示包含从mn的样本的窗口,包括第n个样本。
因此,窗口的开始是:1,3,5,7,9。请注意,第11个不存在的样本被包括在内。
看起来librosa最少需要number_of_windows受制于number_of_windows*hop_length>number_of_samples
在我的情况下:
对于MATLAB:(2999-1)*960+1920=2880000<=2880000。 对于Python:3001*960=2880960>2880000,而30000*960=2880000!> 2880000。
请注意,可以通过设置center=True标志来使Python中的时间居中。
这是我能找到的最好的解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接