Отслеживание шага Librosa - STFT

Я использую этот алгоритм для определения высоты тона этот аудиофайл. Как вы можете услышать, это записка E2, играемая на гитаре с небольшим шумом в фоновом режиме.

Я сгенерировал эту спектрограмму с помощью STFT: spectrogram

И я использую алгоритм, связанный выше:

y, sr = librosa.load(filename, sr=40000)
pitches, magnitudes = librosa.core.piptrack(y=y, sr=sr, fmin=75, fmax=1600)

np.set_printoptions(threshold=np.nan)
print pitches[np.nonzero(pitches)]

В результате я получаю практически все возможные частоты между моими fmin и fmax. Что мне нужно сделать с выходом метода piptrack для обнаружения основной частоты временного интервала?

UPDATE

Я все еще не уверен, что представляют собой эти 2D-массивы. Скажем, я хочу узнать, насколько сильным является 82 Гц в кадре 5. Я мог бы сделать это, используя функцию STFT, которая просто возвращает 2D-матрицу (которая использовалась для построения спектрограммы).

Однако piptrack делает что-то дополнительное, что может быть полезно, и я действительно не понимаю, что. pitches[f, t] contains instantaneous frequency at bin f, time t. Означает ли это, что, если я хочу найти максимальную частоту во временном интервале t, я должен:

  • Перейдите в массив magnitudes[][t], найдите бит с максимальным величина.
  • Назначьте bin переменной f.
  • Найдите pitches[b][t], чтобы найти частоту, которая принадлежит этому бину?

Ответ 1

Выбирает способ выбора высоты тона в определенном кадре t:

def detect_pitch(y, sr, t):
  index = magnitudes[:, t].argmax()
  pitch = pitches[index, t]

  return pitch

Сначала вы получите бит наиболее сильной частоты, посмотрев массив magnitudes, а затем найдя шаг в pitches[index, t].

Ответ 2

Обнаружение движения является сложной темой и часто противоречит интуиции. Я не одинок по поводу того, как исходный код документирован для этой конкретной функции - похоже, что разработчик вводит в заблуждение "гармонику" с "шагом".

Когда на гитаре или фортепиано делается одна нота ( "шаг" ), мы слышим не только одну частоту звуковой вибрации, но и композицию из нескольких звуковых колебаний, происходящих на разных математически связанных частотах, называемых гармониками. Типичные методы отслеживания основного тона включают в себя поиск результатов БПФ для величин в определенных ячейках, которые соответствуют ожидаемым частотам гармоник. Например, если мы нажимаем клавишу среднего С на фортепиано, отдельные частоты составных гармоник будут начинаться с 261,6 Гц, так как основная частота, 523 Гц будет второй гармоникой, 785 Гц будет третьей гармоникой, 1046 Гц - 4-я гармоника и т.д. Более поздние гармоники являются целыми кратными основной частоте, 261,6 Гц (например: 2 х 261,6 = 523, 3 х 261,6 = 785, 4 х 261,6 = 1046). Однако частоты, на которых расположены гармоники, логарифмически разнесены, но FFT использует линейный интервал. Часто вертикальные интервалы для БПФ недостаточно разрешены на более низких частотах.

По этой причине, когда я написал приложение для определения высоты тона (PitchScope Player), я решил создать логарифмически разнесенный DFT, а не БПФ, поэтому я мог бы сосредоточиться на точных частотах, представляющих интерес для музыки (см. прилагаемую диаграмму мой пользовательский DFT с 3 секунд гитарного соло). Если вы серьезно относитесь к преследованию высоты тона, вам следует подумать о том, чтобы больше читать в эту тему, глядя на другой пример кода (моя связана ниже) и рассмотрите возможность написания собственных функций для измерения частоты.

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

https://github.com/CreativeDetectors/PitchScope_Player

введите описание изображения здесь