Phát hiện hướng âm thanh bằng cách sử dụng một số micrô


9

Trước hết, tôi đã thấy một chủ đề tương tự, tuy nhiên nó hơi khác với những gì tôi đang cố gắng đạt được. Tôi đang chế tạo một con robot sẽ theo người gọi nó. Ý tưởng của tôi là sử dụng 3 hoặc 4 micrô - tức là theo cách sắp xếp sau đây để xác định hướng mà robot được gọi từ hướng nào:

nhập mô tả hình ảnh ở đây

Trong đó S là nguồn, A, B và C là micro. Ý tưởng là tính toán tương quan pha của các tín hiệu được ghi từ các cặp AB, AC, BC và dựa trên đó xây dựng một vectơ sẽ chỉ vào nguồn bằng cách sử dụng một loại tam giác. Hệ thống thậm chí không phải hoạt động trong thời gian thực vì nó sẽ được kích hoạt bằng giọng nói - tín hiệu từ tất cả các micrô sẽ được ghi đồng thời, giọng nói sẽ được lấy mẫu từ chỉ một micrô và nếu phù hợp với chữ ký giọng nói, tương quan pha sẽ được tính từ phần cuối cùng của giây để tính hướng. Tôi biết rằng điều này có thể không hoạt động tốt, tức là khi robot được gọi từ phòng khác hoặc khi có nhiều phản xạ.

Đây chỉ là một ý tưởng tôi có, nhưng tôi chưa bao giờ thử bất cứ điều gì như thế này và tôi có một số câu hỏi trước khi tôi xây dựng phần cứng thực tế sẽ thực hiện công việc:

  1. Đây có phải là một cách điển hình để làm điều này? (tức là được sử dụng trong điện thoại để khử tiếng ồn?) Các phương pháp khả thi khác là gì?
  2. Có thể tính tương quan pha giữa 3 nguồn đồng thời bằng cách nào đó? (tức là để tăng tốc tính toán)
  3. Tốc độ mẫu 22khz và độ sâu 12 bit có đủ cho hệ thống này không? Tôi đặc biệt quan tâm đến độ sâu bit.
  4. Có nên đặt micrô trong các ống riêng biệt để cải thiện sự phân tách?

1
Đây là một bài viết thú vị , có thể bạn đã xem nó. Có vẻ như tác giả cuối cùng đã đặt mic thứ tư lên trên 3 cái còn lại để đối phó với nguồn âm thanh nằm trên mảng. Ngoài ra, nó trông khá giống với kế hoạch của bạn (ít nhất là với mắt chưa được huấn luyện của tôi).
Khách

Thuật ngữ chung cho phần tương quan pha là Beamforming. Một hệ thống định dạng chùm phổ biến sử dụng một dãy micrô tuyến tính và tôi không chắc trường "tầm nhìn" cho micrô của bạn sẽ thực sự cho phép tạo ra nhiều hình tam giác.
pscheidler

Về phép tam giác, tôi đoán bạn có thể thiết lập hai hoặc ba mảng cách nhau một khoảng cách và tìm giao điểm của các chùm tia. Có thể giải quyết trường hợp thoái hóa 2 chùm tia bằng "hey robot ..." (robot quay mặt về phía bạn) ... "đến đây!"
Khách

Trên thực tế, điều đó có thể hoạt động bằng cách thêm một mic. Hãy xem điều này , đó là một biến thể của giải pháp của Harry. Tam giác đều trở thành một tam giác vuông và thêm một mic nữa để tạo thành một tam giác khác. Từ mỗi tam giác, chúng ta đúc một chùm tia, và lấy trung bình của hai chùm tia đó để có được một vectơ chỉ hướng chính xác. Chú ý hai "mắt" trong bản demo. Chúng được đặt sao cho các chùm tia chạy qua chúng sẽ định vị vị trí khi nguồn trực tiếp ở phía trước hoặc phía sau robot. Hãy thử với nguồn tại bất kỳ y = 0.
Khách

1
@FilipePinto bạn đã đọc kỹ câu trả lời và mô tả vấn đề chưa? Nó thực sự không hoạt động như vậy vì bạn không thể biết mỗi đỉnh năng lượng từ mỗi micrô tương quan với các micrô khác như thế nào - đó là lý do tại sao bạn cần tương quan pha, điểm gần nhất lặp lại hoặc một số thuật toán đăng ký khác (đăng ký không đề cập đến ghi âm ở đây, nhưng để khớp một tín hiệu với tín hiệu khác) để khớp với các dạng sóng đã ghi và phát hiện sự dịch chuyển lẫn nhau của chúng trong một số cửa sổ thời gian
Max Walczak

Câu trả lời:


7

Để mở rộng câu trả lời của Müller,

  1. Có nên đặt micrô trong các ống riêng biệt để cải thiện sự phân tách?


  1. speed of soundsound frequency=343 m/s6 kHz=5.71 mm

Biên tập

Tôi cảm thấy câu hỏi số 2 này có vẻ vui nên tôi quyết định tự mình giải quyết.

  1. Có thể tính tương quan pha giữa 3 nguồn đồng thời bằng cách nào đó? (tức là để tăng tốc tính toán)

Nếu bạn biết đại số tuyến tính của mình, thì bạn có thể tưởng tượng rằng bạn đã đặt micrô trong một hình tam giác trong đó mỗi micrô cách nhau 4 mm, tạo ra mỗi góc bên trong .60°

Vì vậy, hãy giả sử rằng họ đang ở trong cấu hình này:

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

Tôi sẽ...

  • sử dụng danh pháp là một vectơ chỉ từ đếnAB¯AB
  • gọi nguồn gốc của tôiA
  • viết tất cả các số bằng mm
  • sử dụng toán 3D nhưng kết thúc bằng hướng 2D
  • đặt vị trí thẳng đứng của micrô thành dạng sóng thực tế của chúng. Vì vậy, các phương trình này dựa trên một sóng âm thanh trông giống như thế này .
  • Tính toán sản phẩm chéo của các micrô này dựa trên vị trí và dạng sóng của chúng, sau đó bỏ qua thông tin chiều cao từ sản phẩm chéo này và sử dụng arctan để đưa ra hướng thực tế của nguồn.
  • gọi đầu ra của micro ở vị trí , gọi đầu ra của micro ở vị trí , gọi đầu ra của micro ở vị tríaAbBcC

Vì vậy, những điều sau đây là đúng:

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

Điều này cho chúng ta:

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

Và sản phẩm chéo chỉ đơn giản làAB¯×AC¯

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

Thông tin Z, chỉ là rác, không quan tâm đến chúng tôi. Khi các tín hiệu đầu vào đang thay đổi, vectơ chéo sẽ xoay qua lại về phía nguồn. Vì vậy, một nửa thời gian nó sẽ chỉ thẳng vào nguồn (bỏ qua các phản xạ và ký sinh trùng khác). Và nửa còn lại của thời gian nó sẽ chỉ cách nguồn 180 độ.83

Điều tôi đang nói đến là có thể được đơn giản hóa thành , và sau đó biến radian thành độ.arctan(2a2b4c23(ba))arctan(a+b+2c3(ab))

Vì vậy, những gì bạn kết thúc là phương trình sau đây:

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


Nhưng một nửa thời gian thông tin đúng là sai 100%, vậy làm thế nào .. một người .... nên làm cho đúng 100% thời gian?

Chà, nếu đang dẫn đầu , thì nguồn không thể gần hơn với B.ab

Nói cách khác, chỉ cần làm một cái gì đó đơn giản như thế này:

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

Và có lẽ bạn chỉ muốn phản ứng nếu nguồn âm thanh phát ra từ một góc thẳng đứng cụ thể, nếu mọi người nói chuyện trên micro => 0 pha thay đổi => không làm gì cả. Mọi người nói chuyện theo chiều ngang bên cạnh nó => một số thay đổi pha => phản ứng.

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

Vì vậy, bạn có thể muốn đặt ngưỡng đó ở mức thấp, như 0,1 hoặc 0,01. Tôi không hoàn toàn chắc chắn, phụ thuộc vào âm lượng và tần suất và ký sinh trùng, hãy tự kiểm tra nó.

Một lý do khác cho việc khi nào sử dụng phương trình giá trị tuyệt đối là cho các giao điểm bằng 0, có thể có một khoảnh khắc nhỏ khi hướng sẽ chỉ sai hướng. Mặc dù nó sẽ chỉ dành cho 1% thời gian, thậm chí nếu vậy. Vì vậy, bạn có thể muốn đính kèm bộ lọc LP thứ tự đầu tiên theo hướng.

true_true_direction = true_true_direction*0.9+source_direction*0.1;

Và nếu bạn muốn phản ứng với một âm lượng cụ thể, thì chỉ cần tổng hợp 3 micrô lại với nhau và so sánh với một số giá trị kích hoạt. Giá trị trung bình của micrô sẽ là tổng của chúng chia cho 3, nhưng bạn không cần chia cho 3 nếu bạn tăng giá trị kích hoạt theo hệ số 3.


Tôi gặp vấn đề với việc đánh dấu mã là C / C # / C ++ hoặc JS hoặc bất kỳ mã nào khác, thật đáng buồn là mã sẽ có màu đen trắng, trái với mong muốn của tôi. Oh tốt, chúc may mắn trong liên doanh của bạn. Nghe có vẻ vui.

Ngoài ra, có một cơ hội 50/50 rằng hướng đi sẽ cách xa nguồn 99%. Tôi là một bậc thầy trong việc phạm sai lầm như vậy. Một điều chỉnh cho điều này mặc dù sẽ chỉ là đảo ngược các câu lệnh if khi cần thêm 180 độ.


Tôi tự hỏi nếu điều pha là thực sự cần thiết, hoặc nếu mỗi mic chỉ có thể tìm kiếm một số tính năng nhận dạng. Nếu tất cả các mics nghe thấy "hey robot" thì họ không thể xếp hàng bắt đầu giai đoạn "bah" đó và bỏ qua giai đoạn? Sau đó, bạn không cần phải đặt các micrô thật gần nhau ...
Khách

1
@HarrySvensson, tôi hiểu ý của bạn. Tôi đã nghĩ rằng bạn có thể sử dụng một cái gì đó giống như cách tiếp cận của bạn, ngoại trừ , và sẽ là một số mili giây kể từ khi mic đầu tiên nghe thấy âm thanh. Tôi đã chơi xung quanh nó ở đây , nhưng nó không xếp hàng hoàn hảo khi nguồn, mic và trung tâm của robot không nằm trong một hàng. Tôi nghĩ rằng nó có thể là "được" mặc dù, hãy kiểm tra nó. Lỗi không phải là xấu khi nguồn ở xa mics. Tôi chắc chắn rằng nó có thể được sửa chữa, nhưng toán học thoát khỏi tôi. abc
Khách

1
Không chắc chắn tôi đã từng thấy mã tô sáng làm việc ở đây trên SE.DSP. Hãy để tôi kiểm tra Phòng chờ của Giáo viên và xem họ nói gì. Có vẻ như ai đó đã hỏi trên Meta một thời gian trước, nhưng không có hành động nào được thực hiện: dsp.meta.stackexchange.com/questions/133/ trộm
Peter K.

1
Vui lòng đi và upvote bài đăng đó trên Meta.DSP. Tôi đã thêm thẻ <kbd> tính năng yêu cầu </ kbd> ít nhất sẽ thấy một số tương tác, nhưng chúng tôi cần phiếu bầu. Nếu trang web Chemistry.SE đã kích hoạt, chúng tôi chắc chắn nên! :-) dsp.meta.stackexchange.com/questions/133/ trộm
Peter K.

1
@endolith Bạn đã đúng, giờ tôi đã xóa phần đó. Cảm ơn bạn.
Harry Svensson

4
  1. Vâng, điều này cảm thấy hợp lý và điển hình.
  2. Bạn cũng có thể sử dụng ba tín hiệu micrô cùng một lúc (không đi "đường vòng" qua ba tương quan cặp của bạn). Tìm kiếm "NHẠC" và "ĐẶC BIỆT" trong các ứng dụng hướng đến.
  3. Rất có khả năng là như vậy. Bạn không nhắm đến chất lượng âm thanh cao, bạn đang nhắm đến các thuộc tính tương quan tốt, và một vài bit ở đây và có thể sẽ không tạo ra hoặc phá vỡ hệ thống. Tốc độ lấy mẫu cao hơn như 44,1 kHz hoặc 48 kHz rất phổ biến, mặt khác, sẽ ngay lập tức tăng gấp đôi độ chính xác của góc, rất có thể, trên cùng một chiều dài quan sát.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.