2010-07-01 5 views
7

दिया गया 320 तत्वों (int16) की एक सरणी है, जो 20 एमएस अवधि के ऑडियो सिग्नल (16-बिट एलपीसीएम) का प्रतिनिधित्व करती है। मैं सबसे सरल और बहुत तेज विधि की तलाश में हूं, यह तय करना चाहिए कि इस सरणी में सक्रिय ऑडियो (भाषण या संगीत की तरह) है, लेकिन शोर या चुप्पी नहीं है। मुझे निर्णय की बहुत उच्च गुणवत्ता की आवश्यकता नहीं है, लेकिन यह बहुत तेज़ होना चाहिए।ऑडियो गतिविधि का पता लगाने के लिए सबसे सरल और तेज़ तरीका?

यह मेरे लिए पहले सभी वर्गों या तत्वों के पूर्ण मूल्यों को जोड़ने के लिए हुआ और उनकी सीमा की तुलना थ्रेसहोल्ड के साथ की गई, लेकिन इस तरह की एक विधि मेरे सिस्टम पर बहुत धीमी है, भले ही यह ओ (एन) है।

+0

क्या 'एल' का मतलब रैखिक या लॉगरिदमिक है? – msw

+0

@msw: एल का मतलब है रैखिक – psihodelia

+2

शायद आपको अपने वर्गों के थ्रेसहोल्ड दृष्टिकोण के लिए कोड पोस्ट करना चाहिए - यह वास्तव में "बहुत धीमा" नहीं होना चाहिए - शायद आप इसे अक्षम रूप से कार्यान्वित कर रहे हैं? –

उत्तर

4

आप समेकित वर्ग के दृष्टिकोण से कहीं अधिक तेज़ी से नहीं जा रहे हैं।

एक अनुकूलन जो आप अब तक नहीं कर रहे हैं, एक रनिंग कुल का उपयोग करना है। यही है, प्रत्येक बार चरण में, अंतिम एन नमूने के वर्गों को संक्षेप में बदलने के बजाय, एक रनिंग कुल रखें और सबसे हालिया नमूने के वर्ग के साथ अद्यतन करें। समय के साथ बढ़ते और बढ़ने से अपने चलने वाले कुल से बचने के लिए, एक घातीय क्षय जोड़ें। छद्म कोड में:

decay_constant=0.999; // Some suitable value smaller than 1 
total=0; 
for t=1,... 
    // Exponential decay 
    total=total*decay_constant; 

    // Add in latest sample 
    total+=current_sample; 

    if total>threshold 
     // do something 
    end 
end 

बेशक, आपको अपने आवेदन के अनुरूप क्षय स्थिर और दहलीज को ट्यून करना होगा। यदि यह वास्तविक समय में चलाने के लिए पर्याप्त तेज़ नहीं है, तो आपके पास गंभीरता से डीएसपी को कम किया गया है ...

+2

सभी उच्च आवृत्ति शोर को हटाने के लिए एक साधारण फ़िल्टर जोड़ने के लिए मत भूलना।एक कम पास फ़िल्टर पिछले नमूना को 'याद रखने' के रूप में सरल हो सकता है, और इसे वर्तमान के साथ औसत, और कच्चे नमूने के बजाय इसका उपयोग कर सकता है। बहुत तेज और बहुत प्रभावी – Toad

2

आप दो सरल "आंकड़े" की गणना करने का प्रयास कर सकते हैं - पहले फैल जाएगा (अधिकतम-मिनट)। मौन बहुत कम फैल जाएगा। दूसरा विविधता होगी - संभावित मानों की सीमा को 16 ब्रैकेट्स (= मान सीमा) में विभाजित करें और जैसे ही आप तत्वों के माध्यम से जाते हैं, यह निर्धारित करें कि तत्व किस ब्रैकेट में जाता है। शोर के पास सभी ब्रैकेट्स के लिए समान संख्याएं होंगी, जबकि संगीत या भाषण दूसरों में उपेक्षा करते समय उनमें से कुछ को प्राथमिकता देना चाहिए।

यह सरणी के माध्यम से केवल एक पास में करना संभव होना चाहिए और आपको जटिल अंकगणित की आवश्यकता नहीं है, केवल कुछ अतिरिक्त और मूल्यों की तुलना करें।

कुछ अनुमानों पर भी विचार करें, उदाहरण के लिए केवल प्रत्येक चौथा मूल्य लें, इस प्रकार चेक किए गए तत्वों की संख्या को 80 तक कम करें। ऑडियो सिग्नल के लिए, यह ठीक होना चाहिए।

0

यह स्पष्ट रूप से है कि जटिलता कम से कम ओ (एन) होनी चाहिए। शायद कुछ सरल एल्गोरिदम जो कुछ मूल्य सीमा की गणना करते हैं, वे इस पल के लिए अच्छे हैं लेकिन मैं वेब पर Voice Activity Detection और related code samples पर देखता हूं।

1

मैंने कुछ समय पहले ऐसा कुछ किया था। कुछ प्रयोगों के बाद मैं एक ऐसे समाधान पर पहुंचा जो मेरे मामले में पर्याप्त रूप से अच्छी तरह से काम करता था।

मैंने लगभग 120ms से अधिक चलने वाले औसत के घन में परिवर्तन की दर का उपयोग किया। जब मौन होता है (केवल शोर है) अभिव्यक्ति शून्य के आसपास होनी चाहिए। जैसे ही कुछ रनों में दर बढ़ने लगती है, तो शायद आपके पास कुछ कार्रवाई चल रही है।


rate = cur_avg^3 - prev_avg^3 

मैंने घन का उपयोग किया क्योंकि वर्ग बस पर्याप्त आक्रामक नहीं था। यदि घन आपके लिए धीमा है, तो इसके बजाय वर्ग और बिट्सफ़्ट का उपयोग करने का प्रयास करें। उम्मीद है की यह मदद करेगा।

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