오디오 신호의 시간 지연 측정


9

누군가 나에게 소리 치기 전에이 질문이 여러 번 요청되었다는 것을 완전히 알고 있습니다. 기존 질문과 답변을 읽었지만 문제의 일부에 대해 여전히 혼란 스럽습니다.

닫힌 환경에서 음악 (A)을 재생하는 음원이 있습니다. A를 녹음하는 데 사용하는 마이크가 있습니다. 동일한 특성과 길이 (샘플 수)를 공유하는 두 개의 wav 파일이 남아 있습니다.

내 목표는 A가 마이크에 도달하는 데 걸린 시간을 계산하는 것입니다.

교차 상관 (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))

300,000 cm 범위의 값을 일관되게 얻습니다. 스피커와 마이크 사이의 거리는 약 2 피트입니다.

이것은 나에게 아주 새로운 것이므로 분명한 것이 빠져 있다고 확신합니다.

미리 감사드립니다.


3
당신은 numpy.correlate대신에 사용해서는 안 numpy.convolve됩니까? 지연을 추정하려면 신호를 상호 연관시키지 말고 상호 상관 시키십시오. 당신은 아마도 더 큰 지연으로 끝날 것입니다.
Peter K.

PeterK가 올바른 것 같습니다. 입력 중 하나를 먼저 시간 역전시키고 활용함으로써 컨볼 루션을 통해 상관 관계를 구현할 수 있습니다. 이를 통해 상관 관계 분석에 빠른 컨볼 루션 알고리즘 (예 : 오버랩 저장)을 사용할 수 있습니다.
Jason R

답변:


8

당신은 numpy.correlate대신에 사용해서는 안 numpy.convolve됩니까? 지연을 추정하려면 신호를 상호 연관시키지 말고 상호 상관 시키십시오. 당신은 아마도 더 큰 지연으로 끝날 것입니다.

간단한 것을 시도하십시오 :

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
이것이 바로 내가 찾던 것입니다. 내가 본 컨볼 루션의 또 다른 예는 직접적인 상관 관계가 올바른 선택이라고 생각하지 않았다. 감사합니다.
CaymanEss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.