Misura del ritardo dei segnali audio


9

Prima che qualcuno mi grida mi rendo pienamente conto che questa domanda è stata posta più volte. Ti assicuro che ho letto le domande e le risposte esistenti ma sono ancora confuso su parte del problema.

Ho una fonte sonora che suona musica (A) in un ambiente chiuso. Ho un microfono che sto usando per registrare A. Mi rimangono due file wav che condividono le stesse caratteristiche e lunghezza (numero di campioni).

Il mio obiettivo è calcolare il tempo impiegato da A per raggiungere il microfono.

Sto cercando di eseguire il calcolo usando la correlazione incrociata (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))

Ottengo costantemente valori nell'intervallo di 300.000 cm. La distanza tra l'altoparlante e il microfono è di circa 2 piedi.

Tutto questo è abbastanza nuovo per me, quindi sono sicuro che mi manchi qualcosa di ovvio.

Grazie in anticipo.


3
Sei sicuro di non utilizzare al numpy.correlateposto di numpy.convolve? Per stimare il ritardo, si desidera correlare in modo incrociato i segnali, non coinvolgerli. Probabilmente finirai con un ritardo molto più grande convolvendo.
Peter K.

PeterK è probabilmente corretto. Si noti che è possibile implementare la correlazione tramite convoluzione invertendo il tempo e coniugando prima uno degli input. Ciò può consentire di utilizzare algoritmi di convoluzione rapida (come overlap-save) per la correlazione.
Jason R,

Risposte:


8

Sei sicuro di non utilizzare al numpy.correlateposto di numpy.convolve? Per stimare il ritardo, si desidera correlare in modo incrociato i segnali, non coinvolgerli. Probabilmente finirai con un ritardo molto più grande convolvendo.

Provare qualcosa di semplice:

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
Questo è esattamente quello che stavo cercando. Un altro esempio che avevo visto usare la convoluzione e non mi era venuto in mente che la correlazione diretta sarebbe stata la scelta corretta. Grazie.
CaymanEss,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.