После долгого времени и неудовлетворенной щедрости я нашел ответ сам.
Функция 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 - это время первой выборки для каждого кадра, и кадры покрывают больше, чем входной сигнал. например, сигнал длиной 10 отсчетов с окном из 3 отсчетов и 2 скачками отсчетов (прыжки и не перекрываются) приведет к следующим 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.
Обратите внимание, что время может быть центрировано в python, установив флаг center=True
.
Это лучшее объяснение, которое я мог найти.
Любое другое объяснение будет приветствоваться в качестве ответа.