Medición del tiempo de demora de las señales de audio

9

Antes de que alguien me grite, me doy cuenta de que esta pregunta se ha hecho en numerosas ocasiones. Le aseguro que he leído las preguntas y respuestas existentes, pero todavía estoy confundido acerca de parte del problema.

Tengo una fuente de sonido que reproduce música (A) en un entorno cerrado. Tengo un micrófono que estoy usando para grabar A. Me quedan dos archivos wav que comparten las mismas características y longitud (número de muestras).

Mi objetivo es calcular el tiempo que le tomó a A alcanzar el micrófono.

Estoy tratando de realizar el cálculo usando correlación cruzada (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))

Constantemente obtengo valores en el rango de 300,000 cm. La distancia entre el altavoz y el micrófono es de aproximadamente 2 pies.

Todo esto es bastante nuevo para mí, así que estoy seguro de que me falta algo obvio.

Gracias por adelantado.

CaymanEss
fuente
3
¿Estás seguro de que no deberías estar usando en numpy.correlatelugar de numpy.convolve? Para estimar el retraso, desea hacer una correlación cruzada de sus señales, no convolucionarlas. Posiblemente terminará con un retraso mucho mayor por convolucionarse.
Peter K.
PeterK es probablemente correcto. Tenga en cuenta que puede implementar la correlación mediante convolución invirtiendo el tiempo y conjugando primero una de las entradas. Esto puede permitirle usar algoritmos de convolución rápida (como overlap-save) para la correlación.
Jason R

Respuestas:

8

¿Estás seguro de que no deberías estar usando en numpy.correlatelugar de numpy.convolve? Para estimar el retraso, desea hacer una correlación cruzada de sus señales, no convolucionarlas. Posiblemente terminará con un retraso mucho mayor por convolucionarse.

Intentando algo simple:

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.
fuente
3
Esto es exactamente lo que estaba buscando. Otro ejemplo que había visto utilizaba la convolución y no se me había ocurrido que la correlación directa sería la elección correcta. Gracias.
CaymanEss