2009-03-02 16 views
95

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

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

मैं सोच रहा हूँ वास्तव में इन नंबरों क्या प्रतिनिधित्व करते हैं और कैसे मैं प्रत्येक के लिए एक ऊंचाई का एक प्रतिशत में इन नंबरों में बदल सकते हैं: इस सरणी के बाद मैं numpy उपयोग करते हुए मेरे सरणी पर एक fft पहिले कैसा दिखता है 32 बार साथ ही, क्या मुझे एक साथ 2 चैनलों का औसत होना चाहिए?

उत्तर

187

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

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

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

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

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

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

+3

+1 महान उत्तर के लिए और मुझे एक नया मुहावरे सीखने के लिए, मैं मूल अंग्रेजी स्पीकर नहीं हूं।;) – macbirdie

+1

+1 बहुत बढ़िया, इससे मुझे यह समझने में मदद मिली कि मैं क्या गलत कर रहा था। – Davido

+4

+1 - हालांकि मुझे पहले से ही एफएफटी के बारे में पता है - वेब पर सबसे अच्छी सादे अंग्रेजी स्पष्टीकरणों में से एक। – OldTinfoil

10

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

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

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

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

+0

हाय, प्रारंभिक (गलत) उत्तर के लिए खेद है ... गणित को सही नहीं मिला। यह अभी सही होना चाहिए। –

+4

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

25

हालांकि यह धागा साल पुराना है, मुझे यह बहुत उपयोगी लगता है। मैं बस किसी को भी अपना इनपुट देना चाहता था जो इसे पाता है और कुछ ऐसा बनाने की कोशिश कर रहा है।

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

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

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

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

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

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

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

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

को देखते हुए 44100Hz और 1024 नमूने (प्रत्येक डेटा बिंदु के बीच 43hz) हम को महत्व देता है बाहर औसत के बराबर होगा 21 26. के माध्यम से (890,9/43 = 20,72 ~ 21 और 1122.5/43 = 26.10 ~ 26)

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

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