python librosa.core.stft() 和 matlab spectrogram(x)

我正在将 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=2048,self._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

我从 MATLAB 得到一个输出,size(stft_ch)=1025, 2999其中 Python 显示stft_ch.shape=(1025, 3001)2999MATLAB 输出中的大小很清楚,并且在if window 是向量的文档中表现出色k = ⌊(Nx – noverlap)/(length(window) – noverlap)⌋

但是,我在Python 文档中找不到tset的长度。

为什么尺寸之间存在差异?我的转换好吗?

是否有一个 Python 函数可以产生更类似于 MATLAB 的spectrogram()输出,以便我可以获得相同大小的复数输出?


江户川乱折腾
浏览 320回答 1
1回答

万千封印

很长一段时间后,并没有得到满意的赏金,我自己找到了答案。MATLAB 函数spectrogram()输出一个时间向量,该向量对应于每个窗口的中间,同时省略最后一个窗口。例如,具有 3 个样本窗口和 1 个样本重叠的 10 个样本长度的信号将产生以下 4 个窗口:1:3,&nbsp;3:5,&nbsp;5:7,&nbsp;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, ,&nbsp;3:5,&nbsp;5:7,&nbsp;7:9,&nbsp;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 为中心。这是我能找到的最好的解释。欢迎任何其他解释作为答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python