ऑडियो विश्लेषण में स्वतःसंबंध


11

मैं आटोक्लेररेशन पर पढ़ रहा हूं , लेकिन मुझे यकीन नहीं है कि मैं ठीक से समझता हूं कि यह कैसे काम करता है और मुझे क्या आउटपुट चाहिए। क्या मैं यह सोचने में सही हूं कि मुझे अपने सिग्नल को एसी फ़ंक्शन पर इनपुट करना चाहिए और एक स्लाइडिंग विंडो इनपुट होना चाहिए। प्रत्येक विंडो (उदाहरण के लिए 1024 नमूने) -1 और 1. के बीच एक गुणांक का उत्पादन करेगी। संकेत बस यह बताता है कि रेखा ऊपर या नीचे की ओर है और मान बताता है कि सहसंबंध कितना मजबूत है। सरलता के लिए, मैं कहता हूं कि मेरे पास एक ओवरलैप नहीं है और बस हर बार खिड़की 1024 नमूनों को स्थानांतरित करें। 44100 के नमूने में, क्या मुझे 43 गुणांक मिलेंगे और क्या मुझे उन सभी को रखने की आवश्यकता है?

कहते हैं कि मैं 200 सेकंड के सिग्नल के लिए यह प्रदर्शन करता हूं, जिससे मुझे 8600 गुणांक मिलते हैं। मैं पुनरावृत्ति का पता लगाने और बदले में, गति के लिए इन गुणांक का उपयोग कैसे करूंगा? क्या मुझे उन्हें समूहीकृत करने के लिए किसी प्रकार का तंत्रिका नेटवर्क बनाना चाहिए, या वह ओवरकिल है?

किसी भी मदद के लिए धन्यवाद।


4
मान लीजिए कि आपके नमूने x [ 1 ] , x [ 2 ] , , x [ 1024 ] हैं । क्या आप हमें बता सकते हैं कि आपका एसी क्या देता है? संभव जवाब हो सकता है: "यह रिटर्न Σ 1024 मैं = 1 ( एक्स [ मैं ] ) 2 " या "यह रिटर्न 1024 संख्या आर [ कश्मीर ] जहां आर [ कश्मीर ] = Σ 1024 - कश्मीर1024x[1],x[2],,x[1024]i=11024(x[मैं])21024आर[]"या" यह रिटर्न1024संख्याआर[कश्मीर]जहांआर[कश्मीर]=Σ 1024 - k मैं = 1 एक्स[मैं]एक्स[मैं+k]+Σ कश्मीर i = 1 x[1024-k+i]xआर[]=Σमैं=11024-एक्स[मैं]एक्स[मैं+]1024आर[] "। सभी तीन सुझाए गए उत्तरआर[]=Σमैं=11024-एक्स[मैं]एक्स[मैं+]+Σमैं=1एक्स[1024-+मैं]एक्स[मैं]
स्वतःसंबंध

हे दिलीप, मदद के लिए धन्यवाद। मैंने एसी फ़ंक्शन को अभी तक लागू नहीं किया है, मैं केवल सिद्धांत के आसपास अपना सिर लाने की कोशिश कर रहा हूं। पहला समीकरण सबसे आसान लगता है लेकिन क्या डेटा को पहले से सामान्य करने की आवश्यकता होगी?
XSL

1
यहाँ एक उदाहरण है: gist.github.com/255291#L62
एंडोलिथ

जवाबों:


23

ऑटोकैरेलेशन का विचार एक संकेत में और खुद को दिए गए अंतराल पर समानता का एक उपाय प्रदान करना है। इसे एप्रोच करने के कई तरीके हैं, लेकिन पिच / टेम्पो डिटेक्शन के प्रयोजनों के लिए, आप इसे एक खोज प्रक्रिया के रूप में सोच सकते हैं। दूसरे शब्दों में, आप सिग्नल सैंपल-बाय-सैंपल के माध्यम से कदम बढ़ाते हैं और अपने संदर्भ विंडो और लैग्ड विंडो के बीच सहसंबंध का प्रदर्शन करते हैं। "लैग 0" पर सहसंबंध वैश्विक अधिकतम होगा क्योंकि आप स्वयं के शब्दशः प्रतिलिपि के संदर्भ की तुलना कर रहे हैं। जैसा कि आप आगे बढ़ते हैं, सहसंबंध आवश्यक रूप से कम हो जाएगा, लेकिन एक आवधिक संकेत के मामले में, कुछ बिंदु पर यह फिर से बढ़ना शुरू हो जाएगा, फिर एक स्थानीय अधिकतम तक पहुंच जाएगा। "अंतराल 0" और उस पहली चोटी के बीच की दूरी आपको अपनी पिच / टेम्पो का अनुमान देती है। जिस तरह से मैं '

नमूना-दर-नमूना सहसंबंधों का कम्प्यूटिंग उच्च नमूना दरों पर बहुत कम्प्यूटेशनल रूप से महंगा हो सकता है, इसलिए आमतौर पर एफएफटी-आधारित दृष्टिकोण का उपयोग किया जाता है। ब्याज के खंड के एफएफटी को लेना, इसे अपने जटिल संयुग्म से गुणा करना , फिर उलटा एफएफटी लेने से आपको चक्रीय ऑटोक्रॉलेशन मिलेगा । कोड में ( numpy का उपयोग करके ):

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

इसका प्रभाव आवधिक घटकों (जो परिभाषा के अनुसार स्वयं के समान हैं) के सापेक्ष सिग्नल में शोर की मात्रा (जो स्वयं के साथ असंबंधित है) को कम करना होगा। उलटा रूपांतरण लेने से पहले ऑटोकॉरेलेशन (यानी संयुग्म गुणन) को दोहराने से शोर और भी कम हो जाएगा। सफेद शोर के साथ मिश्रित एक साइन लहर के उदाहरण पर विचार करें। निम्नलिखित कथानक में 440hz साइन लहर, एक ही साइन लहर "शोर से दूषित", शोर लहर का चक्रीय आटोक्लेररेशन और दोहरी चक्रीय ऑटोकार्लेशन दिखाया गया है:

autocorrelation

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

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

सिग्नल में कितना शोर है, इस पर निर्भर करता है कि आपको एक से अधिक ऑटोक्रेलेशन करने की आवश्यकता है या नहीं।

बेशक, इस विचार पर कई सूक्ष्म विविधताएं हैं, और मैं उन सभी को यहां नहीं लाने जा रहा हूं। सबसे व्यापक कवरेज जो मैंने देखा है (पिच का पता लगाने के संदर्भ में) राबिनर और शेफर द्वारा भाषण सिग्नल के डिजिटल प्रसंस्करण में है


अब, के रूप में कि क्या autocorrelation गति का पता लगाने के लिए पर्याप्त होगा। जवाब हां और नहीं है। आप कुछ टेम्पो जानकारी (स्रोत संकेत के आधार पर) प्राप्त कर सकते हैं, लेकिन यह समझ में आना मुश्किल हो सकता है कि सभी मामलों में इसका क्या अर्थ है। उदाहरण के लिए, यहां एक ब्रेकबीट के दो छोरों का एक प्लॉट है, इसके बाद पूरे अनुक्रम के चक्रीय ऑटोक्रॉलेशन का एक प्लॉट:

ब्रेकबीट ऑटोकरेलेशन

संदर्भ के लिए, यहां संबंधित ऑडियो है:

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


2
रुको, यह है कि ऑडियो सिग्नल का स्वतःसंक्रमण? यह निश्चित रूप से कुछ भी लेकिन डिजिटल छोरों का पता लगाने के लिए बहुत उपयोगी नहीं है। कुछ आरएमएस लिफाफे का ऑटोक्रेलेशन सामान्य रूप से बेहतर काम करना चाहिए, अधिमानतः कई आवृत्ति बैंड के लिए अलग-अलग।
१०:५१

1
समय की दिशा में एसटीएफटी का स्वतःसंबंध बहुत अच्छी तरह से काम करता है, जब तक कि संगीत में किसी तरह का तालमेल न हो । यह अनिवार्य रूप से बहुत सारे फ़्रीक्वेंसी बैंड के ऑटोकॉरेलेशन को चलाने के समान है और फिर उन्हें एक साथ जोड़ते हैं।
एंडोलिथ

2
@leftroundabout राइट, किसी भी तरह की चीजें हैं जिन्हें टेंपो डिटेक्शन (प्री, पोस्ट प्रोसेसिंग) के अलावा ऑटोकरेलेशन के अलावा खुद के लिए करना होगा। मैं मुख्य रूप से ओपी के सवाल के पहले वाक्य का जवाब दे रहा हूं (यानी "ऑटोकॉर्पोरेशन कैसे काम करता है"), फिर सुझाव देते हुए कि वह टेंपो का पता लगाने के बारे में एक और सवाल पूछते हैं, अन्य प्रक्रियाओं में शामिल होंगे।
datageist

@endolith तुम यहाँ क्या मतलब है Autocorrelation of the STFT in the time direction? विशेष रूप से समय दिशा भाग
popctrl

1
@popctrl का मतलब STFT की प्रत्येक पंक्ति के स्वसंबंध की गणना करना है
endolith

3

लगता है जैसे आप बीट डिटेक्शन करने के लिए ऑटोकरेलेशन का उपयोग करना चाहते हैं। आप ऐसा कर सकते हैं, लेकिन मेरा सुझाव है कि आप अपने ऑडियो को बड़े पैमाने पर घटाएं। आप 1 और 3 हर्ट्ज (60 बीपीएम से 180 बीपीएम) के बीच एक संकेत की तलाश कर रहे हैं, इसलिए आपको 44100 हर्ट्ज रिज़ॉल्यूशन की आवश्यकता नहीं है या नहीं चाहिए। एक ठीक से गणना और सामान्यीकृत ऑटोकैरेलेशन लैग 0 पर 1.0 है (संकेत पूरी तरह से स्वयं के साथ संबंध रखता है)। एक आवधिक संकेत के लिए, एसी शून्य से नीचे चला जाता है, फिर मौलिक आवृत्ति के अनुरूप अंतराल पर एक चोटी में वापस आता है, हार्मोनिक्स में छोटी चोटियों के साथ। आपको इस चोटी की खोज करने के लिए एक उचित रेंज चुननी होगी। शोर के लिए, स्वतःसंक्रमण ड्रॉप हो जाता है और मूल रूप से लगभग शून्य के आसपास के वर्गों में सपाट हो जाता है। अंगूठे के एक नियम के रूप में, यदि आपके पास सामान्यीकृत एसी में चोटी> 0.5 है, तो आपके पास एक आवधिक संकेत है।


1

स्वतः सहसंबंध बस स्वयं के साथ एक संकेत का क्रॉस सहसंबंध है। गणना करने का एक आसान तरीका मूल सिग्नल और सिग्नल के एक समय के फ़्लिप्ड संस्करण के बीच एक कनवल्शन करना है। यदि आपके पास एक संकेत है जो 1000 नमूने लंबा है, तो इसके ऑटो सहसंबंध में 1999 (2 * N-1) गैर-शून्य नमूने हैं। उन नमूनों में से केवल 1000 अद्वितीय हैं क्योंकि ऑटो सहसंबंध (एक वास्तविक संकेत के लिए) हमेशा समय में सममित होता है, अर्थात एसी [एन] = एसी [एन-एन]।

निरंतर संकेतों को परिमित खंडों में विभाजित करने की आवश्यकता है। यह फूरियर ट्रांसफॉर्म के समान है: तकनीकी रूप से आपको -inf से + inf को एकीकृत करने की आवश्यकता होती है, लेकिन इसे सेगमेंट में तोड़ना (ओवरलैप और / या आवश्यकतानुसार विंडोिंग) से भी उपयोगी परिणाम मिलते हैं। विंडो की लंबाई, आकार और ओवरलैप की पसंद आवेदन पर निर्भर करती है।

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