Разница между выходными данными python librosa.core.stft () и спектрограммой matlab (x) - PullRequest
2 голосов
/ 02 апреля 2019

Я конвертирую код 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(), так что я могу получить комплексный вывод с тем же размером?

1 Ответ

4 голосов
/ 18 июня 2019

После долгого времени и неудовлетворенной щедрости я нашел ответ сам.

Функция 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.

Это лучшее объяснение, которое я мог найти. Любое другое объяснение будет приветствоваться в качестве ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...