Разница между выводом python librosa.core.stft() и спектрограммой Matlab (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=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(), чтобы я мог получить сложный вывод того же размера?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 044
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме

Похожие вопросы

Как работает карта процессов/потоков Python в Windows? Почему поток работает быстрее, чем процесс?
Извлечение функций с использованием двух значений столбца в фрейме данных из другого кадра данных в python
Минималистическое приложение получает сообщение «OSError: [Errno 12] Невозможно выделить память» при развертывании — почему?
Как передать имя пользователя текущего вошедшего в систему пользователя по URL-адресу? питон джанго
Как я могу создать столбец фрейма данных pandas для каждого тега части речи?
Ошибка перекрестной проверки Grid Search при попытке подобрать X, y с помощью GridSearchCV sklearn
Как сделать вложенную структуру from_tensor_slice для передачи двух аргументов в Dataset.map с помощью оболочки tf.py_func
Как установить значение из столбца в другое на основе условия
Синтаксис Python для инструкции «если»
Найдите оптимальное значение аргумента для заданного значения функции