Выходные длины Scipy.signal.spectrogram

Я пытаюсь проанализировать частоты песни в определенные моменты времени, хранящиеся внутри массива.

Я использую функцию scipy.signal.spectrogram для генерации этих частот. продолжительность песни составляет 2:44, или 164 секунды, а частота дискретизации чтения файла scipy.wav составляет 44 100.

Когда я использую спектрограмму:

f, t, Sxx= signal.spectrogram(data[:, 1], sr)

Длина f действительно мала, 129 элементов. t длиннее, 32322, но все еще далеко от 7240320 окон выборки в исходном файле wavfile.read.

(data[:, 1] — правый канал аудиоданных)


person Blahmastah    schedule 07.04.2018    source источник


Ответы (2)


Длина f по умолчанию nperseg из stft 256 делится на 2 (только положительная сторона шкалы частот) + 1 (частота 0). Количество выборок во времени достигается за счет

t.size = len(data[:, 1]) / nperseg * (1 + noverlap) 

где noverlap равно 256/8=32.

person Gideon Kogan    schedule 10.05.2018
comment
Я понял это как 3 недели назад, но спасибо за ответ! - person Blahmastah; 10.05.2018

Массив частот f ограничен половиной частоты дискретизации плюс нулевая частота, поэтому

f.size = int(1 + sampling_frequency / 2)

в то время как массив времени ограничен количеством сегментов, которые вы можете извлечь из массива данных на основе nperseg и noverlap, например

t.size = int(len(data[:, 1]) - noverlap) / (nperseg - noverlap))

Это легче понять, если представить, что для двух сегментов с nperseg=8 и noverlap=1 нужен сигнал как минимум с 15 отсчетами.

person Bruno    schedule 08.09.2019
comment
Это с учетом return_onesided=True, которое используется по умолчанию. - person Bruno; 08.09.2019