दो ऑडियो फ़ाइलें समान हैं यह साबित करने के लिए मैं क्रॉस-सहसंबंध कैसे लागू करूं?


58

मुझे दो ऑडियो फ़ाइल के क्रॉस सहसंबंध को साबित करना है कि वे समान हैं। मैंने दो ऑडियो फाइलों का एफएफटी लिया है और अलग-अलग सरणियों में उनके पावर स्पेक्ट्रम मान हैं।

मैं उन्हें आगे बढ़ने और उन्हें साबित करने के लिए आगे कैसे बढ़ना चाहिए कि वे समान हैं? इसे करने का कोई बेहतर तरीका है? कोई भी मूल विचार मेरे लिए इसे सीखने और लागू करने में मददगार होगा।


दो यादृच्छिक सिग्नल वैक्टर के क्रॉस सहसंबंध को देखते हुए। आप MATLAB में दो वैक्टर प्राप्त करने के लिए रिवर्स को कैसे लागू करते हैं। जॉन मुहे

जवाबों:


56

क्रॉस-सहसंबंध और सजा निकटता से संबंधित हैं। संक्षेप में, ऐसा करने के लिए घुमाव के FFTs के साथ, आप

  1. इनपुट-संकेतों को शून्य-पैड करें (अंत में शून्य जोड़ें ताकि लहर का कम से कम आधा "रिक्त" हो)
  2. दोनों संकेतों का एफएफटी लें
  3. परिणाम को एक साथ गुणा करें (तत्व-वार गुणन)
  4. उलटा एफएफटी करें

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 सहसंबद्ध भी।


3
शून्य पैडिंग कम से कम एन = आकार (ए) + आकार (बी) -1 होना चाहिए, अधिमानतः 2. की शक्ति के लिए गोल होना चाहिए। -1 और 1 के बीच एक मान प्राप्त करने के लिए, मानक (ए) * मानक (बी) से विभाजित करें ), जो दिए गए अंतराल के लिए एन-स्पेस में दो वैक्टर के बीच कोण का कोसाइन देता है (यानी परिपत्र शिफ्ट मोड्यूलर एन)। चरम लैग्स पर, बहुत सारे ओवरलैपिंग सैंपल नहीं हैं (केवल सबसे चरम पर एक), इसलिए मानदंड (a) * मानदंड (b) से विभाजित करने से ये सहसंबंध 0 की ओर बढ़ जाएंगे (यानी एन-स्पेस में अपने रिश्तेदार ऑर्थोगोनेलिटी दिखा रहे हैं) ।
सन

1
मुझे लगता है कि विवरण में कोई त्रुटि हो सकती है। एफएफटी को एक साथ शब्द से गुणा नहीं करना चाहिए संकेतों के दृढ़ संकल्प का एफएफटी दें, क्रॉस-सहसंबंध का एफएफटी नहीं ? जैसा कि मैं इसे समझता हूं, क्रॉस-सहसंबंध का एफएफटी प्राप्त करने के लिए, आईएफएफटी लेने से पहले टर्म-बाय-टर्म गुणा में एफएफटी वैक्टर में से एक के जटिल संयुग्म का उपयोग करना आवश्यक है ।
दिलीप सरवटे

@DilipSarwate: हां, आप सही कह रहे हैं। आप समय की दिशा में एक संकेत को उल्टा भी कर सकते हैं, जिसे मैंने उत्तर में जोड़ा है।
एंडोलिथ

1
एक्स[मैं]मैंएक्स[±मैं]एक्स[मैं](एन-मैं)एक्स[एन-मैं]मैंमैंतारों की बढ़ती लागत, तारों की देरी (और इसलिए अधिकतम प्राप्त करने की घड़ी की दर को कम करता है), और यह भी, क्योंकि सभी तारों को एक-दूसरे के ऊपर से गुजरना चाहिए, रूटिंग समस्याएं पैदा करता है। यह यदि संभव हो तो बचा जाना चाहिए, और इस मामले में, यह है परिहार्य।
दिलीप सरवटे 22

1
@ लियो तत्व-वार गुणन। n-by-1 array x n-by-1 array = n-by-1 array मैंने जवाब में इसे "नमूना-दर-नमूना" कहा।
२२'१४ को एंडोलिथ

17

सहसंबंध एक समय में दो टाइमरीज (आपके मामले में ऑडियो नमूने) की समानता को व्यक्त करने का एक तरीका है। यह सहसंयोजक का एक अनुकूलन है जिसे निम्नानुसार कार्यान्वित किया जाता है:

period = 1/sampleFrequency;
covariance=0;

for (iSample = 0; iSample<nSamples; iSample++)
    covariance += (timeSeries_1(iSample)*timeSeries_2(iSample))/period;
    //Dividing by `period` might not even be necessary

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

आप कल्पना कर सकते हैं कि दो ध्वनि नमूने समान हो सकते हैं लेकिन सिंक्रनाइज़ नहीं हैं। यही कारण है कि क्रॉस सहसंबंध आता है। आप समय श्रृंखला के बीच सहसंबंध की गणना करते हैं जहां आपके पास उनमें से एक नमूना द्वारा स्थानांतरित किया गया है:

for (iShift=0; iShift<nSamples; iShift++)
    xcorr(iShift) = corr(timeSeries_1, timeSeries_2_shifted_one_sample);

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

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


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

@kellenjb, हाँ, लेकिन मैं शायद इसे शब्द कहूंगा, सहसंबंध की परिमाण जो आप में रुचि रखते हैं। 1 या -1 का मतलब है कि संकेत सीधे एक दूसरे को प्रभावित करते हैं।
कोरटुक

14

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

R_xy = ifft(fft(x,N) * conj(fft(y,N)))

जहाँ N = आकार (x) + आकार (y) - 1 (अधिमानतः 2 की शक्ति तक गोल) DFT की लंबाई है।

डीएफटी का गुणा समय में परिपत्र संकल्प के बराबर है । शून्य से दोनों वैक्टरों की लंबाई N तक x के साथ अतिव्यापी से y के घटकों को स्थानांतरित कर दिया जाता है, जिसके परिणामस्वरूप परिणाम x और समय उलट y के रैखिक संकेंद्रण के समान होता है।

1 का एक अंतराल y का दायां गोलाकार बदलाव है, जबकि -1 का अंतराल एक बाएं गोलाकार पारी है। क्रॉस-सहसंबंध बस सभी lags के लिए डॉट उत्पादों का अनुक्रम है। मानक फेटिंग ऑर्डर के आधार पर, ये एक एरे में होंगे, जिसे निम्नानुसार एक्सेस किया जा सकता है। आकार के माध्यम से संकेत 0 (x) -1 पॉजिटिव लैग हैं। इंडस एन-साइज़ (y) +1 से N-1 रिवर्स ऑर्डर में नकारात्मक लैग हैं। (पायथन में ऋणात्मक सूचकांकों को R_xy [-1] जैसे नकारात्मक सूचकांकों के साथ आसानी से पहुँचा जा सकता है।)

आप शून्य-गद्देदार x और y को एन-आयामी वैक्टर के रूप में सोच सकते हैं। किसी दिए गए अंतराल के लिए x और y का डॉट उत्पाद है |x|*|y|*cos(theta)। X और y के मानदंड परिपत्र पारियों के लिए स्थिर हैं, इसलिए उन्हें विभाजित करने से कोण थीटा के अलग-अलग कोसाइन निकल जाते हैं। यदि x और y (किसी दिए गए अंतराल के लिए) एन-स्पेस में ऑर्थोगोनल हैं, तो सहसंबंध 0 (यानी थीटा = 90 डिग्री) है। यदि वे सह-रैखिक हैं, तो मान 1 (सकारात्मक रूप से सहसंबद्ध) या -1 (नकारात्मक रूप से सहसंबद्ध, अर्थात थीटा = 180 डिग्री) है। यह क्रॉस-सहसंबंध को एकता की ओर ले जाता है:

R_xy = ifft(fft(x,N) * conj(fft(y,N))) / (norm(x) * norm(y))

यह केवल अतिव्यापी भागों के लिए मानदंडों को फिर से विभाजित करके निष्पक्ष बनाया जा सकता है, लेकिन तब आप समय क्षेत्र में संपूर्ण गणना भी कर सकते हैं। इसके अलावा, आपको सामान्यकरण के विभिन्न संस्करण दिखाई देंगे। एकता के सामान्य होने के बजाय, कभी-कभी क्रॉस-सहसंबंध को M (पक्षपाती) द्वारा सामान्यीकृत किया जाता है, जहां M = अधिकतम (आकार (x), आकार (y)), या M- | m | (मिथ लैग का एक निष्पक्ष अनुमान)।

अधिकतम सांख्यिकीय महत्व के लिए सहसंबंध की गणना करने से पहले माध्य (डीसी पूर्वाग्रह) को हटा दिया जाना चाहिए। इसे क्रॉस-कोवरियन कहा जाता है (MATLAB में xcov):

x2 = x - mean(x)
y2 = y - mean(y)
phi_xy = ifft(fft(x2,N) * conj(fft(y2,N))) / (norm(x2) * norm(y2))

इसका मतलब यह है कि सरणी का अंतिम आकार होना चाहिए 2*size (a) + size(b) - 1या 2*size (b) + size (a) - 1? लेकिन या तो मामले में दो गद्देदार सरणियाँ अलग-अलग आकार की होती हैं। बहुत सारे शून्य के साथ पैडिंग का परिणाम क्या है?

2

@RobertKJ: आप प्रति आउटपुट एक आउटपुट के bसाथ a, एक नमूने का न्यूनतम ओवरलैप के साथ फिसल रहे हैं । इससे size(a)पॉजिटिव लैग्स और size(b) - 1नेगेटिव लैग्स निकलते हैं। एन-पॉइंट डीएफटी के उत्पाद के व्युत्क्रम परिवर्तन का उपयोग करके, सूचकांकों के 0माध्यम size(a)-1से सकारात्मक अंतराल हैं, और सूचकांकों के N-size(b)+1माध्यम से N-1रिवर्स ऑर्डर में नकारात्मक अंतराल हैं।
एरिक सन

3

यदि आप Matlab का उपयोग कर रहे हैं तो क्रॉस सहसंबंधी कार्य करने का प्रयास करें:

c= xcorr(x,y)

यहाँ Matlab प्रलेखन है:

xcorrएक यादृच्छिक प्रक्रिया के क्रॉस-सहसंबंध अनुक्रम का अनुमान लगाता है। स्वायत्तता को एक विशेष मामले के रूप में नियंत्रित किया जाता है।

...

c = xcorr(x,y)क्रॉस-सहसंबंध अनुक्रम को 2 * N-1 वेक्टर में लौटाता है, जहां xऔर yलंबाई Nवैक्टर ( N > 1) हैं। अगर xऔर yसमान लंबाई नहीं हैं, तो छोटा वेक्टर शून्य से लंबी वेक्टर की लंबाई तक सीमित है।

सहसंबंध http://www.mathworks.com/help/toolbox/signal/ref/eqn1263487323.gif


लगता है लिंक टूट गया है।
डेनिजेल

2

ऑडियो फ़ाइलों की तुलना करने का एक त्वरित और सरल तरीका। ऑडियो फ़ाइल लें, एक कॉपी बनाएं, एक दाऊ में, उन्हें साइड में पेस्ट करें, 2 स्टीरियो चैनल में, एक स्टीरियो ट्रैक्स पर फेज को पलटने के लिए, जूम मोड में शुरुआत में फाइल के दोनों को संरेखित करें, सुनिश्चित करें कि दोनों फाइलों में शुरुआत में एक ही आयाम होता है, फिर खेलते हैं, अगर कुल चुप्पी है, तो दोनों फाइलें समान हैं, अगर कोई अंतर है तो आप इसे स्पष्ट रूप से सुनेंगे!


1

जैसा कि यहां लिखा गया है कि आपको सहसंबंध का उपयोग करना चाहिए।

बस 2 कारकों पर विचार करें:

  1. यदि मात्रा को अलग तरीके से बढ़ाया जाता है, तो आपको सहसंबंध को सामान्य करना चाहिए।
  2. यदि समय की स्केलिंग है तो आप डायनेमिक टाइम वारिंग का उपयोग कर सकते हैं।

1

गैर-आवधिक संकेतों (आकार (y) -1) के लिए वास्तविक अंतराल प्राप्त करने के लिए R_xy के सूचकांक से प्रतिस्थापित किया जाना चाहिए।

एन = आकार (एक्स) + आकार (वाई) - 1;

lags = [0, N] - (आकार (y) - 1);


0

अंतर को खोजने का सबसे आसान तरीका, IMO, समय डोमेन में दो ऑडियो संकेतों को घटाना है। यदि वे समान हैं, तो हर बार बिंदु पर परिणाम शून्य होगा। यदि वे समान नहीं हैं, तो उनके बीच का अंतर घटाव के बाद छोड़ दिया जाएगा और आप इसे सीधे सुन सकते हैं। इस अंतर का RMS मान कितना समान होगा, इसका एक त्वरित उपाय। उदाहरण के लिए MP3 बनाम WAV फ़ाइल के अंतर को सुनने के लिए यह अक्सर ऑडियो मिक्सिंग और मास्टरिंग में किया जाता है। (एक सिग्नल के चरण को प्राप्त करना और उन्हें जोड़ना घटाना के समान है। यह DAW सॉफ़्टवेयर में किए जाने पर उपयोग की जाने वाली विधि है।) उन्हें काम करने के लिए पूरी तरह से समय गठबंधन करना चाहिए। यदि वे नहीं हैं, तो आप उन्हें शीर्ष दस चोटियों का पता लगाने, चोटियों की औसत ऑफसेट की गणना करने और एक संकेत को स्थानांतरित करने जैसे एक एल्गोरिदम विकसित कर सकते हैं।

फ़्रीक्वेंसी डोमेन में ट्रांसफ़ॉर्म करना और आपके द्वारा प्रस्तावित संकेतों की पावर स्पेक्ट्रा की तुलना करना कुछ समय डोमेन जानकारी को अनदेखा कर रहा है। उदाहरण के लिए, रिवर्स में खेले जाने वाले ऑडियो में एक ही स्पेक्ट्रम होगा जब आगे खेला जाएगा। इस प्रकार, दो बहुत भिन्न ऑडियो सिग्नल एक ही समान स्पेक्ट्रम हो सकते हैं।

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