Отслеживание шага 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
![введите описание изображения здесь]()