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




2 Answers

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

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

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

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

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

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

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

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

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

   [ -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 चैनलों का औसत होना चाहिए?




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

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

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

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




Related

python audio signal-processing fft spectrum