मैं कुछ इसी तरह की तलाश कर रहा था और यहां एक गूंगा जवाब लिखा था जो हटा दिया गया था। मेरे पास कुछ विचार थे लेकिन वास्तव में उन्हें सही ढंग से नहीं लिखा था। विलोपन ने मुझे दिया कि इंटरनेट ने अहंकार को गर्व किया है इसलिए मैंने समस्या का प्रयास करने का फैसला किया और मुझे लगता है कि यह काम करता है!
वास्तव में एक वास्तविक एडम डेविस का जवाब ढूंढने की कोशिश कर रहा है, यह बहुत मुश्किल है लेकिन मानव शैली का स्थान कर रहा है (पहले स्रोत को देखकर, ईकोस को अनदेखा कर रहा है, या स्रोतों के रूप में उनका इलाज कर रहा है) बहुत बुरा नहीं है, मुझे लगता है, हालांकि मैं किसी भी माध्यम से सिग्नल प्रोसेसिंग विशेषज्ञ नहीं हूं।
मैंने 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 समारोह का उपयोग कर सकते पाया]
मेरा अनुमान है कि आप एक असतत [पार से संबंध] क्या करना चाहते हैं (http://en.wikipedia.org/wiki/Cross- सहसंबंध) दो चैनलों के बीच। –
@ हॉटिक्स: यह आपको बहुत कुछ नहीं बताता है। बाएं और दाएं माइक के बीच सापेक्ष विलंब को जानना केवल एलीपसॉइड की सतह पर स्थान को संक्षिप्त करता है। –
बीबीएन लाखों डॉलर एक प्रणाली बेचने बनाता है जो ऐसा करता है। वे यह नहीं बता रहे हैं कि, या अगर वे हैं तो उन्होंने पेटेंट किया है। – bmargulies