我正在将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=960
和self._win_len=1920
所在的位置。转换为MATLAB时,我使用了:
stft_ch = spectrogram(audio_input(:, ch_cnt), hann(win_len), win_len-hop_len, nfft);
我在其中验证了size(audio_input)=2880000,4
,win_len=1920
,win_len-hop_len=960
和nfft=2048
的位置。
我得到一个size(stft_ch)=1025,2999
的输出,其中python显示stft_ch.shape=(1025, 3001)
的2999大小的MATLAB输出清晰可见,并壮大了documentation,其中k =⌊(Nx – noverlap)/ (length(window)– noverlap)⌋如果窗口是矢量。
但是,我在python documentation中找不到t
的范围的设置。
为什么尺寸之间有区别?我的转换好吗?
答案 0 :(得分:4)
很长一段时间之后,赏金未得到满足,我自己找到了答案。
MATLAB函数spectrogram()
输出一个时间向量,该向量对应于每个窗口的中间,而省略了最后一个窗口。例如,一个10个样本长度的信号具有3个样本窗口和1个样本重叠,将导致以下4个窗口:
1:3
,3:5
,5:7
,7:9
,其中m:n
代表一个窗口,其中包含从m
到n
的样本包括第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:3
,3:5
,5:7
,7:9
,9: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中。
这是我能找到的最好的解释。 任何其他解释都将作为答复。