การตรวจจับทิศทางของเสียงโดยใช้ไมโครโฟนหลายตัว


9

ก่อนอื่นฉันได้เห็นหัวข้อที่คล้ายกัน แต่มันต่างไปเล็กน้อยกับสิ่งที่ฉันพยายามทำ ฉันกำลังสร้างหุ่นยนต์ซึ่งจะติดตามบุคคลที่เรียกมัน ความคิดของฉันคือการใช้ไมโครโฟน 3 หรือ 4 ตัว - เช่นในการจัดเรียงต่อไปนี้เพื่อกำหนดทิศทางที่หุ่นยนต์ถูกเรียก:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่ S คือต้นกำเนิด A, B และ C เป็นไมโครโฟน แนวคิดคือการคำนวณความสัมพันธ์เฟสของสัญญาณที่บันทึกจากคู่ AB, AC, BC และจากนั้นสร้างเวกเตอร์ที่จะชี้ไปที่แหล่งที่มาโดยใช้สมการชนิดหนึ่ง ระบบไม่จำเป็นต้องทำงานในเวลาจริงเพราะมันจะเปิดใช้งานเสียง - สัญญาณจากไมโครโฟนทั้งหมดจะถูกบันทึกพร้อมกันเสียงจะถูกสุ่มจากไมโครโฟนเพียงตัวเดียวและถ้ามันเหมาะกับลายเซ็นเสียงความสัมพันธ์ของเฟสจะถูกคำนวณจาก เศษส่วนสุดท้ายของวินาทีเพื่อคำนวณทิศทาง ฉันทราบว่านี่อาจไม่ทำงานเช่นกันเช่นเมื่อมีการเรียกหุ่นยนต์จากห้องอื่นหรือเมื่อมีการสะท้อนหลายครั้ง

นี่เป็นเพียงความคิดที่ฉันมี แต่ฉันไม่เคยลองอะไรแบบนี้และฉันมีคำถามหลายข้อก่อนที่ฉันจะสร้างฮาร์ดแวร์จริงที่จะทำงาน:

  1. นี่เป็นวิธีทั่วไปในการทำสิ่งนี้หรือไม่? (เช่นใช้ในโทรศัพท์เพื่อตัดเสียงรบกวน) มีวิธีการอื่นที่เป็นไปได้อย่างไร
  2. สามารถคำนวณความสัมพันธ์ของเฟสระหว่าง 3 แหล่งพร้อมกันได้หรือไม่? (เช่นเพื่อเร่งการคำนวณ)
  3. อัตราตัวอย่าง 22khz และความลึก 12 บิตเพียงพอสำหรับระบบนี้หรือไม่ ฉันกังวลเป็นพิเศษเกี่ยวกับความลึกของบิต
  4. ควรวางไมโครโฟนในหลอดแยกเพื่อปรับปรุงการแยกหรือไม่

1
นี่เป็นบทความที่น่าสนใจบางทีคุณอาจเคยเห็นมัน ดูเหมือนว่าผู้เขียนจะวางไมค์ตัวที่สี่เหนืออีกสามตัวเพื่อจัดการกับแหล่งกำเนิดเสียงที่อยู่เหนืออาเรย์ นอกเหนือจากนั้นมันก็ดูคล้าย ๆ กับแผนของคุณ (อย่างน้อยก็ตาฉัน)
บุคคลทั่วไป

คำทั่วไปสำหรับส่วนความสัมพันธ์เฟสคือ Beamforming ระบบ beamforming ทั่วไปใช้อาร์เรย์ของไมโครโฟนแบบเส้นตรงและฉันไม่แน่ใจว่าฟิลด์ของ "การมองเห็น" สำหรับไมโครโฟนของคุณจะช่วยให้สามารถวิเคราะห์ตำแหน่งได้จริง
pscheidler

เกี่ยวกับการหาสมการฉันคิดว่าคุณสามารถตั้งค่าสองหรือสามของอาร์เรย์ห่างกันและหาจุดตัดของคาน สามารถแก้ปัญหากรณีที่ความเสื่อมแบบ 2 ลำแสงด้วย "เฮ้โรบอท ... " (หุ่นยนต์หันมาเผชิญหน้ากับคุณ) ...
ผู้เข้าพัก

ที่จริงแล้วสามารถใช้งานได้โดยเพิ่มไมโครโฟนอีกหนึ่งตัว ลองดูนี่เป็นความแตกต่างของทางออกของแฮรี่ รูปสามเหลี่ยมด้านเท่าจะกลายเป็นรูปสามเหลี่ยมมุมฉากและจะเพิ่มไมโครโฟนอีกหนึ่งรูปเพื่อสร้างรูปสามเหลี่ยมอีกรูปหนึ่ง จากสามเหลี่ยมแต่ละอันเราใช้ลำแสงและหาค่าเฉลี่ยของคานทั้งสองเพื่อให้ได้เวกเตอร์ทิศทางที่แม่นยำ สังเกตุ "ดวงตา" ทั้งสองในการสาธิต พวกมันถูกวางไว้เพื่อให้ลำแสงวิ่งผ่านพวกเขาจะได้ตำแหน่งเป็นรูปสามเหลี่ยมเมื่อแหล่งกำเนิดอยู่ด้านหน้าหรือด้านหลังของหุ่นยนต์ ลองใช้กับแหล่งที่มาที่ y = 0
แขกผู้เข้าพัก

1
@FilipePinto คุณอ่านคำตอบและคำอธิบายปัญหาอย่างละเอียดแล้วหรือยัง มันไม่สามารถทำงานได้เช่นนั้นเนื่องจากคุณไม่ทราบว่าแต่ละพลังงานสูงสุดจากไมโครโฟนแต่ละตัวนั้นมีความสัมพันธ์กับไมโครโฟนอื่น ๆ - นั่นเป็นเหตุผลที่คุณต้องการความสัมพันธ์ของเฟสจุดที่ใกล้เคียงที่สุดซ้ำหรืออัลกอริทึมการลงทะเบียนอื่น ๆ ที่นี่ แต่เพื่อจับคู่สัญญาณหนึ่งสัญญาณกับอีกสัญญาณหนึ่ง) เพื่อจับคู่รูปแบบคลื่นที่บันทึกไว้และตรวจจับการเปลี่ยนแปลงร่วมกันภายในช่วงเวลาหนึ่ง
Max Walczak

คำตอบ:


7

เพื่อขยายคำตอบของMüller

  1. ควรวางไมโครโฟนในหลอดแยกเพื่อปรับปรุงการแยกหรือไม่
  1. ไม่คุณกำลังพยายามระบุทิศทางของแหล่งที่มาการเพิ่มหลอดจะทำให้เสียงตีกลับภายในหลอดที่ไม่ต้องการเท่านั้น

    วิธีที่ดีที่สุดในการดำเนินการคือทำให้พวกเขาเผชิญหน้าโดยวิธีนี้พวกเขาทุกคนจะได้รับเสียงที่เหมือนกันและสิ่งเดียวที่เป็นเอกลักษณ์เกี่ยวกับพวกเขาคือตำแหน่งทางกายภาพของพวกเขาซึ่งจะส่งผลโดยตรงต่อระยะ คลื่นไซน์ 6 kHz มีความยาวคลื่น{} ดังนั้นหากคุณต้องการระบุขั้นตอนของคลื่นไซน์ที่ไม่ซ้ำกันสูงสุด 6 kHz ซึ่งเป็นความถี่ทั่วไปสำหรับการพูดคุยของมนุษย์คุณควรวางไมโครโฟนไว้ห่างกันมากที่สุด 5.71 มม. นี่คือหนึ่งรายการspeed of soundsound frequency=343 m/s6 kHz=5.71 mmที่มีเส้นผ่าศูนย์กลางน้อยกว่า 5.71 มม. อย่าลืมเพิ่มตัวกรองความถี่ต่ำผ่านความถี่ตัดที่ประมาณ 6-10 kHz

แก้ไข

ฉันรู้สึกว่าคำถาม # 2 นี้ดูสนุกฉันจึงตัดสินใจลองแก้ปัญหาด้วยตัวเอง

  1. สามารถคำนวณความสัมพันธ์ของเฟสระหว่าง 3 แหล่งพร้อมกันได้หรือไม่? (เช่นเพื่อเร่งการคำนวณ)

ถ้าคุณรู้ว่าพีชคณิตเชิงเส้นของคุณแล้วคุณสามารถจินตนาการว่าคุณได้วางไมโครโฟนในรูปสามเหลี่ยมที่แต่ละไมโครโฟนคือ 4 มมออกจากกันทำให้คนอื่น ๆ ภายในมุม6060°

ดังนั้นสมมติว่าพวกเขาอยู่ในการกำหนดค่านี้:

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

ฉันจะ...

  • ใช้ระบบการตั้งชื่อซึ่งเป็นเวกเตอร์ที่ชี้จากถึงAB¯AB
  • โทรกำเนิดของฉันA
  • เขียนตัวเลขทั้งหมดเป็นมม
  • ใช้คณิตศาสตร์ 3D แต่จบลงด้วยทิศทาง 2D
  • ตั้งตำแหน่งแนวตั้งของไมโครโฟนเป็นรูปคลื่นจริง ดังนั้นสมการเหล่านี้จะขึ้นอยู่กับเสียงคลื่นที่มีลักษณะคล้ายนี้
  • คำนวณครอสโปรดักท์ของไมโครโฟนเหล่านี้ตามตำแหน่งและรูปแบบของคลื่นแล้วละเว้นข้อมูลความสูงจากผลิตภัณฑ์ครอสนี้และใช้ arctan เพื่อหาทิศทางที่แท้จริงของแหล่งกำเนิด
  • โทรการส่งออกของไมโครโฟนที่ตำแหน่งโทรการส่งออกของไมโครโฟนที่ตำแหน่งโทรการส่งออกของไมโครโฟนที่ตำแหน่งaAbBcC

ดังนั้นสิ่งต่อไปนี้เป็นจริง:

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

สิ่งนี้ทำให้เรา:

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

และผลิตภัณฑ์ครอสคือAB¯×AC¯

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

ข้อมูล Z,เป็นเพียงขยะไม่มีดอกเบี้ยสำหรับเรา ในขณะที่สัญญาณอินพุตกำลังเปลี่ยนแปลง Cross vector จะแกว่งไปมาไปทางต้นทาง ดังนั้นครึ่งหนึ่งของเวลามันจะชี้ตรงไปยังแหล่งที่มา (ไม่สนใจการสะท้อนและปรสิตอื่น ๆ ) และอีกครึ่งหนึ่งของเวลามันจะชี้ 180 องศาห่างจากแหล่งที่มา83

สิ่งที่ฉันกำลังพูดถึงคือซึ่งสามารถทำให้เป็นจากนั้นเปลี่ยนเรเดียนเป็นองศาarctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

ดังนั้นสิ่งที่คุณจะได้คือสมการต่อไปนี้:

arctan(a++23(a-))180π


แต่ครึ่งหนึ่งของเวลาที่ข้อมูลผิดอย่างแท้จริง 100% ดังนั้น .. ควรจะทำอย่างไรให้ถูกต้อง 100% ของเวลา?

ทีนี้ถ้านำหน้าแหล่งที่มาจะไม่สามารถใกล้กับ B ได้a

พูดง่ายๆก็คือทำอะไรง่ายๆแบบนี้

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

และบางทีคุณอาจต้องการที่จะตอบสนองถ้าแหล่งกำเนิดเสียงมาจากมุมในแนวตั้งเฉพาะหากผู้คนพูดคุยเหนือไมโครโฟน => 0 phase change => ไม่ทำอะไรเลย ผู้คนกำลังพูดคุยในแนวนอนถัดจากมัน => การเปลี่ยนเฟสบางอย่าง => ตอบสนอง

|P|=Px2+PY2=3(a-)2+(a++2)2

ดังนั้นคุณอาจต้องการตั้งค่าขีด จำกัด นั้นให้อยู่ในระดับต่ำเช่น 0.1 หรือ 0.01 ฉันไม่แน่ใจทั้งหมดขึ้นอยู่กับปริมาณและความถี่และปรสิตทดสอบด้วยตัวเอง

อีกเหตุผลหนึ่งที่เมื่อใช้สมการค่าสัมบูรณ์สำหรับการข้ามศูนย์อาจมีช่วงเวลาเล็กน้อยเมื่อทิศทางจะชี้ไปในทิศทางที่ผิด แม้ว่ามันจะเป็นเพียง 1% ของเวลาถ้าเป็นเช่นนั้น ดังนั้นคุณอาจต้องการแนบตัวกรอง LP อันดับแรกไปยังทิศทาง

true_true_direction = true_true_direction*0.9+source_direction*0.1;

และถ้าคุณต้องการที่จะตอบสนองกับระดับเสียงที่เฉพาะเจาะจงเพียงรวมไมโครโฟน 3 ตัวเข้าด้วยกันแล้วเปรียบเทียบกับค่าทริกเกอร์ ค่าเฉลี่ยของไมโครโฟนจะเป็นผลรวมของพวกเขาหารด้วย 3 แต่คุณไม่จำเป็นต้องหารด้วย 3 หากคุณเพิ่มค่าทริกเกอร์ด้วยปัจจัย 3


ฉันมีปัญหาเกี่ยวกับการทำเครื่องหมายรหัสเป็น C / C # / C ++ หรือ JS หรืออื่น ๆ ดังนั้นน่าเสียดายที่รหัสจะเป็นสีดำบนพื้นขาวกับความต้องการของฉัน โอ้ขอให้โชคดีในการเสี่ยงของคุณ ฟังดูน่าสนุก.

นอกจากนี้ยังมีโอกาส 50/50 ที่ทิศทางจะอยู่ห่างจากแหล่งกำเนิด 180% ของเวลา ฉันเป็นอาจารย์ที่ทำผิดพลาด การแก้ไขสำหรับสิ่งนี้แม้ว่าจะเป็นการกลับคำสั่ง if สำหรับเวลาที่ควรเพิ่ม 180 องศา


ฉันสงสัยว่าเฟสนั้นจำเป็นจริง ๆ หรือไม่หรือหากไมค์แต่ละตัวสามารถมองหาคุณสมบัติที่ระบุตัวตนได้ ถ้าไมค์ทุกคนได้ยิน "เฮ้หุ่นยนต์" พวกเขาจะไม่เข้าแถวโจมตี "บาห์" เสียงและไม่สนใจเฟสใช่ไหม จากนั้นคุณไม่จำเป็นต้องวางไมโครโฟนให้ชิดกัน ...
ผู้เยี่ยมชม

1
@HarrySvensson ฉันเห็นสิ่งที่คุณหมายถึง ฉันคิดว่าคุณสามารถใช้วิธีการของคุณยกเว้น ,และจะเป็นจำนวนมิลลิวินาทีนับตั้งแต่ไมค์แรกได้ยินเสียง ฉันเล่นกับมันที่นี่แต่มันไม่ได้เรียงแถวกันอย่างสมบูรณ์เมื่อแหล่งที่มาไมค์และศูนย์กลางของหุ่นยนต์ไม่ได้อยู่ในแถวเดียวกัน ฉันคิดว่ามันอาจจะ "โอเค" ลองดูสิ ข้อผิดพลาดไม่เลวเมื่อแหล่งอยู่ไกลจากไมโครโฟน ฉันแน่ใจว่ามันสามารถแก้ไขได้ แต่คณิตศาสตร์หนีฉันไป a
ผู้เยี่ยมชม

1
ไม่แน่ใจว่าฉันเคยเห็นโค้ดไฮไลต์ทำงานที่นี่ใน SE.DSP หรือไม่ ให้ฉันตรวจสอบกับ Teacher Lounge และดูสิ่งที่พวกเขาพูด ดูเหมือนว่ามีคนถาม Meta เมื่อไม่นานมานี้ แต่ไม่ได้ดำเนินการใด ๆ : dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
โปรดไปและโหวตโพสต์นั้นบน Meta.DSP ฉันได้เพิ่มแท็ก <kbd> คุณสมบัติ - คำขอ </kbd> ซึ่งอย่างน้อยควรเห็นการมีส่วนร่วม แต่เราต้องการคะแนนเสียง หากเว็บไซต์ Chemistry.SE เปิดใช้งานเราควรจะแน่นอน! :-) dsp.meta.stackexchange.com/questions/133/…
Peter K.

1
@endolith คุณถูกต้องฉันได้ลบส่วนนั้นแล้ว ขอบคุณ.
Harry Svensson

4
  1. ใช่มันให้ความรู้สึกสมเหตุสมผลและเป็นเรื่องปกติ
  2. คุณสามารถใช้สัญญาณไมโครโฟนสามตัวพร้อมกันได้ (ไม่ต้อง "อ้อม" ผ่านความสัมพันธ์สามคู่ของคุณ) มองหา "MUSIC" และ "ESPRIT" ในแอปพลิเคชันทิศทางที่ไปถึง
  3. มีโอกาสมากที่จะเป็น คุณไม่ได้เล็งไปที่คุณภาพเสียงที่สูงคุณกำลังเล็งไปที่คุณสมบัติความสัมพันธ์ของคอร์สที่ดีและไม่กี่บิตที่นี่และอาจจะไม่สร้างหรือทำลายระบบ อัตราการสุ่มตัวอย่างที่สูงขึ้นเช่น 44.1 kHz หรือ 48 kHz ที่พบบ่อยมากจะทำให้ความแม่นยำเชิงมุมเพิ่มขึ้นเป็นสองเท่าในทันทีโดยมีความยาวเท่ากัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.