ऑटोकैरेलेशन का विचार एक संकेत में और खुद को दिए गए अंतराल पर समानता का एक उपाय प्रदान करना है। इसे एप्रोच करने के कई तरीके हैं, लेकिन पिच / टेम्पो डिटेक्शन के प्रयोजनों के लिए, आप इसे एक खोज प्रक्रिया के रूप में सोच सकते हैं। दूसरे शब्दों में, आप सिग्नल सैंपल-बाय-सैंपल के माध्यम से कदम बढ़ाते हैं और अपने संदर्भ विंडो और लैग्ड विंडो के बीच सहसंबंध का प्रदर्शन करते हैं। "लैग 0" पर सहसंबंध वैश्विक अधिकतम होगा क्योंकि आप स्वयं के शब्दशः प्रतिलिपि के संदर्भ की तुलना कर रहे हैं। जैसा कि आप आगे बढ़ते हैं, सहसंबंध आवश्यक रूप से कम हो जाएगा, लेकिन एक आवधिक संकेत के मामले में, कुछ बिंदु पर यह फिर से बढ़ना शुरू हो जाएगा, फिर एक स्थानीय अधिकतम तक पहुंच जाएगा। "अंतराल 0" और उस पहली चोटी के बीच की दूरी आपको अपनी पिच / टेम्पो का अनुमान देती है। जिस तरह से मैं '
नमूना-दर-नमूना सहसंबंधों का कम्प्यूटिंग उच्च नमूना दरों पर बहुत कम्प्यूटेशनल रूप से महंगा हो सकता है, इसलिए आमतौर पर एफएफटी-आधारित दृष्टिकोण का उपयोग किया जाता है। ब्याज के खंड के एफएफटी को लेना, इसे अपने जटिल संयुग्म से गुणा करना , फिर उलटा एफएफटी लेने से आपको चक्रीय ऑटोक्रॉलेशन मिलेगा । कोड में ( numpy का उपयोग करके ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
इसका प्रभाव आवधिक घटकों (जो परिभाषा के अनुसार स्वयं के समान हैं) के सापेक्ष सिग्नल में शोर की मात्रा (जो स्वयं के साथ असंबंधित है) को कम करना होगा। उलटा रूपांतरण लेने से पहले ऑटोकॉरेलेशन (यानी संयुग्म गुणन) को दोहराने से शोर और भी कम हो जाएगा। सफेद शोर के साथ मिश्रित एक साइन लहर के उदाहरण पर विचार करें। निम्नलिखित कथानक में 440hz साइन लहर, एक ही साइन लहर "शोर से दूषित", शोर लहर का चक्रीय आटोक्लेररेशन और दोहरी चक्रीय ऑटोकार्लेशन दिखाया गया है:
ध्यान दें कि दोनों ऑटोक्रेलेशन सिग्नल की पहली चोटी मूल सिग्नल के पहले चक्र के अंत में स्थित है। वह पीरियड जिसे आप समय-समय पर निर्धारित करने के लिए देख रहे हैं (इस मामले में पिच)। पहला ऑटोकैरेलेशन सिग्नल अभी भी थोड़ा "विगली" है, इसलिए चोटी का पता लगाने के लिए, किसी प्रकार के चौरसाई की आवश्यकता होगी। आवृत्ति डोमेन में दो बार ऑटोक्रॉरेटिंग एक ही चीज़ को पूरा करता है (और अपेक्षाकृत तेज़ है)। ध्यान दें कि "विगली" से मेरा मतलब है कि सिग्नल कैसे दिखता है जब ज़ूम इन किया जाता है, न कि प्लॉट के केंद्र में होने वाली डुबकी। चक्रीय निरंकुशता की दूसरी छमाही हमेशा पहले छमाही की दर्पण छवि होगी, ताकि "डुबकी" की तरह विशिष्ट हो। बस एल्गोरिथ्म के बारे में स्पष्ट होने के लिए, यहाँ कोड क्या दिखेगा:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
सिग्नल में कितना शोर है, इस पर निर्भर करता है कि आपको एक से अधिक ऑटोक्रेलेशन करने की आवश्यकता है या नहीं।
बेशक, इस विचार पर कई सूक्ष्म विविधताएं हैं, और मैं उन सभी को यहां नहीं लाने जा रहा हूं। सबसे व्यापक कवरेज जो मैंने देखा है (पिच का पता लगाने के संदर्भ में) राबिनर और शेफर द्वारा भाषण सिग्नल के डिजिटल प्रसंस्करण में है ।
अब, के रूप में कि क्या autocorrelation गति का पता लगाने के लिए पर्याप्त होगा। जवाब हां और नहीं है। आप कुछ टेम्पो जानकारी (स्रोत संकेत के आधार पर) प्राप्त कर सकते हैं, लेकिन यह समझ में आना मुश्किल हो सकता है कि सभी मामलों में इसका क्या अर्थ है। उदाहरण के लिए, यहां एक ब्रेकबीट के दो छोरों का एक प्लॉट है, इसके बाद पूरे अनुक्रम के चक्रीय ऑटोक्रॉलेशन का एक प्लॉट:
संदर्भ के लिए, यहां संबंधित ऑडियो है:
निश्चित रूप से पर्याप्त है, लूप पॉइंट के अनुरूप मध्य में एक अच्छा स्पाइक है, लेकिन यह काफी लंबे खंड को संसाधित करने से आया है। इसके शीर्ष पर, यदि यह एक सटीक प्रतिलिपि नहीं थी (जैसे कि अगर इसके साथ इंस्ट्रूमेंटेशन थे), तो स्पाइक उतना साफ नहीं होगा। टेंपो डिटेक्शन में ऑटोकैरेलेशन निश्चित रूप से उपयोगी होगा, लेकिन यह संभवतः जटिल स्रोत सामग्री के लिए पर्याप्त नहीं होगा। उदाहरण के लिए, यहां तक कि अगर आप एक स्पाइक पाते हैं, तो आप कैसे जानते हैं कि यह एक पूर्ण उपाय है, या क्वार्टर नोट, आधा नोट, या कुछ और? इस मामले में यह पर्याप्त स्पष्ट है कि यह एक पूर्ण उपाय है, लेकिन यह हमेशा ऐसा नहीं होगा। मैं सुझाव दूंगा कि जब तक आंतरिक कामकाज स्पष्ट नहीं हो जाता है तब तक सरल संकेतों पर एसी का उपयोग करने के साथ, फिर सामान्य रूप से टेंपो का पता लगाने के बारे में एक और सवाल पूछें (क्योंकि यह "बड़ा" है