Birden fazla mikrofon kullanarak ses yönünü algılama


9

Her şeyden önce, benzer bir iş parçacığı gördüm, ancak elde etmeye çalıştığımdan biraz farklı. Onu arayan kişiyi takip edecek bir robot yapıyorum. Benim fikrim 3 veya 4 mikrofon kullanmak - yani robotun hangi yönden çağrıldığını belirlemek için aşağıdaki düzenlemede:

resim açıklamasını buraya girin

S'nin kaynak olduğu yerlerde, A, B ve C mikrofonlardır. Fikir, AB, AC, BC çiftlerinden kaydedilen sinyallerin faz korelasyonunu hesaplamaktır ve buna dayanarak bir tür üçgenleme kullanarak kaynağa işaret edecek bir vektör oluşturur. Sistemin gerçek zamanlı olarak çalışması bile gerekmez, çünkü ses etkinleştirilecektir - tüm mikrofonlardan gelen sinyaller aynı anda kaydedilecek, ses sadece bir mikrofondan örneklenecek ve ses imzasına uyuyorsa, faz korelasyonu hesaplanacaktır. yönü hesaplamak için saniyenin son bölümü. Robotun başka bir odadan çağrıldığında veya birden fazla yansıma olduğunda bunun çok iyi çalışmayabileceğinin farkındayım.

Bu sadece bir fikirdi, ama böyle bir şey denemedim ve işi yapacak gerçek donanımı kurmadan önce birkaç sorum var:

  1. Bunu yapmanın tipik bir yolu var mı? (örneğin telefonlarda gürültü iptali için mi kullanılır?) Diğer olası yaklaşımlar nelerdir?
  2. Faz korelasyonu bir şekilde eşzamanlı olarak 3 kaynak arasında hesaplanabilir mi? (yani hesaplamayı hızlandırmak için)
  3. Bu sistem için 22 khz örnekleme hızı ve 12 bit derinlik yeterli mi? Özellikle bit derinliği konusunda endişeliyim.
  4. Ayrılmayı iyileştirmek için mikrofonlar ayrı tüplere yerleştirilmeli mi?

1
İşte ilginç bir makale , belki de görmüşsünüzdür. Görünüşe göre yazar, ses kaynağının dizinin üstünde olması için diğer 3'ün üzerine dördüncü bir mikrofon yerleştirdi. Bunun dışında planınıza oldukça benziyor (en azından eğitimsiz gözüme).
Misafir

Faz korelasyon kısmı için genel terim Beamforming'dir. Yaygın bir ışın şekillendirme sistemi lineer bir mikrofon dizisi kullanır ve mikrofonlarınız için "görüş" alanının gerçekten çok fazla üçgenlemeye izin vereceğinden emin değilim.
pscheidler

Nirengi ile ilgili olarak, sanırım dizilerin iki veya üçünü birbirinden biraz uzakta kurabilir ve kirişlerin kesişimini bulabilirsin. "Hey robot ..." (robot size dönüyor) ... "buraya gel!"
Konuk

Aslında, bu bir mikrofon daha ekleyerek işe yarayabilir. Bu Çıkış , Harry'nin çözümün varyasyonu olan. Eşkenar üçgen sağ üçgen olur ve başka bir üçgen oluşturmak için bir mikrofon daha eklenir. Her üçgenden bir ışın göndeririz ve doğru bir yön vektörü elde etmek için bu iki ışının ortalamasını alırız. Demodaki iki "göz" e dikkat edin. Kaynaklar doğrudan robotun önünde veya arkasındayken, içinden geçen kirişlerin konumunu üçgenleyecek şekilde yerleştirilirler. Herhangi bir y = 0 kaynağında deneyin.
Konuk

1
@FilipePinto sorunun cevabını ve açıklamasını iyice okudunuz mu? Gerçekten böyle çalışamaz çünkü her bir mikrofondaki her enerji tepe noktasının diğer mikrofonlarla nasıl ilişkilendirildiğini bilemezsiniz - bu yüzden faz korelasyonuna, tekrarlamalı en yakın noktaya veya başka bir kayıt algoritmasına ihtiyacınız var (kayıt kayıt anlamına gelmiyor) burada, ancak bir sinyali diğeriyle eşleştirmek için) kaydedilen dalga formlarını eşleştirmek ve bir zaman penceresi içinde karşılıklı kaymalarını tespit etmek için
Max Walczak

Yanıtlar:


7

Müller'in cevabını uzatmak için,

  1. Ayrılmayı iyileştirmek için mikrofonlar ayrı tüplere yerleştirilmeli mi?
  1. Hayır, kaynağın yönünü belirlemeye çalışıyorsunuz, tüpler eklemek sadece tüpün içindeki ses sıçramalarını kesinlikle istenmiyor.

    Eylemin en iyi yolu, onları doğrudan yukarı dönük hale getirmektir, bu şekilde hepsi benzer ses alacaktır ve onlar için benzersiz olan tek şey, fazı doğrudan etkileyecek fiziksel yerleşimleridir. 6 kHz sinüs dalgasının dalga boyuspeed of soundsound frequency=343 m/s6 kHz=5.71 mm. Dolayısıyla, insan konuşması için tipik frekanslar olan 6 kHz'e kadar sinüs dalgalarının fazlarını benzersiz bir şekilde tanımlamak istiyorsanız, mikrofonları en fazla 5.71 mm aralıkla yerleştirmelisiniz. Çapı 5,71 mm'den az olan tek bir parça . Kesme frekansı 6-10 kHz'de düşük geçiş filtresi eklemeyi unutmayın.

Düzenle

Bu 2. sorunun eğlenceli göründüğünü hissettim, bu yüzden kendi başıma çözmeye çalıştım.

  1. Faz korelasyonu bir şekilde eşzamanlı olarak 3 kaynak arasında hesaplanabilir mi? (yani hesaplamayı hızlandırmak için)

Doğrusal cebirinizi biliyorsanız, mikrofonları her bir mikrofonun birbirinden 4 mm uzakta olduğu bir üçgenin içine yerleştirdiğinizi ve her bir iç açıyı açtığınızı hayal edebilirsiniz .60°

Bu yapılandırmada olduklarını varsayalım:

       C
      / \
     /   \
    /     \
   /       \
  /         \
 A - - - - - B

Yapacağım...

  • terminolojisi kullanımı gelen işaret eden bir vektördür içinAB¯AB
  • call benim kökeniA
  • tüm sayıları mm olarak yaz
  • 3B matematik kullanın ancak 2B yönü ile bitirin
  • mikrofonların dikey pozisyonlarını gerçek dalga formlarına ayarlayın. Bu denklemler bir ses dayanmaktadır Yani böyle olduğu görünüyor şey dalga bu .
  • Bu mikrofonların çapraz ürünlerini konumlarına ve dalga formlarına göre hesaplayın, daha sonra bu çapraz üründen yükseklik bilgilerini dikkate almayın ve kaynağın gerçek yönünü bulmak için arktan kullanın.
  • çağrı pozisyonda mikrofonun çıkış , çağrı pozisyonunda mikrofonun çıkış , çağrı pozisyonunda mikrofonun çıkışaAbBcC

Yani aşağıdaki şeyler doğrudur:

  • A=(0,0,a)
  • B=(4,0,b)
  • C=(2,4222=23,c)

Bu bize şunları verir:

  • AB¯=(4,0,ab)
  • AC¯=(2,23,ac)

Ve çapraz ürün basitçeAB¯×AC¯

AB¯×AC¯=(40ab)×(223ac)=(0(ac)(ab)23(ab)24(ac)42302)=(23(ba)2a2b4c83)

Z bilgisi, sadece önemsiz, bizim için sıfır ilgi. Giriş sinyalleri değiştikçe, çapraz vektör kaynağa doğru ileri geri sallanacaktır. Yani zamanın yarısı doğrudan kaynağa işaret edecektir (yansımaları ve diğer parazitleri görmezden gelmek). Ve zamanın diğer yarısı kaynaktan 180 derece uzağa işaret edecektir.83

Ne bahsediyorum olduğunu için basitleştirilmiş edilebilen ve ardından radyanları dereceye dönüştürün.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Sonuçta şu denklemi elde edersiniz:

arctan(a+b+2c3(ab))180π


Ama bilginin yarısı tam anlamıyla% 100 yanlış, bu yüzden .. nasıl ....% 100 doğru yapmak gerekir?

Eğer , öncülük ediyorsa , kaynak B'ye daha yakın olamaz.ab

Başka bir deyişle, böyle basit bir şey yapın:

source_direction=atan2(a+b+2c,\sqrt{3}*(a-b))*180/pi;
if(a>b){
   if(b>c){//a>b>c
     possible_center_direction=240; //A is closest, then B, last C
   }else if(a>c){//a>c>b
     possible_center_direction=180; //A is closest, then C last B
   }else{//c>a>b
     possible_center_direction=120; //C is closest, then A last B
   }
}else{
   if(c>b){//c>b>a
     possible_center_direction=60; //C is closest, then B, last A
   }else if(a>c){//b>a>c
     possible_center_direction=300; //B is closest, then A, last C
   }else{//b>c>a
     possible_center_direction=0; //B is closest, then C, last A
   }
}

//if the source is out of bounds, then rotate it by 180 degrees.
if((possible_center_direction+60)<source_direction){
  if(source_direction<(possible_center_direction-60)){
    source_direction=(source_direction+180)%360;
  }
}

Ve belki de sadece ses kaynağı belirli bir dikey açıdan geliyorsa, insanlar mikrofonların üstünde konuşursa tepki vermek istersiniz => 0 faz değişimi => hiçbir şey yapmayın. İnsanlar yanında yatay konuşurlar => bazı faz değişimi => tepki gösterirler.

|P|=Px2+Py2=3(ab)2+(a+b+2c)2

Yani bu eşiği 0,1 veya 0,01 gibi düşük bir şeye ayarlamak isteyebilirsiniz. Tamamen emin değilim, hacme ve frekansa ve parazitlere bağlı, kendiniz test edin.

Mutlak değer denkleminin ne zaman kullanılacağının başka bir nedeni sıfır geçişler içindir, yönün yanlış yönü göstereceği zaman için küçük bir an olabilir. Olsa bile, sadece% 1 oranında olacak olsa. Bu yüzden yöne birinci dereceden bir LP filtresi eklemek isteyebilirsiniz.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

Ve belirli bir birime tepki vermek istiyorsanız, sadece 3 mikrofonu toplayın ve bunu bir tetikleme değeriyle karşılaştırın. Mikrofonların ortalama değeri toplamlarının 3'e bölünmesi olacaktır, ancak tetikleyici değerini bir faktör 3 ile arttırırsanız 3'e bölmeniz gerekmez.


C / C # / C ++ veya JS veya başka herhangi bir kod olarak işaretleme ile ilgili sorunlar yaşıyorum, ne yazık ki kod benim istekleri karşı beyaz üzerine siyah olacak. Oh iyi, girişiminizde iyi şanslar. Kulağa eğlenceli geliyor.

Ayrıca yönün% 99 oranında kaynaktan 180 uzakta olma ihtimali vardır. Bu tür hatalar yapmada ustayım. Bununla ilgili bir düzeltme, 180 derecenin ne zaman eklenmesi gerektiğine ilişkin if ifadelerini tersine çevirmek olacaktır.


Faz olayının gerçekten gerekli olup olmadığını veya her mikrofonun tanımlanabilir bir özellik arayabildiğini merak ediyorum. Eğer tüm mikrofonlar "hey robot" sesini duyuyorlarsa, o "bah" sesinin başlangıcını hizalayıp aşamayı görmezden gelemezler mi? O zaman mikrofonları birbirine çok yakın yerleştirmenize gerek yok ...
Konuk

1
@HarrySvensson, ne demek istediğini anlıyorum. Yaklaşımınız gibi bir şey kullanabileceğinizi düşünüyordum, ancak ilk mikrofon sesi duyduğundan beri , ve bir kaç milisaniye olurdu. Ben oynadı kendisiyle burada , ama kaynak, bir mikrofon ve robotun merkezinden tüm bir çizgide olmadığında mükemmel sıraya değil. Bence "tamam" olabilir, kontrol edin. Kaynak mikrofondan uzak olduğunda hata o kadar da kötü değildir. Eminim düzeltilebilir ama matematik benden kaçıyor. abc
Misafir

1
Şimdiye kadar burada SE.DSP üzerinde çalışan vurgulayarak kod gördüğüm emin değilim. Öğretmenler Salonu'na bakayım ve ne dediklerini göreyim. Birisi Meta'ya bir
Peter K.

1
Lütfen gidin ve Meta.DSP'de bu gönderiyi oylayın. En azından biraz etkileşim görmesi gereken <kbd> özellik-istek </kbd> etiketini ekledim, ancak oylara ihtiyacımız var. Chemistry.SE sitesi etkinleştirilmişse, kesinlikle yapmalıyız! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
@ endolith Haklısın, şimdi o kısmı kaldırdım. Teşekkür ederim.
Harry Svensson

4
  1. Evet, bu makul ve tipik bir his.
  2. Aynı anda üç mikrofon sinyalini de kullanabilirsiniz (üç çift korelasyonunuz aracılığıyla "dolambaçlı yoldan gitmeyin"). Varış yönü uygulamalarında "MÜZİK" ve "ESPRIT" ifadelerini arayın.
  3. Büyük olasılıkla öyle. Yüksek ses kalitesini hedeflemiyorsunuz, iyi corss-korelasyon özelliklerini hedefliyorsunuz ve burada birkaç bit var ve muhtemelen sistemi oluşturmayacak veya bozmayacaksınız. Öte yandan, çok yaygın 44.1 kHz veya 48 kHz gibi daha yüksek bir örnekleme oranı, büyük olasılıkla, aynı gözlemsel uzunlukta açısal hassasiyeti anında iki katına çıkarır.
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.