फास्ट फूरियर ट्रांसफॉर्म का उपयोग करके ऑडियो का विश्लेषण करें


109

मैं अजगर में एक ग्राफिकल स्पेक्ट्रम विश्लेषक बनाने की कोशिश कर रहा हूं।

मैं वर्तमान में एक 16 बिट दोहरे चैनल 44,100 हर्ट्ज नमूना दर ऑडियो स्ट्रीम के 1024 बाइट्स और 2 चैनलों के आयाम को एक साथ पढ़ रहा हूं। तो अब मेरे पास 256 हस्ताक्षरित शॉर्ट्स की एक सरणी है। मैं अब उस सारणी पर एक दरार बनाना चाहता हूं, जिसमें खसखस ​​जैसे एक मॉड्यूल का उपयोग कर रहा हूं, और परिणाम का उपयोग ग्राफिकल स्पेक्ट्रम विश्लेषक बनाने के लिए करता हूं, जो कि शुरू करने के लिए सिर्फ 32 बार होगा।

मैंने फास्ट फूरियर ट्रांसफॉर्म और डिस्क्रीट फूरियर ट्रांसफॉर्म पर विकिपीडिया लेखों को पढ़ा है लेकिन मैं अभी भी स्पष्ट नहीं हूं कि परिणामी सरणी क्या दर्शाती है। यह वही है जो मेरे द्वारा सरणी का उपयोग करने के बाद सरणी को दिखता है जैसे कि मैं अपने आरे का उपयोग कर रहा हूं:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

मैं सोच रहा हूँ कि ये संख्याएँ वास्तव में क्या दर्शाती हैं और मैं कैसे इन संख्याओं को 32 सलाखों में से प्रत्येक के लिए ऊँचाई के प्रतिशत में परिवर्तित करूँगा। इसके अलावा, क्या मुझे एक साथ 2 चैनलों का औसत होना चाहिए?

जवाबों:


209

आपके द्वारा दिखाया जा रहा सरणी ऑडियो सिग्नल का फूरियर ट्रांसफॉर्म गुणांक है। इन गुणांक का उपयोग ऑडियो की आवृत्ति सामग्री प्राप्त करने के लिए किया जा सकता है। एफएफटी को जटिल मूल्यवान इनपुट फ़ंक्शंस के लिए परिभाषित किया गया है, इसलिए आपके द्वारा बाहर निकलने वाले गुणांक काल्पनिक संख्या होंगे, भले ही आपका इनपुट सभी वास्तविक मान हो। प्रत्येक आवृत्ति में बिजली की मात्रा प्राप्त करने के लिए, आपको प्रत्येक आवृत्ति के लिए एफएफटी गुणांक के परिमाण की गणना करने की आवश्यकता है। यह नहीं है केवल गुणांक का वास्तविक घटक , आपको इसके वास्तविक और काल्पनिक घटकों के वर्ग के योग के वर्गमूल की गणना करने की आवश्यकता है। यही है, यदि आपका गुणांक + b * j है, तो इसका परिमाण sqrt (^ 2 + b ^ 2) है।

एक बार जब आप प्रत्येक एफएफटी गुणांक के परिमाण की गणना कर लेते हैं, तो आपको यह पता लगाना होगा कि प्रत्येक एफएफटी गुणांक किस ऑडियो आवृत्ति का है। एक N बिंदु FFT आपको 0. समान रूप से शुरू होने वाले N समान दूरी पर आपके सिग्नल की आवृत्ति सामग्री देगा, क्योंकि आपके नमूने की आवृत्ति 44100 नमूने / सेकंड है। और आपके एफएफटी में अंकों की संख्या 256 है, आपकी आवृत्ति रिक्ति 44100/256 = 172 हर्ट्ज (लगभग) है

आपके सरणी में पहला गुणांक 0 आवृत्ति गुणांक होगा। यह मूल रूप से सभी आवृत्तियों के लिए औसत शक्ति स्तर है। आपके बाकी गुणांक 0 से लेकर 172 हर्ट्ज तक के गुणकों में 128 तक मिलेंगे। एक एफएफटी में, आप केवल अपने नमूना बिंदुओं के आधे तक आवृत्तियों को माप सकते हैं। Nyquist Frequency और Nyquist-Shannon Sampling Theorem के इन लिंक को पढ़ें यदि आप सजा के लिए एक ग्लूटन हैं और यह जानना आवश्यक है कि क्यों, लेकिन मूल परिणाम यह है कि आपके कम आवृत्तियों को उच्च आवृत्ति की बाल्टी में दोहराया या परिवर्तित किया जा रहा है । तो आवृत्तियों 0 से शुरू होगी, एन / 2 गुणांक तक प्रत्येक गुणांक के लिए 172 हर्ट्ज तक बढ़ जाएगी, फिर एन - 1 गुणांक तक 172 हर्ट्ज तक घट जाएगी।

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

तो यह है कि उन संख्याओं का प्रतिनिधित्व करते हैं। सभी घटक परिमाणों के योग द्वारा प्रत्येक आवृत्ति घटक परिमाण को स्केल करके ऊंचाई के प्रतिशत में परिवर्तित किया जा सकता है। हालाँकि, यह आपको केवल सापेक्ष आवृत्ति वितरण का प्रतिनिधित्व देगा, और प्रत्येक आवृत्ति के लिए वास्तविक शक्ति नहीं। आप एक आवृत्ति घटक के लिए अधिकतम परिमाण द्वारा स्केलिंग की कोशिश कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह बहुत अच्छा प्रदर्शन करेगा। एक काम करने योग्य स्केलिंग कारक खोजने का सबसे तेज़ तरीका सही सेटिंग खोजने के लिए ज़ोर और नरम ऑडियो संकेतों पर प्रयोग करना होगा।

अंत में, यदि आप संपूर्ण ऑडियो सिग्नल की आवृत्ति सामग्री को पूरे के रूप में दिखाना चाहते हैं, तो आपको एक साथ दो चैनलों का औसत होना चाहिए। आप स्टीरियो ऑडियो को मोनो ऑडियो में मिला रहे हैं और संयुक्त आवृत्तियों को दिखा रहे हैं। यदि आप दाएं और बाएं आवृत्तियों के लिए दो अलग-अलग डिस्प्ले चाहते हैं, तो आपको प्रत्येक चैनल पर अलग से फूरियर ट्रांसफॉर्म करने की आवश्यकता होगी।


1
मैं ज्यादातर केवल एफएफटी के ऑनलाइन जटिल स्पष्टीकरण पा सकता हूं, यह एक महान और सरल विवरण था कि नमूना अंकों की संख्या एफएफटी के परिणामों को कैसे प्रभावित करती है। इसके लिए शुक्रिया!
इकोलोकेशन

26

हालाँकि यह धागा वर्षों पुराना है, फिर भी मुझे यह बहुत मददगार लगा। मैं सिर्फ अपना इनपुट किसी को देना चाहता हूं जो इसे पाता है और कुछ इसी तरह का निर्माण करने की कोशिश कर रहा है।

बार में विभाजन के लिए यह एंटिटी सुझाव के रूप में नहीं किया जाना चाहिए, डेटा को बार की संख्या के आधार पर समान रूप से विभाजित करके। सबसे उपयोगी डेटा को ओक्टेव भागों में विभाजित करना होगा, प्रत्येक ऑक्टेव पिछले की आवृत्ति से दोगुना होगा। (अर्थात। 100 हर्ट्ज 50 हर्ट्ज से ऊपर एक सप्तक है, जो 25 हर्ट्ज से ऊपर एक सप्तक है)।

आप कितनी बार चाहते हैं इसके आधार पर, आप पूरी रेंज को 1 / X ऑक्टेव रेंज में विभाजित करते हैं। बार पर A के दिए गए केंद्र की आवृत्ति के आधार पर, आपको बार की ऊपरी और निचली सीमाएँ प्राप्त होती हैं:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

अगले आसन्न केंद्र आवृत्ति की गणना करने के लिए आप एक समान गणना का उपयोग करते हैं:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

फिर आप प्रत्येक बार के लिए आयाम प्राप्त करने के लिए इन श्रेणियों में फिट होने वाले डेटा को औसत करते हैं।

उदाहरण के लिए: हम 1/3 सप्तक श्रेणियों में विभाजित करना चाहते हैं और हम 1khz के केंद्र आवृत्ति के साथ शुरू करते हैं।

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

44100hz और 1024 नमूने (प्रत्येक डेटा बिंदु के बीच 43hz) को देखते हुए हमें 26 के माध्यम से मानों को औसत करना चाहिए। (890.9 / 43 = 20.72 ~ 21 और 1122.5 / 43 = 26.10 ~ 26)

(1/3 ऑक्टेव बार आपको ~ 40hz और ~ 20khz के बीच लगभग 30 बार मिलेंगे)। जैसा कि आप अब तक पता लगा सकते हैं, जैसे-जैसे हम उच्च होते जाएंगे हम संख्याओं की एक बड़ी श्रृंखला को औसत करेंगे। कम बार में आमतौर पर केवल 1 या कम संख्या में डेटा बिंदु शामिल होते हैं। जबकि उच्चतर बार सैकड़ों बिंदुओं का औसत हो सकता है। इसका कारण यह है कि 86 हर्ट्ज 43hz से ऊपर एक सप्तक है ... जबकि 10086hz लगभग 10043 हर्ट्ज के समान लगता है।


10

आपके पास जो एक नमूना है, जिसकी लंबाई 256/44100 = 0.00580499 सेकंड है। इसका मतलब है कि आपका फ़्रीक्वेंसी रिज़ॉल्यूशन 1 / 0.00580499 = 172 हर्ट्ज है। आप पायथन से जो 256 मान प्राप्त करते हैं, वे आवृत्तियों के अनुरूप हैं, मूल रूप से, 86 हर्ट्ज से 255 * 172 + 86 हर्ट्ज = 43946 हर्ट्ज तक। आपके द्वारा निकाली गई संख्याएँ जटिल संख्याएँ हैं (इसलिए हर दूसरी संख्या के अंत में "j")।

संपादित करें: फिक्स्ड गलत जानकारी

आपको sqrt (i 2 + j 2 ) की गणना करके जटिल संख्याओं को आयाम में बदलने की आवश्यकता है, जहां मैं और j वास्तविक और काल्पनिक भाग हैं, सम्मान करते हैं।

यदि आप 32 बार रखना चाहते हैं, तो आपको जहां तक ​​मेरी समझ है, आपको औसतन चार आयामों का औसत लेना है, तो आप 256/4 = 32 बार प्राप्त करना चाहते हैं।


4
कृपया ध्यान दें, यदि c एक जटिल संख्या है, sqrt (c.real 2 + c.imag 2) == abs (c)
tzot

0

FFT रिटर्न एन जटिल मान जो आप की गणना कर सकते हैं module=sqrt(real_part^2+imaginary_part^2)। प्रत्येक बैंड के लिए मूल्य प्राप्त करने के लिए आपको बैंड के अंदर सभी हार्मोनिक्स के बारे में मॉड्यूल का योग करना होगा। नीचे आप 10 बार स्पेक्ट्रम विश्लेषक के बारे में एक उदाहरण देख सकते हैं। Pyd python मॉड्यूल को प्राप्त करने के लिए c कोड को लपेटना पड़ता है।

float *samples_vett;
float *out_filters_vett;
int Nsamples;
float band_power = 0.0;
float harmonic_amplitude=0.0;
int i, out_index;

out_index=0;


for (i = 0; i < Nsamples / 2 + 1; i++)       
        {
            if (i == 1 || i == 2 || i == 4 || i == 8 || i == 17 || i == 33 || i == 66 || i == 132 || i == 264 || i == 511)
            {
                out_filters_vett[out_index] = band_power; 
                band_power = 0; 
                out_index++;  
            }

            harmonic_amplitude = sqrt(pow(ttfr_out_vett[i].r, 2) + pow(ttfr_out_vett[i].i, 2));
            band_power += harmonic_amplitude;

        }

मैंने पायथन द्वारा पूरे 10 एलईडी बार स्पेक्ट्रम विश्लेषक डिजाइन किए और बनाए। इसके बजाय nunmpy लाइब्रेरी का उपयोग करने के लिए (बहुत बड़ा और बेकार है सिर्फ FFT पाने के लिए) FFT पाने के लिए एक अजगर अजगर मॉड्यूल (सिर्फ 27KB) और पूरे ऑडियो स्पेक्ट्रम को विभाजित करने के लिए बैंड बनाया गया था।

इसके अलावा, आउटपुट ऑडियो पढ़ने के लिए एक लूपबैक WASapi portaudio pyd मॉड्यूल बनाया गया था। आप चित्र 10BarsSpectrumAnalyzerWithWASapi.jpg में परियोजना (ब्लॉक आरेख) देख सकते हैं

बस मेरे YouTube चैनल पर एक ट्यूटोरियल वीडियो जोड़ा: कैसे एक बहुत ही स्मार्ट पायथन स्पेक्ट्रम विश्लेषक 10 एलईडी बार डिजाइन और बनाने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.