2010-12-13 15 views
8

जो मैं प्राप्त करने का प्रयास कर रहा हूं वह निम्न है: मुझे विश्लेषण के लिए ध्वनि फ़ाइल (.wav) की आवृत्ति मानों की आवश्यकता है। मुझे पता है कि बहुत से कार्यक्रम मूल्यों के दृश्य ग्राफ (स्पेक्ट्रोग्राम) देंगे लेकिन मुझे कच्चे डेटा की आवश्यकता है। मुझे पता है कि यह एफएफटी के साथ किया जा सकता है और पाइथन में काफी आसानी से स्क्रिप्ट योग्य होना चाहिए, लेकिन यह सुनिश्चित नहीं है कि इसे बिल्कुल कैसे किया जाए। तो मान लीजिए कि फ़ाइल में एक सिग्नल .4s लंबा है, तो मैं प्रोग्राम के उपायों और प्रत्येक मूल्य (आवृत्ति) को प्राप्त करने के लिए एक सरणी के रूप में आउटपुट देने के लिए कई मापन करना चाहूंगा (और संभवतः पावर (डीबी) भी)। जटिल बात यह है कि मैं पक्षी गीतों का विश्लेषण करना चाहता हूं, और उनके पास अक्सर हार्मोनिक्स होता है या संकेत आवृत्ति की एक श्रृंखला (उदाहरण के लिए 1000-2000 हर्ट्ज) से अधिक होता है। मैं प्रोग्राम को इस जानकारी को आउटपुट करना चाहता हूं, क्योंकि विश्लेषण के लिए यह महत्वपूर्ण है कि मैं डेटा के साथ करना चाहता हूं :)ध्वनि फ़ाइल से आवृत्ति पहचान

अब कोड का एक टुकड़ा है जो मुझे बहुत पसंद आया था, लेकिन मैं मुझे लगता है कि यह मुझे उन सभी मूल्यों को नहीं देता है जो मुझे चाहिए .... (जस्टिन छील के लिए धन्यवाद यह एक अलग प्रश्न पर पोस्ट करने के लिए :) :) तो मैं इकट्ठा करता हूं कि मुझे सुस्त और पाय्योडियो चाहिए लेकिन दुर्भाग्य से मैं अजगर से परिचित नहीं हूं इसलिए मैं उम्मीद है कि एक पायथन विशेषज्ञ इस पर मेरी मदद कर सकता है?

स्रोत कोड:

# Read in a WAV and find the freq's 
import pyaudio 
import wave 
import numpy as np 

chunk = 2048 

# open up a wave 
wf = wave.open('test-tones/440hz.wav', 'rb') 
swidth = wf.getsampwidth() 
RATE = wf.getframerate() 
# use a Blackman window 
window = np.blackman(chunk) 
# open stream 
p = pyaudio.PyAudio() 
stream = p.open(format = 
       p.get_format_from_width(wf.getsampwidth()), 
       channels = wf.getnchannels(), 
       rate = RATE, 
       output = True) 

# read some data 
data = wf.readframes(chunk) 
# play stream and find the frequency of each chunk 
while len(data) == chunk*swidth: 
    # write data out to the audio stream 
    stream.write(data) 
    # unpack the data and times by the hamming window 
    indata = np.array(wave.struct.unpack("%dh"%(len(data)/swidth),\ 
             data))*window 
    # Take the fft and square each value 
    fftData=abs(np.fft.rfft(indata))**2 
    # find the maximum 
    which = fftData[1:].argmax() + 1 
    # use quadratic interpolation around the max 
    if which != len(fftData)-1: 
     y0,y1,y2 = np.log(fftData[which-1:which+2:]) 
     x1 = (y2 - y0) * .5/(2 * y1 - y2 - y0) 
     # find the frequency and output it 
     thefreq = (which+x1)*RATE/chunk 
     print "The freq is %f Hz." % (thefreq) 
    else: 
     thefreq = which*RATE/chunk 
     print "The freq is %f Hz." % (thefreq) 
    # read some more data 
    data = wf.readframes(chunk) 
if data: 
    stream.write(data) 
stream.close() 
p.terminate() 
+3

क्या आपने अभी तक "खोज" की कोशिश की है? यह सवाल पूछा गया है। उदाहरण के लिए http://stackoverflow.com/questions/2648151/python-frequency-detection। –

+1

हां, यह कम से कम 5 वां समय है जब यह प्रश्न पिछले 2 हफ्तों में SO पर आया है। – Brad

+0

हां मैंने खोज की और चारों ओर देखा .. लेकिन मुझे आवश्यक सटीक उत्तर नहीं मिला। लेकिन आगे खोज करते समय मुझे एक ऐसा प्रोग्राम मिला जो मुझे मुफ्त में करने की ज़रूरत है :) ध्वनि विश्लेषण समर्थक अगर कोई और इस प्रश्न को पढ़ता है और समान चीजों को करने की तलाश में है। आप एक्सेल या मैटलैब को निर्यात किए गए इस प्रोग्राम के साथ डेटा (आवृत्ति आदि) प्राप्त कर सकते हैं! –

उत्तर

8

मुझे यकीन है कि अगर यह तुम क्या चाहते है, अगर आप बस FFT चाहते है नहीं कर रहा हूँ:

:

import scikits.audiolab, scipy 
x, fs, nbits = scikits.audiolab.wavread(filename) 
X = scipy.fft(x) 

आप परिमाण प्रतिक्रिया चाहते हैं

import pylab 
Xdb = 20*scipy.log10(scipy.absolute(X)) 
f = scipy.linspace(0, fs, len(Xdb)) 
pylab.plot(f, Xdb) 
pylab.show() 
+0

मुझे यह काम करने के लिए मिला लेकिन केवल मोनो ध्वनि फाइलों पर। स्टीरियो एक समस्या है –

+0

'x' के बजाय' x [:, 0] 'का उपयोग करें। –

+1

प्रिंटिंग एक्स मान इस आउटपुट को '-1 -15917969 + 0.j -0.06542969 + 0.j -0.06542969 + 0.j ..., -0.06542969 + 0.j -0.06542969 + 0.j -0.06542969 + 0 .j] 'लेकिन मुझे केवल एक आवृत्ति मिलनी चाहिए, है ना? आवृत्ति – AQU

5

मुझे लगता है कि आपको क्या करना है Short-time Fourier Transform (STFT) है। असल में, आप कई आंशिक रूप से ओवरलैपिंग एफएफटी करते हैं और समय पर प्रत्येक बिंदु के लिए उन्हें एक साथ जोड़ते हैं। फिर आप समय पर प्रत्येक बिंदु के लिए चोटी पायेंगे। मैंने इसे स्वयं नहीं किया है, लेकिन मैंने इसे अतीत में देखा है और यह निश्चित रूप से आगे बढ़ने का तरीका है।

एसटीएफटी here और here करने के लिए कुछ पायथन कोड है।

+0

कहां है! दूसरा लिंक निश्चित रूप से मुझे जो चाहिए वह दिखता है। मैं इसे आज़माउंगा! –

संबंधित मुद्दे