Atraso de medição de sinais de áudio

9

Antes que alguém grite comigo, percebo perfeitamente que essa pergunta já foi feita inúmeras vezes. Garanto-lhe que li as perguntas e respostas existentes, mas ainda estou confuso sobre parte do problema.

Eu tenho uma fonte de som que toca música (A) em um ambiente fechado. Eu tenho um microfone que estou usando para gravar A. Fico com dois arquivos wav que compartilham as mesmas características e comprimento (número de amostras).

Meu objetivo é calcular o tempo que levou para A chegar ao microfone.

Estou tentando executar o cálculo usando correlação 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))

Eu sempre obtenho valores na faixa de 300.000 cm. A distância entre o alto-falante e o microfone é de aproximadamente 2 pés.

Isso tudo é muito novo para mim, então tenho certeza de que estou perdendo algo óbvio.

Desde já, obrigado.

CaymanEss
fonte
3
Tem certeza de que não deveria usá-lo em numpy.correlatevez de numpy.convolve? Para estimar o atraso, você deseja correlacionar seus sinais, não envolvê-los. Você pode acabar com um atraso muito maior por convolução.
Peter K.
PeterK provavelmente está correto. Observe que você pode implementar a correlação por convolução revertendo o tempo e conjugando uma das entradas primeiro. Isso pode permitir o uso de algoritmos de convolução rápida (como economia de sobreposição) para correlação.
Jason R

Respostas:

8

Tem certeza de que não deveria usá-lo em numpy.correlatevez de numpy.convolve? Para estimar o atraso, você deseja correlacionar seus sinais, não envolvê-los. Você pode acabar com um atraso muito maior por convolução.

Tentando algo simples:

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.
fonte
3
Era exatamente isso que eu estava procurando. Outro exemplo que eu já vi usar convolução e não me ocorreu que a correlação direta seria a escolha correta. Obrigado.
CaymanEss