Pomiar opóźnienia czasowego sygnałów audio

9

Zanim ktokolwiek na mnie krzyczy, w pełni zdaję sobie sprawę, że to pytanie zadawano wiele razy. Zapewniam cię, że przeczytałem istniejące pytania i odpowiedzi, ale nadal jestem zdezorientowany co do części problemu.

Mam źródło dźwięku, które odtwarza muzykę (A) w zamkniętym środowisku. Mam mikrofon, którego używam do nagrywania A. Pozostały mi dwa pliki wav, które mają te same cechy i długość (liczba próbek).

Moim celem jest obliczyć czas, w którym A dotarł do mikrofonu.

Próbuję wykonać obliczenia przy użyciu korelacji krzyżowej (numpy):

# 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))

Konsekwentnie uzyskuję wartości w zakresie 300 000 cm. Odległość między głośnikiem a mikrofonem wynosi około 2 stóp.

To dla mnie całkiem nowe, więc jestem pewien, że brakuje mi czegoś oczywistego.

Z góry dziękuję.

CaymanEss
źródło
3
Czy na pewno nie powinieneś używać numpy.correlatezamiast numpy.convolve? Aby oszacować opóźnienie, chcesz skorelować swoje sygnały, a nie je konwertować. Prawdopodobnie skończysz ze znacznie większym opóźnieniem przez zwoje.
Peter K.
PeterK prawdopodobnie ma rację. Zauważ, że możesz zaimplementować korelację poprzez splot, odwracając czas i sprzęgając najpierw jedno z danych wejściowych. Pozwala to na użycie algorytmów szybkiego splotu (takich jak nakładanie-zapisywanie) do korelacji.
Jason R

Odpowiedzi:

8

Czy na pewno nie powinieneś używać numpy.correlatezamiast numpy.convolve? Aby oszacować opóźnienie, chcesz skorelować swoje sygnały, a nie je konwertować. Prawdopodobnie skończysz ze znacznie większym opóźnieniem przez zwoje.

Próbowanie czegoś prostego:

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])
Peter K.
źródło
3
To jest dokładnie to, czego szukałem. Kolejny przykład, który widziałem, wykorzystał splot i nie przyszło mi do głowy, że bezpośrednia korelacja byłaby właściwym wyborem. Dziękuję Ci.
CaymanEss