Ses sinyallerinin gecikme süresini ölçme


9

Biri bana bağırmadan önce, bu sorunun birçok kez sorulduğunu tamamen anlıyorum. Mevcut soruları ve cevapları okuduğumdan eminim ama yine de sorunun bir kısmı hakkında kafam karıştı.

Kapalı bir ortamda müzik (A) çalan bir ses kaynağım var. A'yı kaydetmek için kullandığım bir mikrofonum var. Aynı özellikleri ve uzunluğu (örnek sayısı) paylaşan iki wav dosyası ile kaldım.

Amacım A'nın mikrofona ulaşması için geçen süreyi hesaplamak.

Çapraz korelasyon (numpy) kullanarak hesaplama yapmaya çalışıyorum:

# 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))

Sürekli olarak 300.000 cm aralığında değerler elde ediyorum. Hoparlör ve mikrofon arasındaki mesafe yaklaşık 2 metredir.

Bu benim için oldukça yeni, bu yüzden bariz bir şeyi kaçırdığımdan eminim.

Şimdiden teşekkürler.


3
numpy.correlateBunun yerine kullanmamanız gerektiğinden emin misiniz numpy.convolve? Gecikmeyi tahmin etmek için, sinyallerinizi kıvrık değil, çapraz korelasyon yapmak istersiniz. Büyük olasılıkla kıvrım yaparak çok daha büyük bir gecikme yaşayacaksınız.
Peter K.

PeterK muhtemelen doğrudur. Öncelikle girişlerden birini zaman tersine çevirerek ve konjuge ederek konvolüsyon yoluyla korelasyon uygulayabileceğinizi unutmayın. Bu korelasyon için hızlı evrişim algoritmalarını (çakışma-kaydetme gibi) kullanmanıza izin verebilir.
Jason R

Yanıtlar:


8

numpy.correlateBunun yerine kullanmamanız gerektiğinden emin misiniz numpy.convolve? Gecikmeyi tahmin etmek için, sinyallerinizi kıvrık değil, çapraz korelasyon yapmak istiyorsunuz. Muhtemelen kıvrım yaparak çok daha büyük bir gecikme yaşayacaksınız.

Basit bir şey denemek:

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
Bu tam olarak ben aradığımı. Gördüğüm bir başka örnek, evrişim kullandığını ve doğrudan korelasyonun doğru seçim olacağını bana söylememişti. Teşekkür ederim.
CaymanEss
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.