Я использую этот алгоритм для определения высоты тона этот аудиофайл. Как вы можете услышать, это записка E2, играемая на гитаре с небольшим шумом в фоновом режиме.
Я сгенерировал эту спектрограмму с помощью STFT:
И я использую алгоритм, связанный выше:
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]
, чтобы найти частоту, которая принадлежит этому бину?