Mendeteksi arah suara menggunakan beberapa mikrofon

9

Pertama-tama, saya telah melihat utas yang serupa, namun sedikit berbeda dengan apa yang ingin saya capai. Saya membangun robot yang akan mengikuti orang yang memanggilnya. Ide saya adalah menggunakan 3 atau 4 mikrofon - yaitu dalam pengaturan berikut untuk menentukan dari arah mana robot itu dipanggil:

masukkan deskripsi gambar di sini

Di mana S adalah sumber, A, B dan C adalah mikrofon. Idenya adalah untuk menghitung fase korelasi sinyal yang direkam dari pasangan AB, AC, BC dan berdasarkan itu membangun vektor yang akan menunjuk pada sumber menggunakan semacam triangulasi. Sistem bahkan tidak harus bekerja secara real time karena akan diaktifkan suara - sinyal dari semua mikrofon akan direkam secara bersamaan, suara akan diambil sampelnya hanya dari satu mikrofon dan jika sesuai dengan tanda tangan suara, korelasi fase akan dihitung dari fraksi terakhir dari detik untuk menghitung arah. Saya sadar bahwa ini mungkin tidak berfungsi dengan baik yaitu ketika robot dipanggil dari ruangan lain atau ketika ada beberapa refleksi.

Ini hanya ide yang saya miliki, tetapi saya belum pernah mencoba hal seperti ini dan saya punya beberapa pertanyaan sebelum saya membangun perangkat keras yang sebenarnya yang akan melakukan pekerjaan:

  1. Apakah ini cara khas untuk melakukan ini? (Yaitu digunakan di telepon untuk pembatalan kebisingan?) Apa pendekatan lain yang mungkin?
  2. Bisakah korelasi fase dihitung antara 3 sumber sekaligus? (Yaitu untuk mempercepat perhitungan)
  3. Apakah laju sampel 22khz dan kedalaman 12bit cukup untuk sistem ini? Saya sangat peduli tentang kedalaman bit.
  4. Haruskah mikrofon ditempatkan di tabung terpisah untuk meningkatkan pemisahan?
Max Walczak
sumber
1
Ini artikel yang menarik , mungkin Anda pernah melihatnya. Sepertinya penulis akhirnya menempatkan mic keempat di atas 3 lainnya untuk berurusan dengan sumber suara yang berada di atas array. Selain itu terlihat sangat mirip dengan rencana Anda (setidaknya untuk mata saya yang tidak terlatih).
Tamu
Istilah umum untuk bagian korelasi fase adalah Beamforming. Sistem beamforming yang umum menggunakan array linear mikrofon, dan saya tidak yakin bidang "visi" untuk mikrofon Anda akan benar-benar memungkinkan banyak triangulasi.
pscheidler
Mengenai triangulasi, saya kira Anda dapat mengatur dua atau tiga array terpisah jarak dan menemukan persimpangan balok. Bisa menyelesaikan kasus 2-beam degenerate dengan "hey robot ..." (robot berbalik menghadap Anda) ... "datang ke sini!"
Tamu
Sebenarnya, itu bisa bekerja dengan menambahkan satu lagi mic. Lihat ini , ini adalah variasi dari solusi Harry. Segitiga sama sisi menjadi segitiga siku-siku, dan satu lagi mic ditambahkan untuk membentuk segitiga lain. Dari masing-masing segitiga kami membuat balok, dan mengambil rata-rata dari dua balok itu untuk mendapatkan vektor arah yang akurat. Perhatikan dua "mata" dalam demo. Mereka ditempatkan sehingga balok yang melewatinya akan melakukan pelacakan posisi ketika sumber langsung di depan atau di belakang robot. Cobalah dengan sumber kapan saja y = 0.
Tamu
1
@FilipePinto, sudahkah Anda membaca jawaban dan uraian masalahnya secara menyeluruh? Ini tidak dapat berfungsi seperti itu karena Anda tidak dapat mengetahui bagaimana setiap puncak energi dari masing-masing mikrofon berkorelasi dengan mikrofon lain - itu sebabnya Anda memerlukan korelasi fase, titik terdekat terdekat atau beberapa algoritma registrasi lainnya (pendaftaran tidak mengacu pada rekaman di sini, tetapi untuk mencocokkan satu sinyal dengan yang lain) untuk mencocokkan bentuk gelombang yang direkam dan mendeteksi pergeseran satu sama lain dalam beberapa waktu
Max Walczak

Jawaban:

7

Untuk memperluas jawaban Muller,

  1. Haruskah mikrofon ditempatkan di tabung terpisah untuk meningkatkan pemisahan?
  1. Tidak, Anda mencoba mengidentifikasi arah sumber, menambahkan tabung hanya akan membuat suara memantul di dalam tabung yang jelas tidak diinginkan.

    Tindakan terbaik adalah membuat mereka menghadap ke atas, dengan cara ini mereka semua akan menerima suara yang sama dan satu-satunya hal yang unik tentang mereka adalah penempatan fisik mereka yang secara langsung akan mempengaruhi fase. Gelombang sinus 6 kHz memiliki panjang gelombang . Jadi, jika Anda ingin secara unik mengidentifikasi fase-fase gelombang sinus hingga 6 kHz, yang merupakan frekuensi tipikal untuk pembicaraan manusia, maka Anda harus mengatur jarak mikrofon paling banyak 5,71 mm. Ini satu itemspeed of soundsound frequency=343 m/s6 kHz=5.71 mmyang memiliki diameter kurang dari 5,71 mm. Jangan lupa untuk menambahkan filter low pass dengan frekuensi cut-off sekitar 6-10 kHz.

Edit

Saya merasa bahwa pertanyaan nomor 2 ini tampak menyenangkan jadi saya memutuskan untuk mencoba menyelesaikannya sendiri.

  1. Bisakah korelasi fase dihitung antara 3 sumber sekaligus? (Yaitu untuk mempercepat perhitungan)

Jika Anda tahu aljabar linier Anda, maka Anda dapat membayangkan bahwa Anda telah menempatkan mikrofon dalam segitiga di mana masing-masing mikrofon berjarak 4 mm dari satu sama lain membuat setiap sudut interior .60°

Jadi mari kita asumsikan mereka ada dalam konfigurasi ini:

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

Aku akan...

  • gunakan nomenklatur yang merupakan vektor yang menunjuk dari keAB¯AB
  • sebut asal sayaA
  • tulis semua angka dalam mm
  • menggunakan matematika 3D tetapi berakhir dengan arah 2D
  • atur posisi vertikal mikrofon ke bentuk gelombang aktualnya. Jadi persamaan ini didasarkan pada gelombang suara yang terlihat seperti ini .
  • Hitung produk silang mikrofon ini berdasarkan posisi dan bentuk gelombangnya, lalu abaikan informasi tinggi dari produk silang ini dan gunakan arctan untuk mencari arah sumber yang sebenarnya.
  • memanggil output dari mikrofon pada posisi , panggilan output dari mikrofon pada posisi , panggilan output dari mikrofon pada posisiaAbBcC

Jadi hal-hal berikut ini benar:

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

Ini memberi kita:

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

Dan produk silang hanyalahAB¯×AC¯

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

Informasi Z, hanyalah sampah, tidak menarik bagi kami. Ketika sinyal input berubah, vektor silang akan berayun maju dan mundur ke arah sumber. Jadi setengah dari waktu itu akan mengarah langsung ke sumbernya (mengabaikan refleksi dan parasit lainnya). Dan separuh waktu lainnya akan menunjuk 180 derajat dari sumber.83

Yang saya bicarakan adalah yang dapat disederhanakan menjadi , lalu ubah radian menjadi derajat.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Jadi yang Anda dapatkan adalah persamaan berikut:

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


Tetapi separuh dari waktu informasi tersebut benar-benar 100% salah, jadi bagaimana ... haruskah satu .... membuatnya benar 100% dari waktu?

Jika memimpin , maka sumbernya tidak boleh lebih dekat ke B.ab

Dengan kata lain, buat sesuatu yang sederhana seperti ini:

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;
  }
}

Dan mungkin Anda hanya ingin bereaksi jika sumber suara berasal dari sudut vertikal tertentu, jika orang berbicara di atas mikrofon => 0 perubahan fase => tidak melakukan apa-apa. Orang-orang berbicara secara horizontal di sebelahnya => beberapa perubahan fase => bereaksi.

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

Jadi, Anda mungkin ingin mengatur ambang itu ke sesuatu yang rendah, seperti 0,1 atau 0,01. Saya tidak sepenuhnya yakin, tergantung pada volume dan frekuensi serta parasitics, ujilah sendiri.

Alasan lain kapan menggunakan persamaan nilai absolut adalah untuk penyilangan nol, mungkin ada sedikit momen ketika arah akan menunjuk ke arah yang salah. Meskipun hanya untuk 1% dari waktu, bahkan jika itu. Jadi, Anda mungkin ingin melampirkan filter LP urutan pertama ke arah.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

Dan jika Anda ingin bereaksi terhadap volume tertentu, maka jumlahkan ketiga mikrofon bersama-sama dan bandingkan dengan beberapa nilai pemicu. Nilai rata-rata mikrofon akan menjadi jumlah mereka dibagi dengan 3, tetapi Anda tidak perlu membaginya dengan 3 jika Anda meningkatkan nilai pemicu oleh faktor 3.


Saya mengalami masalah dengan menandai kode sebagai C / C # / C ++ atau JS atau yang lainnya, jadi sayangnya kode tersebut akan hitam putih, bertentangan dengan keinginan saya. Oh well, semoga sukses di usaha Anda. Terdengar menyenangkan.

Juga ada kemungkinan 50/50 bahwa arahnya akan jauh dari sumber 99% dari waktu. Saya ahli membuat kesalahan seperti itu. Koreksi untuk ini adalah hanya membalikkan pernyataan if untuk kapan 180 derajat harus ditambahkan.

Harry Svensson
sumber
Saya bertanya-tanya apakah fase fase benar-benar diperlukan, atau apakah setiap mic hanya dapat mencari beberapa fitur yang dapat diidentifikasi. Jika semua mikrofon mendengar "hei robot" maka tidak bisakah mereka membariskan permulaan suara "bah" itu dan mengabaikan fase? Maka Anda tidak perlu menempatkan mic begitu dekat ...
Tamu
1
abc
1
Tidak yakin saya pernah melihat kode menyoroti bekerja di sini di SE.DSP. Biarkan saya memeriksa dengan Lounge Guru dan melihat apa yang mereka katakan. Sepertinya seseorang bertanya di Meta beberapa waktu lalu, tetapi tidak ada tindakan yang dilakukan: dsp.meta.stackexchange.com/questions/133/…
Peter K.
1
Silakan pergi dan unggah posting itu di Meta.DSP. Saya telah menambahkan tag <kbd> fitur-permintaan </kbd> yang setidaknya harus melihat pertunangan, tetapi kami membutuhkan suara. Jika situs Chemistry.SE mengaktifkannya, kita pasti harus! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.
1
@ endolith Anda benar, saya sekarang telah menghapus bagian itu. Terima kasih.
Harry Svensson
4
  1. Ya, ini terasa masuk akal dan khas.
  2. Anda bisa menggunakan tiga sinyal mikrofon sekaligus (tidak akan "memutar" melalui korelasi tiga pasangan Anda). Cari "MUSIK" dan "ESPRIT" dalam aplikasi arah kedatangan.
  3. Sangat mungkin. Anda tidak bertujuan untuk kualitas audio yang tinggi, Anda bertujuan untuk sifat-sifat korelas yang baik, dan beberapa bit di sana-sini mungkin tidak akan membuat atau merusak sistem. Laju pengambilan sampel yang lebih tinggi seperti 44,1 kHz atau 48 kHz yang sangat umum, di sisi lain, akan langsung menggandakan presisi sudut, sangat mungkin, pada panjang pengamatan yang sama.
Marcus Müller
sumber