Я хочу найти смещение между двумя массивами временных меток. Они могли бы представлять, скажем, начало звуковых сигналов на двух звуковых дорожках.Имеет ли смысл использовать кросс-корреляцию на массивах временных меток?
Примечание: На любом треке могут быть дополнительные или отсутствующие наборы.
Я нашел некоторую информацию о взаимной корреляции (например, https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar), которая выглядела многообещающей.
Я предположил, что каждый звуковой дорожки составляет 10 секунд в продолжительности, и представлял звуковые натисков как пики с «квадратной волны» с частотой дискретизации 44,1 кГц:
import numpy as np
rfft = np.fft.rfft
irfft = np.fft.irfft
track_1 = np.array([..., 5.2, 5.5, 7.0, ...])
# The onset in track_2 at 8.0 is "extra," it has no
# corresponding onset in track_1
track_2 = np.array([..., 7.2, 7.45, 8.0, 9.0, ...])
frequency = 44100
num_samples = 10 * frequency
wave_1 = np.zeros(num_samples)
wave_1[(track_1 * frequency).astype(int)] = 1
wave_2 = np.zeros(num_samples)
wave_2[(track_2 * frequency).astype(int)] = 1
xcor = irfft(rfft(wave_1) * np.conj(rfft(wave_2)))
offset = xcor.argmax()
Этот подход не является особенно быстро, но я смог получить довольно последовательные результаты даже при довольно низких частотах. Однако ... я понятия не имею, если это хорошая идея! Есть ли лучший способ найти это смещение, чем кросс-корреляция?
Редактировать: добавлено примечание о недостающих и дополнительных onsets.
Вы показываете 'track_1' и' track_2' как нерегулярно разнесенные, тогда вы умножаете их на 'frequency' при построении' wave_1' и 'wave_2'. Предполагается ли, что «track_1» и «track_2» являются отметками времени, которые вы пытаетесь сопоставить, или они должны быть звуковыми формами без добавления звуковых сигналов? Или это время начала «звукового сигнала»? – Brian
'track_1' и' track_2' - это время начала каждого звукового сигнала. 'wave_1' и' wave_2' являются, если хотите, суммированием дельта-функций Дирака для поиска взаимной корреляции. – user1475412