Zeitverzögerung von Audiosignalen messen


9

Bevor mich jemand anschreit, wird mir klar, dass diese Frage schon oft gestellt wurde. Ich versichere Ihnen, dass ich die vorhandenen Fragen und Antworten durchgelesen habe, aber ich bin immer noch verwirrt über einen Teil des Problems.

Ich habe eine Tonquelle, die Musik (A) in einer geschlossenen Umgebung abspielt. Ich habe ein Mikrofon, mit dem ich A aufnehme. Ich habe zwei WAV-Dateien mit denselben Eigenschaften und derselben Länge (Anzahl der Samples).

Mein Ziel ist es, die Zeit zu berechnen, die A benötigt hat, um das Mikrofon zu erreichen.

Ich versuche, die Berechnung mit Kreuzkorrelation (numpy) durchzuführen:

# Delay estimation
corr = numpy.convolve(original_audio, recorded_audio, 'full')
delay = int(len(corr)/2) - numpy.argmax(corr)
distance = delay / sample_rate * 343 # sample_rate == 22050, m/s = speed of sound
print("Distance full: %.2f cm" % (distance * 100))

Ich erhalte konstant Werte im Bereich von 300.000 cm. Der Abstand zwischen Lautsprecher und Mikrofon beträgt ungefähr 2 Fuß.

Das ist alles ziemlich neu für mich, also bin ich mir sicher, dass mir etwas Offensichtliches fehlt.

Danke im Voraus.


3
Sind Sie sicher, dass Sie nicht numpy.correlateanstelle von verwenden sollten numpy.convolve? Um die Verzögerung abzuschätzen, möchten Sie Ihre Signale kreuzkorrelieren und nicht falten. Sie werden möglicherweise eine viel größere Verzögerung haben, wenn Sie sich falten.
Peter K.

PeterK ist wahrscheinlich richtig. Beachten Sie, dass Sie die Korrelation über die Faltung implementieren können, indem Sie zuerst eine der Eingaben zeitumkehren und konjugieren. Auf diese Weise können Sie schnelle Faltungsalgorithmen (wie das Speichern von Überlappungen) für die Korrelation verwenden.
Jason R

Antworten:


8

Sind Sie sicher, dass Sie nicht numpy.correlateanstelle von verwenden sollten numpy.convolve? Um die Verzögerung abzuschätzen, möchten Sie Ihre Signale kreuzkorrelieren und nicht falten. Sie werden möglicherweise eine viel größere Verzögerung haben, wenn Sie sich falten.

Etwas Einfaches versuchen:

x = [1, 0, 0, 0, 0 ];
y = [0, 0, 0, 0, 1 ];
conv = numpy.convolve(x,y); 
conv
array([0, 0, 0, 0, 1, 0, 0, 0, 0])
corr = numpy.correlate(x,y,"full");
corr
array([1, 0, 0, 0, 0, 0, 0, 0, 0])

3
Das ist genau das, was ich suchte. Ein anderes Beispiel, das ich gesehen hatte, war die Verwendung von Faltung, und mir war nicht in den Sinn gekommen, dass eine direkte Korrelation die richtige Wahl wäre. Danke.
CaymanEss
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.