क्रॉस-सहसंबंध और सजा निकटता से संबंधित हैं। संक्षेप में, ऐसा करने के लिए घुमाव के FFTs के साथ, आप
- इनपुट-संकेतों को शून्य-पैड करें (अंत में शून्य जोड़ें ताकि लहर का कम से कम आधा "रिक्त" हो)
- दोनों संकेतों का एफएफटी लें
- परिणाम को एक साथ गुणा करें (तत्व-वार गुणन)
- उलटा एफएफटी करें
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
आपको शून्य-पेडिंग करने की आवश्यकता है क्योंकि एफएफटी विधि वास्तव में परिपत्र क्रॉस-सहसंबंध है, जिसका अर्थ है कि सिग्नल छोरों के चारों ओर लपेटता है। तो आप ओवरलैप से छुटकारा पाने के लिए पर्याप्त शून्य जोड़ते हैं, एक सिग्नल को अनुकरण करने के लिए जो अनंत के लिए शून्य है।
सजा के बजाय क्रॉस-सहसंबंध प्राप्त करने के लिए , आपको एफएफटी करने से पहले संकेतों में से किसी एक को उल्टा करने की आवश्यकता होती है, या एफएफटी के बाद संकेतों में से एक के जटिल संयुग्मन को लेना चाहिए:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
जो भी आपके हार्डवेयर / सॉफ्टवेयर के साथ आसान है। स्वतःसंक्रमण (स्वयं के साथ एक संकेत का क्रॉस-सहसंबंध) के लिए, जटिल संयुग्म करना बेहतर है, क्योंकि तब आपको केवल एक बार एफएफटी की गणना करने की आवश्यकता होती है।
यदि संकेत वास्तविक हैं, तो आप वास्तविक FFT (RFFT / IRFFT) का उपयोग कर सकते हैं और केवल स्पेक्ट्रम के आधे हिस्से की गणना करके अपने गणना समय को बचा सकते हैं।
इसके अलावा आप FUTWACK के लिए FFTW के लिए एक 5-चिकनी संख्या , FFTW के लिए एक ~ 13-चिकनी संख्या , या एक साधारण हार्डवेयर कार्यान्वयन के लिए 2 की शक्ति) के रूप में अनुकूलित किया जा सकता है कि एक बड़े आकार के लिए पैडिंग द्वारा गणना समय बचा सकते हैं ।
ब्रूट-बल सहसंबंध की तुलना में एफएफटी सहसंबंध के पायथन में एक उदाहरण है: https://stackoverflow.com/a/1768140/125507
यह आपको क्रॉस-सहसंबंध समारोह देगा, जो समानता बनाम ऑफसेट का एक उपाय है। उन ऑफसेट को प्राप्त करने के लिए जिस पर लहरें एक दूसरे के साथ "पंक्तिबद्ध" होती हैं, सहसंबंध समारोह में एक शिखर होगा:
शिखर का x मान ऑफसेट है, जो नकारात्मक या सकारात्मक हो सकता है।
मैंने केवल दो तरंगों के बीच ऑफसेट खोजने के लिए इसका उपयोग किया है। आप चोटी पर पैराबोलिक / द्विघात प्रक्षेप का उपयोग करके ऑफसेट (अपने नमूनों के संकल्प से बेहतर) का अधिक सटीक अनुमान प्राप्त कर सकते हैं ।
-1 और 1 के बीच एक समानता मूल्य प्राप्त करने के लिए (संकेतों में से एक को इंगित करने वाला एक नकारात्मक मूल्य अन्य वृद्धि के रूप में कम हो जाता है) आपको इनपुट की लंबाई, एफएफटी की लंबाई, आपके विशेष एफएफटी कार्यान्वयन के अनुसार आयाम को स्केल करना होगा स्केलिंग, आदि अपने आप में एक लहर का स्वतःसंबंध आपको अधिकतम संभव मैच का मूल्य देगा।
ध्यान दें कि यह केवल उन तरंगों पर काम करेगा जिनकी आकृति समान है। यदि वे अलग-अलग हार्डवेयर पर नमूने लिए गए हैं या कुछ शोर मिला है, लेकिन अन्यथा अभी भी एक ही आकार है, तो यह तुलना काम करेगी, लेकिन यदि तरंग आकार को फ़िल्टर या चरण शिफ्ट द्वारा बदल दिया गया है, तो वे एक ही ध्वनि कर सकते हैं, लेकिन जीत गए 't सहसंबद्ध भी।