2013-03-16 7 views
9

मैं समय के कुछ वृद्धि (0.1 सेकंड कहें) और 0.0 से 1.0 की सीमा में एक गीत से ट्रेबल और बास डेटा प्राप्त करने का एक तरीका ढूंढ रहा हूं। मैंने चारों ओर गुमराह किया है लेकिन जो कुछ भी मैं ढूंढ रहा हूं उसके करीब से कुछ भी नहीं ढूंढ पाया है। अंततः मैं गीत बजाने के दौरान ट्रेबल और बास स्तर का प्रतिनिधित्व करने में सक्षम होना चाहता हूं।आईओएस में ऑडियो से ट्रेबल और बास निकालें

धन्यवाद!

+0

इस प्रश्न का स्वीकार्य उत्तर देखें: http://stackoverflow.com/questions/1794010/how-to-use-numpy-with-portaudio-to-extract-bass-mid-treble?rq=1 –

+0

ठीक है यह प्रक्रिया को समझाता है लेकिन आईओएस पर उस प्रक्रिया को कैसे नहीं किया जाए - या कम से कम कहां से शुरू करना है। –

+0

आईओएस में ऑडियो यूनिट फ्रेमवर्क में अंतर्निहित निम्न और उच्च पास फ़िल्टर हैं। –

उत्तर

10

यह काफी आसान है। आपको एक एफएफटी करने की ज़रूरत है और फिर आपको रुचि रखने वाले डिब्बे को जोड़ना होगा। आप जो भी चुनते हैं वह आपके ऑडियो की नमूना दर पर निर्भर करेगा।

आपको आवृत्ति डिब्बे में अच्छी जानकारी प्राप्त करने के लिए उचित एफएफटी आदेश चुनने की आवश्यकता है।

तो यदि आप ऑर्डर 8 एफएफटी करते हैं तो आपको 256 नमूने की आवश्यकता होगी। यह आपको 128 जटिल जोड़े वापस कर देगा।

अगला आपको इन्हें परिमाण में परिवर्तित करने की आवश्यकता है। यह वास्तव में काफी सरल है। यदि आप std :: complex का उपयोग कर रहे हैं तो आप जटिल संख्या पर केवल std :: abs निष्पादित कर सकते हैं और आपके पास इसकी परिमाण (sqrt (r^2 + i^2) होगी)।

दिलचस्प बात यह है कि इस बिंदु पर Parseval's theorem कहा जाता है। यह प्रमेय बताता है कि प्रदर्शन करने के बाद एक चौकोर लौटाई गई डिब्बे के योग को इनपुट सिग्नल के औसत वर्गों के योग के बराबर होता है।

इसका मतलब है कि डिब्बे के एक विशिष्ट सेट के आयाम को प्राप्त करने के लिए आप उन्हें आसानी से उन संख्याओं से विभाजित कर सकते हैं और फिर उन डिब्बे के आरएमएस आयाम मान प्राप्त करने के लिए sqrt जोड़ सकते हैं।

तो यह आपको कहां छोड़ देता है?

अच्छी तरह से यहां से आपको पता लगाना होगा कि आप किन डिब्बे जोड़ रहे हैं।

  1. एक ट्रेबल टोन को 2000 हर्ट्ज के रूप में परिभाषित किया गया है।
  2. एक बास टोन 300 हर्ट्ज से नीचे है (यदि मेरी याददाश्त सही ढंग से मेरी सेवा करती है)।
  3. मिड्स 300 हर्ट्ज और 2kHz के बीच हैं।

अब मान लें कि आपकी नमूना दर 8kHz है। Nyquist rate कहता है कि उच्चतम आवृत्ति जो आप 8kHz नमूनाकरण में प्रतिनिधित्व कर सकते हैं वह 4kHz है। इस प्रकार प्रत्येक बिन 4000/128 या 31.25 हर्ट्ज का प्रतिनिधित्व करता है।

तो यदि बास आवृत्तियों के लिए पहले 10 डिब्बे (312.5 हर्ट्ज तक) का उपयोग किया जाता है। बिन 10 से बिन 63 मिड्स का प्रतिनिधित्व करते हैं। अंत में बिन 64 से 127 ट्रेबल है।

फिर आप ऊपर बताए अनुसार आरएमएस मूल्य की गणना कर सकते हैं और आपके पास आरएमएस मूल्य हैं।

आरएमएस मूल्य 20.0f * log10f(rmsVal); प्रदर्शन करके डीबीएफएस मूल्यों में परिवर्तित किया जा सकता है। यह आपको 0 डीबी (अधिकतम आयाम) से नीचे -infinity डीबी (न्यूनतम आयाम) से एक मूल्य वापस कर देगा। जागरूक आयाम -1 से करने के लिए 1.

लेकर नहीं है आप के साथ मदद करने के लिए, यहाँ मेरी सी ++ आधारित iPhone के लिए FFT वर्ग (जो हुड के नीचे vDSP उपयोग करता है) का एक सा है रहें:

MacOSFFT::MacOSFFT(unsigned int fftOrder) : 
    BaseFFT(fftOrder) 
{ 
    mFFTSetup = (void*)vDSP_create_fftsetup(mFFTOrder, 0); 
    mImagBuffer.resize(1 << mFFTOrder); 
    mRealBufferOut.resize(1 << mFFTOrder); 
    mImagBufferOut.resize(1 << mFFTOrder); 
} 

MacOSFFT::~MacOSFFT() 
{ 
    vDSP_destroy_fftsetup((FFTSetup)mFFTSetup); 
} 

bool MacOSFFT::ForwardFFT(std::vector< std::complex<float> >& outVec, const std::vector<float>& inVec) 
{ 
    return ForwardFFT(&outVec.front(), &inVec.front(), inVec.size()); 
} 

bool MacOSFFT::ForwardFFT(std::complex<float>* pOut, const float* pIn, unsigned int num) 
{ 
    // Bring in a pre-allocated imaginary buffer that is initialised to 0. 
    DSPSplitComplex dspscIn; 
    dspscIn.realp = (float*)pIn; 
    dspscIn.imagp = &mImagBuffer.front(); 

    DSPSplitComplex dspscOut; 
    dspscOut.realp = &mRealBufferOut.front(); 
    dspscOut.imagp = &mImagBufferOut.front(); 

    vDSP_fft_zop((FFTSetup)mFFTSetup, &dspscIn, 1, &dspscOut, 1, mFFTOrder, kFFTDirection_Forward); 

    vDSP_ztoc(&dspscOut, 1, (DSPComplex*)pOut, 1, num); 

    return true; 
} 
5

ऐसा लगता है कि आप Fast Fourier Transform नमूना कोड की तलाश में हैं।

यह एक उत्तर में शामिल करने के लिए काफी बड़ा विषय है।

उपकरण आप पहले से ही आईओएस में निर्माण कर रहे हैं की आवश्यकता होगी: vDSP एपीआई

यह आपको मदद करनी चाहिए: vDSP Programming Guide

और वहाँ भी एक FFT Sample Code उपलब्ध है

तुम भी iPhoneFFT की जाँच करने के लिए चाहते हो सकता है । यद्यपि वह कोड slighlty पुराना है, यह "अंडर-द-हूड" प्रक्रियाओं को समझने में आपकी सहायता कर सकता है।

3

देखें ऐप्पल से auriotouch2 उदाहरण के लिए - इसमें आवृत्ति विश्लेषण से सब कुछ है जो आप चाहते हैं के यूआई प्रतिनिधित्व के लिए है।

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