Я конвертирую код 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.
Я получаю вывод из MATLAB с size(stft_ch)=1025, 2999, где Python показывает stft_ch.shape=(1025, 3001). Размер 2999 в выводе MATLAB ясен и соответствует документация, где k = ⌊(Nx – noverlap)/(length(window) – noverlap)⌋, если окно является вектором.
Однако я не смог найти в Документация по Python, как задается длина t.
Почему существует разница в размерах? Моя конверсия хороша?
Есть ли функция Python, которая производит вывод, более похожий на MATLAB spectrogram(), чтобы я мог получить сложный вывод того же размера?






После долгого времени и неудовлетворенной щедрости я сам нашел ответ.
Функция 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-й несуществующий образец.
Кажется, что либероза требует минимального 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.
Это лучшее объяснение, которое я смог найти. Любое другое объяснение будет приветствоваться в качестве ответа.