2011-12-29 24 views
6

मैं इस बारे में कुछ समय से उत्सुक हूं इसलिए मैंने सोचा कि शायद यहां पोस्ट करना मुझे कुछ अच्छे जवाब मिल सकते हैं।यह कहने के लिए सॉफ़्टवेयर लिख रहा है कि ध्वनि कहां से आती है (दिशात्मक सुनवाई)

मैं अब तक क्या जानते हैं:

मनुष्य न केवल क्या लगता है पाने के लिए उनके दो कान का उपयोग कर सकते "की तरह ध्वनि" लेकिन यह भी कि वे कहाँ से आ रहे हैं। पिच टिप्पणी हम सुनते है, और कुछ मानव आवाज की तरह आच्छादित विभिन्न पिचों है

मैं चाहता क्या पता करने के लिए नहीं है (एक शुद्ध स्वर।):

मैं कैसे जाना करते हैं एक प्रोग्राम लिखने के बारे में जो जान सकता है कि ध्वनि कहां से आ रही है? एक सैद्धांतिक दृष्टिकोण से मुझे दो माइक्रोफ़ोन की आवश्यकता होगी, फिर मैं माइक्रोफ़ोन में आने वाले ध्वनि डेटा रिकॉर्ड करूंगा और ऑडियो डेटा संग्रहीत करूंगा जैसे कि ऑडियो डेटा का एक अलग सेकेंड [स्ट्रीमए, स्ट्रीमबी] जैसे टुपल में रखा जा सकता है।

मुझे लगता है कि ऑडियो के आधार पर गणना करने के लिए एक सूत्र/गणितीय तरीका हो सकता है जहां ध्वनि आती है। मुझे यह भी लगता है कि स्ट्रीम डेटा लेना और एक शिक्षार्थी को प्रशिक्षित करना संभव है (इसे नमूना ऑडियो दें और बताएं कि ऑडियो कहां से आया था) और इसे इस तरह आने वाले ऑडियो को वर्गीकृत करना है।

ऐसा करने के बारे में जाने का सबसे अच्छा तरीका क्या है/क्या ऐसे अच्छे संसाधन हैं जिनसे मैं इस विषय के बारे में और जान सकता हूं?

संपादित करें:

उदाहरण:

  front 

बाएं (माइक) x ======== एक्स (माइक) सही

  back 

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

मैं चाहता हूँ एक ऐसा प्रोग्राम लिखने के लिए जो सुनवाई की अधिकांश ध्वनि के लिए आगे/पीछे बाएं/दाएं वापस लौटा सकता है। जो मैं समझता हूं उससे दो माइक्रोफ़ोन सेट अप करना आसान होना चाहिए "आगे"। उस पर आधारित मैं एक तरीका समझने की कोशिश कर रहा हूं कि हम ध्वनि को त्रिकोण कर सकते हैं और जान सकते हैं कि एमआईसीएस के संबंध में स्रोत कहां है।

+0

मेरा अनुमान है कि आप एक असतत [पार से संबंध] क्या करना चाहते हैं (http://en.wikipedia.org/wiki/Cross- सहसंबंध) दो चैनलों के बीच। –

+0

@ हॉटिक्स: यह आपको बहुत कुछ नहीं बताता है। बाएं और दाएं माइक के बीच सापेक्ष विलंब को जानना केवल एलीपसॉइड की सतह पर स्थान को संक्षिप्त करता है। –

+0

बीबीएन लाखों डॉलर एक प्रणाली बेचने बनाता है जो ऐसा करता है। वे यह नहीं बता रहे हैं कि, या अगर वे हैं तो उन्होंने पेटेंट किया है। – bmargulies

उत्तर

5

आप शोध पत्र पर गौर करते हैं बहु चरण माइक्रोफोन सरणी पर, विशेष रूप से उन लोगों के लिए जो पानी के नीचे की दिशा के लिए उपयोग किए जाते हैं (यानी, शीत युद्ध के दौरान पनडुब्बी अनुसंधान का एक बड़ा क्षेत्र - मोटर ध्वनि कहां से आ रही है ओ हम टारपीडो का लक्ष्य रख सकते हैं?) तो आपको दो या अधिक माइक्रोफोन इनपुट दिए गए ध्वनि के स्थान को ढूंढने के लिए आवश्यक तकनीक और गणित मिलेगा।

यह गैर-तुच्छ है, और कुछ ऐसा नहीं है जिस पर व्यापक रूप से चर्चा की जा सकती है, हालांकि, आपको जो भी चाहिए, उसे करने के लिए आपको एक आसान कोड स्निपेट और/या लाइब्रेरी नहीं मिल रही है।

मुख्य मुद्दा ईकोस और छाया को समाप्त कर रहा है। एक सरल तरीका एक एकल स्वर से शुरू करना होगा, उस स्वर को सब कुछ फ़िल्टर करना होगा, फिर उस स्वर के दो माइक्रोफ़ोन के बीच चरण अंतर को मापना होगा। चरण अंतर आपको स्वर के स्थान के बारे में बहुत सारी जानकारी देगा।

आप तब चुन सकते हैं कि आप ईको और मल्टीपाथ मुद्दों से निपटना चाहते हैं (जिनमें से कई को सबसे मजबूत टोन के अलावा हटाया जा सकता है) या एक स्वर के अलावा किसी अन्य चीज़ से संबंधित सहसंबंध वाली आवाज़ों पर ले जाया जा सकता है - एक व्यक्ति उदाहरण के लिए बात करना, या एक गिलास तोड़ना। छोटे और आसान शुरू करें, और वहां से विस्तार करें।

+0

धन्यवाद adam, यही वह है जिसे मैं ढूंढ रहा था। यह विषय वास्तव में दिलचस्प है। एचएम। – Sam

2

यह एक दिलचस्प समस्या है। मुझे इसके लिए किसी भी संदर्भ सामग्री के बारे में पता नहीं है, लेकिन मुझे ऑडियो सॉफ़्टवेयर और सिग्नल प्रोसेसिंग में कुछ अनुभव है जो आपको सही दिशा में इंगित करने में मदद कर सकता है।

ध्वनि स्रोत दिशा निर्धारित करना (जहां ध्वनि से के आसपास आ रही है) काफी सरल है। 6 दिशात्मक माइक्रोफ़ोन प्राप्त करें और उन्हें ऊपर, नीचे, सामने, पीछे, बाएं, और दाएं इंगित करें। ध्वनि के जवाब में माइक सिग्नल के सापेक्ष आयामों को देखकर, आप आसानी से यह निर्धारित कर सकते हैं कि एक विशेष ध्वनि किस दिशा से आ रही है। बढ़ी हुई संकल्प के लिए माइक्रोफोन की संख्या बढ़ाएं।

2 माइक्रोफ़ोन केवल आपको बताएंगे कि ध्वनि दाएं या बाएं से आ रही है या नहीं। आपके 2 कान यह पता लगा सकते हैं कि ध्वनि आपके सामने या पीछे से आ रही है, क्योंकि आपके कान की बाहरी संरचना दिशा के आधार पर ध्वनि को संशोधित करती है, जिसे आपका दिमाग व्याख्या करता है और फिर सुधारता है।

+1

जब आप एक कान में सुनवाई खो देते हैं, तो आप दिशा बताने की अपनी क्षमता खो देते हैं - कान की बाहरी संरचना में मदद मिलती है, लेकिन दोनों कानों की आवश्यकता होती है - http://hearinglosshelp.com/weblog/single-sided-deafness-and-directional -hearing-tricks.php। दिशा निर्धारित करने के लिए आपका दिमाग दो कानों के बीच बहुत जटिल सहसंबंध और समय का प्रदर्शन करता है। –

+0

यह उत्तर थोड़ा भ्रामक है। उपयुक्त बिनौरल तकनीकों के उपयोग के साथ, 2 माइक्रोफ़ोन आपको केवल 2 लाइन (बाएं-दाएं) पर, 2 डी प्लेन (एजीमुथ) में स्थान अनुमान दे सकते हैं। Http://sdac.kaist.ac.kr/upload/paper/ICCAS_2007_Hwang.pdf और अन्य कागजात देखें।हाल ही में यह दिखाया गया है कि एक ऊंचाई अनुमान भी प्राप्त किया जा सकता है jp.honda-ri.com/upload/document/entry/20110911/...। अगर स्रोत के बारे में कुछ धारणाएं की जा सकती हैं तो शुद्धता में सुधार किया जा सकता है, उदा। ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5443663। –

+2

यह दायरे में थोड़ा सीमित हो सकता है, लेकिन मैं इसे भ्रामक नहीं कहूंगा। जबकि आपका दूसरा लिंक काम नहीं करता है, और आपके तीसरे लिंक को सदस्यता की आवश्यकता होती है, पहला लिंक बाहरी कान की संरचना की नकल करने वाले प्रयोगों पर चर्चा करता है, जिसे मैंने उत्तर के अंतिम भाग में चर्चा की थी। हालांकि, ओपी मुख्य रूप से 'गणना करने के लिए सूत्र/गणितीय तरीके' की विधि के बारे में पूछ रहा था। बाहरी कान के व्यवहार को अनुकरण करने के लिए विशेष हार्डवेयर की आवश्यकता होगी। – Blake

2

क्रॉस-सहसंबंध एक मुख्य विधि है लेकिन इसमें कुछ विशिष्टताएं हैं।ऐसे कई दृष्टिकोण हैं जो माइक्रोफ़ोन सरणी के साथ स्रोत का पता लगाने में मदद करते हैं। कुछ अंशांकन के बिना भी काम करते हैं, कुछ कमरे ज्यामिति को अनुकूलित करने के लिए अंशांकन की आवश्यकता होती है।

आप स्रोत स्थानीयकरण कार्य के लिए मौजूदा खुला स्रोत सॉफ्टवेयर की कोशिश कर सकते

Manyears रोबोट ध्वनि स्रोत जुदाई और स्थानीयकरण https://sourceforge.net/projects/manyears/

सुनना रोबोटिक्स अनुप्रयोगों के लिए टूलकिट http://www.ros.org/wiki/hark

+0

धन्यवाद:] मैं एक नज़र डालेंगे – Sam

3

मैं कुछ इसी तरह की तलाश कर रहा था और यहां एक गूंगा जवाब लिखा था जो हटा दिया गया था। मेरे पास कुछ विचार थे लेकिन वास्तव में उन्हें सही ढंग से नहीं लिखा था। विलोपन ने मुझे दिया कि इंटरनेट ने अहंकार को गर्व किया है इसलिए मैंने समस्या का प्रयास करने का फैसला किया और मुझे लगता है कि यह काम करता है!

वास्तव में एक वास्तविक एडम डेविस का जवाब ढूंढने की कोशिश कर रहा है, यह बहुत मुश्किल है लेकिन मानव शैली का स्थान कर रहा है (पहले स्रोत को देखकर, ईकोस को अनदेखा कर रहा है, या स्रोतों के रूप में उनका इलाज कर रहा है) बहुत बुरा नहीं है, मुझे लगता है, हालांकि मैं किसी भी माध्यम से सिग्नल प्रोसेसिंग विशेषज्ञ नहीं हूं।

मैंने this और this पढ़ा। जिसने मुझे एहसास दिलाया कि समस्या वास्तव में दो संकेतों के बीच समय शिफ्ट (पार सहसंबंध) खोजने में से एक है। वहां से आप ध्वनि की गति का उपयोग करके कोण की गणना करेंगे। ध्यान दें कि आपको दो समाधान मिलेगा (सामने और पीछे)।

मैंने जो मुख्य जानकारी पढ़ी वह this answer और अन्य उसी पृष्ठ पर थी जो क्रॉस-सहसंबंध वक्र को खोजने के लिए तेजी से चारों ओर परिवर्तन करने के बारे में बात करती है।

असल में, आपको तरंग फ़ाइल को पायथन में आयात करने की आवश्यकता है। this देखें।

यदि आपकी तरंग फ़ाइल (इनपुट) दो numpy arrays (बाएं, दाएं) के साथ एक tuple है, कम से कम लंबे समय तक गद्देदार (इसे स्पष्ट रूप से संरेखित रूप से संरेखित करने के लिए) कोड गुस्तावो के उत्तर से आता है। मुझे लगता है कि आपको यह पहचानने की आवश्यकता है कि एफएफटी समय-आविष्कार की धारणा बनाते हैं, जिसका अर्थ है कि यदि आप संकेतों के किसी भी समय-आधारित ट्रैकिंग को प्राप्त करना चाहते हैं तो आपको डेटा के छोटे नमूने 'काटने' की आवश्यकता है।

मैंने निम्नलिखित कोडों को उल्लिखित स्रोतों से एक साथ लाया।यह अनुमानित समय देरी, फ्रेम में, बाएं से दाएं (नकारात्मक/सकारात्मक) दिखाते हुए एक ग्राफ उत्पन्न करेगा। वास्तविक समय में बदलने के लिए, नमूना दर से विभाजित करें। आप को पता है कि कोण है चाहते हैं तो आप की जरूरत है:

  • मान सब कुछ एक विमान पर है (कोई ऊंचाई कारक)
  • पीछे सामने ध्वनि के बीच का अंतर और उन भूलना (आप अंतर नहीं कर सकते हैं)

आप यह सुनिश्चित करने के लिए दो माइक्रोफ़ोन के बीच की दूरी का उपयोग करना चाहेंगे कि आपको ईकोस नहीं मिल रहा है (90 डिग्री देरी के लिए समय से अधिक देरी)।

मुझे लगता है कि मैं यहाँ उधार का एक बहुत ले लिया है, इसलिए उन सभी को धन्यवाद कि अनजाने में योगदान दिया!

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() 

मैं इस बाहर कुछ स्टीरियो ऑडियो मैं equilogy में पाया उपयोग करने की कोशिश। मैंने कार उदाहरण (स्टीरियो फ़ाइल) का इस्तेमाल किया। इसने this का उत्पादन किया।

यह ऑन-द-फ्लाई करने के लिए, मुझे लगता है कि आपको आने वाले स्टीरियो स्रोत की आवश्यकता होगी जिसे आप थोड़े समय के लिए 'सुन' सकते हैं (मैंने 1000 फ्रेम = 0.0208s का उपयोग किया) और फिर गणना और दोहराना ।

[संपादित करें: आप आसानी से एक संबंध बनाने के लिए दो में से एक के उल्टे समय श्रृंखला का उपयोग, fft convolve समारोह का उपयोग कर सकते पाया]