Ich möchte den Offset zwischen zwei Arrays von Zeitstempeln finden. Sie könnten beispielsweise den Beginn von Signaltönen in zwei Audiospuren darstellen.Macht es Sinn Kreuzkorrelation auf Arrays von Zeitstempeln zu verwenden?
Hinweis: In beiden Spuren können zusätzliche oder fehlende Onsets vorhanden sein.
Ich fand einige Informationen über Kreuzkorrelation (z.B. https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar), die vielversprechend aussahen.
nahm ich, dass jede Audiospur 10 Sekunden Dauer ist, und repräsentiert den Piepton Onsets wie die Spitzen einer „Rechteckwelle“ mit einer Abtastrate von 44,1 kHz:
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()
Dieser Ansatz ist nicht besonders schnell, aber ich konnte ziemlich konsistente Ergebnisse erzielen, selbst bei ziemlich niedrigen Frequenzen. Allerdings ... ich habe keine Ahnung, ob das eine gute Idee ist! Gibt es einen besseren Weg, diesen Offset als die Kreuzkorrelation zu finden?
Bearbeiten: Notiz über fehlende und zusätzliche Onsets hinzugefügt.
Sie zeigen 'track_1' und' track_2' als unregelmäßige Abstände, dann multiplizieren Sie sie mit 'frequency', wenn Sie' wave_1' und 'wave_2' aufbauen. Sind "track_1" und "track_2" die Zeitstempeln, die Sie korrelieren möchten, oder sollen es die Audio-Wellenformen sein, ohne dass die Signaltöne hinzugefügt wurden? Oder sind sie die Anfangszeiten des "Piep"? – Brian
'track_1' und' track_2' sind die Anfangszeiten jedes Pieptons. "wave_1" und "wave_2" sind jeweils eine Summe von Dirac-Delta-Funktionen, um die Kreuzkorrelation zu finden. – user1475412