14 Stimmen

Schätzung der Zeitverzögerung zwischen zwei Audiosignalen

Ich habe zwei Audioaufnahmen desselben Signals von zwei verschiedenen Mikrofonen (z. B. im WAV-Format), aber eine davon ist mit einer Verzögerung von z. B. mehreren Sekunden aufgenommen.

Es ist einfach, eine solche Verzögerung visuell zu erkennen, wenn man diese Signale in einer Art Wellenformbetrachter anschaut - d. h. einfach die erste sichtbare Spitze in jedem Signal ausfindig machen und sicherstellen, dass sie dieselbe Form haben:


(Quelle: <a href="http://www.greycat.ru/temp/time-delay-peaks.png" rel="nofollow noreferrer">grauekatze.ru </a>)

Aber wie kann ich das programmatisch machen - herausfinden, was diese Verzögerung (t) ist? Zwei digitalisierte Signale unterscheiden sich geringfügig (weil die Mikrofone unterschiedlich sind, sich an unterschiedlichen Positionen befinden, aufgrund von ADC-Einstellungen usw.).

Ich habe ein wenig recherchiert und herausgefunden, dass dieses Problem in der Regel "Zeitverzögerungsschätzung" genannt wird und es unzählige Ansätze dafür gibt - zum Beispiel, einer von ihnen .

Aber gibt es einfache und fertige Lösungen, wie z.B. ein Kommandozeilenprogramm, eine Bibliothek oder einen einfachen Algorithmus?

Schlussfolgerung : Ich habe keine einfache Implementierung gefunden und selbst ein einfaches Kommandozeilenprogramm erstellt - verfügbar unter https://bitbucket.org/GreyCat/calc-sound-delay (GPLv3-lizenziert). Es implementiert einen sehr einfachen Suche-nach-Maximum-Algorithmus, der unter Wikipedia .

14voto

Paul R Punkte 201623

Die Technik, nach der Sie suchen, heißt Kreuzkorrelation . Es ist eine sehr einfache, wenn auch etwas rechenintensive Technik, die zur Lösung verschiedener Probleme verwendet werden kann, einschließlich der Messung der Zeitdifferenz (auch bekannt als lag ) zwischen zwei ähnlichen Signalen (die Signale müssen nicht identisch sein).

Wenn Sie eine vernünftige Vorstellung von Ihrem Verzögerungswert haben (oder zumindest von dem Bereich der zu erwartenden Verzögerungswerte), können Sie den Gesamtumfang der Berechnungen erheblich reduzieren. Das Gleiche gilt, wenn Sie die benötigte Genauigkeit genau eingrenzen können.

2voto

Roland Puntaier Punkte 2889

Ich hatte das gleiche Problem und habe erfolglos nach einem Tool gesucht, das den Start von Video-/Audioaufnahmen automatisch synchronisiert, beschloss ich, ein syncstart ( github ).

Es handelt sich um ein Kommandozeilenwerkzeug. Der grundlegende Code dahinter ist dieser:

import numpy as np
from scipy import fft
from scipy.io import wavfile
r1,s1 = wavfile.read(in1)
r2,s2 = wavfile.read(in2)
assert r1==r2, "syncstart normalizes using ffmpeg"
fs = r1
ls1 = len(s1)
ls2 = len(s2)
padsize = ls1+ls2+1
padsize = 2**(int(np.log(padsize)/np.log(2))+1)
s1pad = np.zeros(padsize)
s1pad[:ls1] = s1
s2pad = np.zeros(padsize)
s2pad[:ls2] = s2
corr = fft.ifft(fft.fft(s1pad)*np.conj(fft.fft(s2pad)))
ca = np.absolute(corr)
xmax = np.argmax(ca)
if xmax > padsize // 2:
    file,offset = in2,(padsize-xmax)/fs
else:
    file,offset = in1,xmax/fs

1voto

Roy T. Punkte 9220

Am einfachsten ist es zu prüfen, ob die Spitzenwerte einen bestimmten Schwellenwert überschreiten. Die Zeit zwischen dem höchsten Spitzenwert auf Leitung A und dem höchsten Spitzenwert auf Leitung B ist wahrscheinlich die Verzögerung. Versuchen Sie einfach, ein wenig mit den Schwellenwerten zu spielen, und wenn die Diagramme normalerweise so klar sind wie das von Ihnen gepostete Bild, dann sollte alles in Ordnung sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X