2011-12-29 113 views
6

Tôi đã tò mò về điều này một thời gian vì vậy tôi nghĩ có thể đăng bài ở đây tôi có thể nhận được một số câu trả lời hay.Viết phần mềm để biết âm thanh phát ra từ đâu (nghe theo hướng)

Những gì tôi biết cho đến nay:

Con người có thể sử dụng hai tai của họ để có được không chỉ những gì nghe có vẻ "âm thanh như" nhưng cũng là nơi họ đang đến từ đâu. Pitch là lưu ý chúng ta nghe, và cái gì đó như tiếng nói của con người có nốt khác nhau chồng

Những gì tôi muốn biết (không phải là một giai điệu tinh khiết .):

Làm thế nào để đi về việc viết một chương trình có thể biết âm thanh đến từ đâu? Từ quan điểm lý thuyết, tôi cần hai micrô, sau đó tôi sẽ ghi lại dữ liệu âm thanh đến micrô và lưu trữ dữ liệu âm thanh sao cho dữ liệu âm thanh được chia nhỏ thành hai phần như [streamA, streamB].

Tôi cảm thấy có thể có cách tính toán/công thức để tính toán dựa trên âm thanh phát ra âm thanh. Tôi cũng cảm thấy như có thể lấy dữ liệu luồng và đào tạo người học (cung cấp cho nó âm thanh mẫu và cho biết âm thanh đến từ đâu) và có phân loại âm thanh đến theo cách đó hay không.

Cách tốt nhất để thực hiện việc này là gì? Có tài nguyên nào tốt để tôi có thể tìm hiểu thêm về chủ đề này không?

EDIT:

Ví dụ:

  front 

trái (mic) x ======== x (mic) đúng

  back 

          x (sound source should return "back" or "right" or "back right") 

Tôi muốn để viết một chương trình có thể trả về trước/sau trái/phải cho hầu hết âm thanh mà nó nghe thấy. Từ những gì tôi hiểu nó nên được đơn giản để thiết lập hai micro chỉ "về phía trước." Dựa trên đó tôi đang cố gắng tìm ra cách chúng ta có thể triangulate âm thanh và biết nơi liên quan đến các mics nguồn là.

+0

Tôi đoán bạn muốn làm một rời rạc [tương quan chéo] (http://en.wikipedia.org/wiki/Cross-correlation) giữa hai kênh. –

+0

@HotLicks: Điều đó không cho bạn biết nhiều. Biết được độ trễ tương đối giữa micrô trái và phải chỉ thu hẹp vị trí xuống bề mặt của một ellipsoid. –

+0

BBN làm cho hàng triệu đô la bán một hệ thống thực hiện điều này. Họ không nói làm thế nào, hoặc nếu họ là họ đã cấp bằng sáng chế nó. – bmargulies

Trả lời

5

Nếu bạn nhìn vào tài liệu nghiên cứu trên các mảng micrô đa pha, đặc biệt là các mảng được sử dụng để tìm kiếm hướng dưới nước (nghĩa là một khu vực nghiên cứu tàu ngầm lớn trong chiến tranh lạnh - âm thanh của động cơ đến từ đâu o chúng ta có thể nhắm đến ngư lôi?) thì bạn sẽ tìm thấy công nghệ và toán học cần thiết để tìm vị trí của âm thanh cho hai hoặc nhiều đầu vào micrô.

Nó không tầm thường, và không phải thứ gì đó có thể được thảo luận rộng rãi ở đây, vì vậy bạn sẽ không tìm thấy đoạn mã và/hoặc thư viện dễ dàng để làm những gì bạn cần.

Vấn đề chính là loại bỏ tiếng vang và bóng tối. Một phương pháp đơn giản sẽ là bắt đầu bằng một âm đơn, lọc ra mọi thứ trừ âm điệu đó, sau đó đo sự khác biệt pha giữa hai micrô của giai điệu đó. Sự khác biệt giai đoạn sẽ cung cấp cho bạn rất nhiều thông tin về vị trí của giai điệu.

Sau đó, bạn có thể chọn xem bạn có muốn xử lý các vấn đề về âm thanh và đa âm hay không (nhiều trong số đó có thể được loại bỏ bằng cách loại bỏ tất cả trừ âm mạnh nhất) hoặc di chuyển lên âm tương quan. nói chuyện, hoặc một phá vỡ kính, ví dụ. Bắt đầu nhỏ và dễ dàng, và mở rộng từ đó.

+0

cảm ơn adam, đây là những gì tôi đang tìm kiếm. chủ đề này thực sự thú vị. hm – Sam

2

Đây là một vấn đề thú vị. Tôi không biết bất kỳ tài liệu tham khảo nào cho điều này, nhưng tôi có một số kinh nghiệm về phần mềm âm thanh và xử lý tín hiệu có thể giúp chỉ cho bạn đúng hướng.

Xác định hướng nguồn âm thanh (nơi âm thanh phát ra từ xung quanh bạn) là khá đơn giản. Nhận 6 micrô định hướng và hướng chúng lên, xuống, trước, sau, trái và phải. Bằng cách nhìn vào biên độ tương đối của các tín hiệu mic để đáp ứng với âm thanh, bạn có thể dễ dàng xác định hướng mà âm thanh cụ thể đến từ đó. Tăng số lượng micrô để tăng độ phân giải.

2 micrô sẽ chỉ cho bạn biết âm thanh phát ra từ phải hay trái. Lý do khiến 2 tai của bạn có thể tìm ra âm thanh phát ra từ phía trước hay phía sau bạn, bởi vì cấu trúc bên ngoài của tai bạn thay đổi âm thanh tùy theo hướng mà bộ não của bạn thông dịch và sau đó chỉnh sửa.

+1

Khi bạn bị mất thính giác ở một bên tai, bạn sẽ mất khả năng chỉ dẫn - cấu trúc bên ngoài của tai giúp, nhưng cả hai tai đều được yêu cầu - http://hearinglosshelp.com/weblog/single-sided-deafness-and-directional -hearing-tricks.php. Não của bạn thực hiện tương quan khá phức tạp và thời gian giữa hai tai để xác định hướng. –

+0

Câu trả lời này có một chút gây hiểu lầm. Với việc sử dụng các kỹ thuật hai tai thích hợp, 2 micrô có thể cung cấp cho bạn ước tính vị trí trong mặt phẳng 2D (góc phương vị), không chỉ trên một đường thẳng (trái sang phải). Xem http://sdac.kaist.ac.kr/upload/paper/ICCAS_2007_Hwang.pdf và các giấy tờ khác.Gần đây hơn, nó đã được chứng minh rằng ước tính độ cao cũng có thể đạt được jp.honda-ri.com/upload/document/entry/20110911/…. Độ chính xác có thể được cải thiện nếu một số giả định có thể được thực hiện về nguồn, ví dụ: ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5443663. –

+2

Nó có thể có một chút giới hạn về phạm vi, nhưng tôi sẽ không gọi nó là gây hiểu nhầm. Mặc dù liên kết thứ hai của bạn không hoạt động và liên kết thứ 3 của bạn yêu cầu tư cách thành viên, liên kết đầu tiên thảo luận về các thử nghiệm liên quan đến cấu trúc của tai ngoài, mà tôi đã thảo luận trong phần cuối cùng của câu trả lời. Tuy nhiên, OP đã yêu cầu chủ yếu về phương pháp 'tính toán công thức/cách tính toán' vị trí. Mô phỏng hành vi của tai ngoài sẽ yêu cầu phần cứng chuyên dụng. – Blake

2

Tương quan chéo là phương pháp chính nhưng có một số chi tiết cụ thể.Có nhiều cách tiếp cận khác nhau giúp phát hiện nguồn với mảng micrô hiệu quả. Một số cũng hoạt động mà không cần hiệu chuẩn, một số yêu cầu hiệu chuẩn để thích ứng với hình học phòng.

Bạn có thể thử phần mềm mã nguồn mở hiện có cho công việc nội địa hóa nguồn

Manyears tách nguồn âm thanh robot và nội địa hóa https://sourceforge.net/projects/manyears/

toolkit Hark cho các ứng dụng robot http://www.ros.org/wiki/hark

+0

cảm ơn:] Tôi sẽ xem xét – Sam

3

Tôi đang tìm kiếm một cái gì đó tương tự và đã viết một câu trả lời ngu ngốc ở đây đã bị xóa. Tôi đã có một số ý tưởng nhưng không thực sự viết chúng đúng cách. Việc xóa đã cho tôi niềm tự hào về bản ngã thâm nhập vào internet nên tôi quyết định thử nghiệm vấn đề và tôi nghĩ nó đã hoạt động!

Thực sự cố gắng tìm một câu trả lời thực sự của một vị vua Adam Davis là rất khó nhưng làm một vị trí kiểu người (nhìn vào nguồn đầu tiên, bỏ qua tiếng vang, hoặc coi chúng là nguồn) không quá tệ, tôi nghĩ, mặc dù tôi không phải là chuyên gia xử lý tín hiệu bằng bất kỳ phương tiện nào.

Tôi đọc thisthis. Điều này khiến tôi nhận ra rằng vấn đề thực sự là một trong những phát hiện sự thay đổi thời gian (tương quan chéo) giữa hai tín hiệu. Từ đó bạn sẽ tính toán góc sử dụng tốc độ âm thanh. Lưu ý bạn sẽ nhận được hai giải pháp (trước và sau).

Thông tin quan trọng mà tôi đã đọc nằm trong số this answer và các thông tin khác trên cùng một trang nói về cách thực hiện chuyển đổi nhanh chóng trong scipy, để tìm đường cong tương quan chéo.

Về cơ bản, bạn cần phải nhập tệp sóng vào python. Xem this.

Nếu tệp sóng (đầu vào) của bạn là một bộ dữ liệu với hai mảng numpy (trái, phải), không đệm ít nhất là chính nó (để dừng nó theo chiều thẳng đứng rõ ràng) mã theo sau câu trả lời của Gustavo. Tôi nghĩ rằng bạn cần phải nhận ra rằng ffts làm cho giả định về thời gian bất biến, có nghĩa là nếu bạn muốn nhận bất kỳ loại theo dõi dựa trên thời gian của các tín hiệu bạn cần phải 'cắn' các mẫu dữ liệu nhỏ.

Tôi đã đưa mã sau đây lại với nhau từ các nguồn được đề cập.Nó sẽ tạo ra một biểu đồ hiển thị thời gian trễ ước tính, theo khung, từ trái sang phải (âm/dương). Để chuyển đổi thành thời gian thực, chia cho tỷ lệ mẫu. Nếu bạn muốn biết những gì góc là bạn cần phải:

  • giả mọi thứ đều trên mặt phẳng (không có yếu tố chiều cao)
  • quên sự khác biệt giữa âm thanh ở phía trước và những người đằng sau (bạn không thể phân biệt)

Bạn cũng muốn sử dụng khoảng cách giữa hai micrô để đảm bảo bạn không nhận được tín hiệu lặp lại (thời gian trễ lớn hơn thời gian trễ 90 độ).

Tôi nhận ra rằng tôi đã vay rất nhiều ở đây, vì vậy cảm ơn tất cả những người vô tình đã đóng góp!

import wave 
import struct 
from numpy import array, concatenate, argmax 
from numpy import abs as nabs 
from scipy.signal import fftconvolve 
from matplotlib.pyplot import plot, show 
from math import log 

def crossco(wav): 
    """Returns cross correlation function of the left and right audio. It 
    uses a convolution of left with the right reversed which is the 
    equivalent of a cross-correlation. 
    """ 
    cor = nabs(fftconvolve(wav[0],wav[1][::-1])) 
    return cor 

def trackTD(fname, width, chunksize=5000): 
    track = [] 
    #opens the wave file using pythons built-in wave library 
    wav = wave.open(fname, 'r') 
    #get the info from the file, this is kind of ugly and non-PEPish 
    (nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams() 

    #only loop while you have enough whole chunks left in the wave 
    while wav.tell() < int(nframes/nchannels)-chunksize: 

     #read the audio frames as asequence of bytes 
     frames = wav.readframes(int(chunksize)*nchannels) 

     #construct a list out of that sequence 
     out = struct.unpack_from("%dh" % (chunksize * nchannels), frames) 

     # Convert 2 channels to numpy arrays 
     if nchannels == 2: 
      #the left channel is the 0th and even numbered elements 
      left = array (list (out[0::2])) 
      #the right is all the odd elements 
      right = array (list (out[1::2])) 
     else: 
      left = array (out) 
      right = left 

     #zero pad each channel with zeroes as long as the source 
     left = concatenate((left,[0]*chunksize)) 
     right = concatenate((right,[0]*chunksize)) 

     chunk = (left, right) 

     #if the volume is very low (800 or less), assume 0 degrees 
     if abs(max(left)) < 800 : 
      a = 0.0 
     else: 
      #otherwise computing how many frames delay there are in this chunk 
      cor = argmax(crossco(chunk)) - chunksize*2 
      #calculate the time 
      t = cor/framerate 
      #get the distance assuming v = 340m/s sina=(t*v)/width 
      sina = t*340/width 
      a = asin(sina) * 180/(3.14159) 



     #add the last angle delay value to a list 
     track.append(a) 


    #plot the list 
    plot(track) 
    show() 

Tôi đã thử sử dụng một số âm thanh nổi mà tôi tìm thấy tại equilogy. Tôi đã sử dụng mẫu xe (tệp âm thanh nổi). Nó sản xuất this.

Để thực hiện việc này, tôi đoán bạn cần có nguồn âm thanh nổi đến mà bạn có thể 'nghe' trong một thời gian ngắn (tôi đã sử dụng 1000 khung = 0.0208s) và sau đó tính và lặp lại .

[sửa: tìm thấy bạn có thể dễ dàng sử dụng các chức năng FFT dây leo, bằng cách sử dụng chuỗi thời gian đảo ngược của một trong hai để tạo ra một mối tương quan]

Các vấn đề liên quan