Mesure de la temporisation des signaux audio

9

Avant que quelqu'un ne me crie dessus, je me rends pleinement compte que cette question a été posée à plusieurs reprises. Je vous assure que j'ai lu les questions et réponses existantes mais je suis toujours confus sur une partie du problème.

J'ai une source sonore qui joue de la musique (A) dans un environnement fermé. J'ai un micro que j'utilise pour enregistrer A. Je me retrouve avec deux fichiers wav qui partagent les mêmes caractéristiques et la même longueur (nombre d'échantillons).

Mon objectif est de calculer le temps qu'il a fallu à A pour atteindre le micro.

J'essaie d'effectuer le calcul en utilisant la corrélation croisée (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))

J'obtiens constamment des valeurs dans la plage de 300 000 cm. La distance entre le haut-parleur et le micro est d'environ 2 pieds.

Tout cela est assez nouveau pour moi, donc je suis sûr que je manque quelque chose d'évident.

Merci d'avance.

CaymanEss
la source
3
Êtes-vous sûr de ne pas utiliser à la numpy.correlateplace de numpy.convolve? Pour estimer le retard, vous voulez intercorréler vos signaux, pas les convoluer. Vous vous retrouverez peut-être avec un retard beaucoup plus important en convoluant.
Peter K.
PeterK a probablement raison. Notez que vous pouvez implémenter la corrélation via la convolution en inversant le temps et en conjuguant l'une des entrées en premier. Cela peut vous permettre d'utiliser des algorithmes de convolution rapides (comme la sauvegarde par chevauchement) pour la corrélation.
Jason R

Réponses:

8

Êtes-vous sûr de ne pas utiliser à la numpy.correlateplace de numpy.convolve? Pour estimer le retard, vous voulez intercorréler vos signaux, pas les convoluer. Vous vous retrouverez peut-être avec un retard beaucoup plus important en convoluant.

Essayer quelque chose de 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.
la source
3
C'est exactement ce que je cherchais. Un autre exemple que j'avais vu utilisait la convolution et il ne m'était pas venu à l'esprit que la corrélation directe serait le bon choix. Je vous remercie.
CaymanEss