2011-04-29 16 views
10

लघु और सरल: हाय सब बहुत ही सरल ... मैं बस उन एफएफटी से एमएफसीसी प्राप्त करने के लिए शामिल कदमों को जानना चाहता हूं।सिग्नल पर एफएफटी से एमएफसीसी कैसे प्राप्त करें?

विस्तृत:

हाय सब। मैं एक ड्रम एप्लिकेशन पर काम कर रहा हूं जहां मैं ध्वनियों को वर्गीकृत करना चाहता हूं। यह सिर्फ एक मिलान करने वाला एप्लिकेशन है, यह ड्रम पर आपके द्वारा नोट किए गए नोट का नाम देता है।

इसका एक सरल भारतीय जोर से बड़ा ड्रम। वहां केवल कुछ ही नोट्स हैं जो कोई खेल सकता है।

मैं FFT एल्गोरिथ्म को क्रियान्वित किया है और सफलतापूर्वक एक स्पेक्ट्रम प्राप्त करते हैं। अब मैं इसे एक कदम आगे ले जाना चाहता हूं और एफएफटी से एमएफसीसी वापस कराना चाहता हूं।

यह मैं अब तक समझते हैं। यह आवृत्ति के एक nonlinear मेल पैमाने पर एक लॉग पावर स्पेक्ट्रम के रैखिक कोसाइन परिवर्तन पर आधारित है।

यह आवृत्तियों को फ़िल्टर और एक वांछित गुणांक पाने के लिए ट्राईऐन्ग्युलेशंस उपयोग करता है। http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/f2008/pae26_jsc59/pae26_jsc59/images/melfilt.png

इसलिए यदि आप लगभग 1000 मूल्यों FFT एल्गोरिथ्म से लौटे है - ध्वनि के स्पेक्ट्रम, तो अभीष्टतापूर्वक आप लगभग 12 तत्वों (जैसे कि, गुणांक) प्राप्त होंगे। यह 12-तत्व वेक्टर, साधन वर्गीकृत करने के लिए प्रयोग किया जाता है ड्रम खेला ...

इस वास्तव में मैं क्या चाहते भी शामिल है।

कोई मुझे कैसे इस तरह कुछ करने के लिए पर मदद कर सकते हैं? मेरे प्रोग्रामिंग कौशल ठीक हैं। मैं वर्तमान में आईफोन के लिए एक आवेदन बना रहा हूँ। openframeworks के साथ।

किसी भी मदद की सराहना की जाएगी। चीयर्स

+2

आम तौर पर मैं किसी भी तकनीकी के लिए विकिपीडिया को उद्धृत करने के लिए नाराज हूं, लेकिन [यह पृष्ठ] (http://en.wikipedia.org/wiki/Mel-frequency_cepstral_coefficient) मूल रूप से आपको गुणांक प्राप्त करने के लिए कदम देता है? – Dan

उत्तर

21

सबसे पहले, आपको सिग्नल को 10 से 30 मिमी के साथ छोटे फ्रेम में विभाजित करना होगा, एक विंडोिंग फ़ंक्शन लागू करें (ध्वनि अनुप्रयोगों के लिए हमिंग की अनुशंसा की जाती है), और सिग्नल के चौकोर परिवर्तन की गणना करें। एफ टी के साथ, गणना करने के लिए मेल frequecy Cepstral गुणांकों आप इन चरणों का पालन करना होगा:

  1. शक्ति स्पेक्ट्रम प्राप्त करें: | एफ टी |^2
  2. कंप्यूट मेल पैमाने में हर्ट्ज पैमाने को बदलने के लिए एक त्रिकोणीय बैंक फिल्टर
  3. प्राप्त करें लोग इन स्पेक्ट्रम
  4. लागू असतत cossine

बदलना एक अजगर कोड उदाहरण:

import numpy 
from scipy.fftpack import dct 
from scipy.io import wavfile 

sampleRate, signal = wavfile.read("file.wav") 
numCoefficients = 13 # choose the sive of mfcc array 
minHz = 0 
maxHz = 22.000 

complexSpectrum = numpy.fft(signal) 
powerSpectrum = abs(complexSpectrum) ** 2 
filteredSpectrum = numpy.dot(powerSpectrum, melFilterBank()) 
logSpectrum = numpy.log(filteredSpectrum) 
dctSpectrum = dct(logSpectrum, type=2) # MFCC :) 

def melFilterBank(blockSize): 
    numBands = int(numCoefficients) 
    maxMel = int(freqToMel(maxHz)) 
    minMel = int(freqToMel(minHz)) 

    # Create a matrix for triangular filters, one row per filter 
    filterMatrix = numpy.zeros((numBands, blockSize)) 

    melRange = numpy.array(xrange(numBands + 2)) 

    melCenterFilters = melRange * (maxMel - minMel)/(numBands + 1) + minMel 

    # each array index represent the center of each triangular filter 
    aux = numpy.log(1 + 1000.0/700.0)/1000.0 
    aux = (numpy.exp(melCenterFilters * aux) - 1)/22050 
    aux = 0.5 + 700 * blockSize * aux 
    aux = numpy.floor(aux) # Arredonda pra baixo 
    centerIndex = numpy.array(aux, int) # Get int values 

    for i in xrange(numBands): 
     start, centre, end = centerIndex[i:i + 3] 
     k1 = numpy.float32(centre - start) 
     k2 = numpy.float32(end - centre) 
     up = (numpy.array(xrange(start, centre)) - start)/k1 
     down = (end - numpy.array(xrange(centre, end)))/k2 

     filterMatrix[i][start:centre] = up 
     filterMatrix[i][centre:end] = down 

    return filterMatrix.transpose() 

def freqToMel(freq): 
    return 1127.01048 * math.log(1 + freq/700.0) 

def melToFreq(mel): 
    return 700 * (math.exp(mel/1127.01048) - 1) 

यह कोड MFCC Vamp example पर आधारित है। उम्मीद है इससे आपको मदद होगी!

+0

हाय, क्या आपका मतलब है "file.wav" फ्रेम (10ms से 30ms) होने के लिए? यदि नहीं, तो आपको सिग्नल को छोटे फ्रेम में विभाजित करने की आवश्यकता है और फिर प्रत्येक फ्रेम में किए गए ऑपरेशन को लागू करें। प्रत्येक फ्रेम के लिए, आपको 13 गुणांक प्राप्त करना चाहिए। – engineerchuan

+0

... मैं भी इसके साथ उलझन में था।मुझे लगता है कि वह खिड़की के आकार के बारे में बात कर रहा था। यह वह जगह है जहां हम मूल्यों को पकड़ते हैं और फिर उस पर एफएफटी की गणना करते हैं। कृपया – Pavan

+0

की पुष्टि करें, लेकिन मेरे पास गुणांक होने के बाद क्या होता है? उनके साथ क्या करते हैं? मुझे लगता है कि मुझे ध्वनि के गुणांक प्राप्त होते हैं और फिर ध्वनि 2 के गुणांक प्राप्त होते हैं ... फिर – Pavan

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