एफएफटी का उपयोग करके ऑटोकरेलेशन की कुशल गणना करना


12

मैं एक प्लेटफ़ॉर्म पर एक ऑटोकॉरेलेशन की गणना करने की कोशिश कर रहा हूं, जहां मेरे पास एकमात्र त्वरित आदिम उपलब्ध है (I) FFT। मुझे हालांकि एक समस्या हो रही है।

मैंने MATLAB में इसका प्रोटोटाइप बनाया । मैं, हालांकि, थोड़ा उलझन में हूं। मैंने मान लिया कि यह केवल निम्नानुसार काम करता है (यह स्मृति से माफी है अगर मैंने इसे थोड़ा गलत पाया है)।

 autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )

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

इसलिए मुझे यकीन है कि मुझे कुछ बहुत ही गलत करना चाहिए, लेकिन मैं अभी समझ नहीं पा रहा हूं।


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

जवाबों:


16

pichenettes सही है, ज़ाहिर है। एफएफटी एक वृत्ताकार कनविक्शन को लागू करता है जबकि xcorr () एक रैखिक कनवल्शन पर आधारित है। इसके अलावा आपको फ़्रीक्वेंसी डोमेन में निरपेक्ष मान को भी स्क्वायर करना होगा। यहां एक कोड स्निपेट है जो सभी शून्य पैडिंग, शिफ्टिंग और ट्रंकटिंग को संभालता है।

%% Cross correlation through a FFT
n = 1024;
x = randn(n,1);
% cross correlation reference
xref = xcorr(x,x);

%FFT method based on zero padding
fx = fft([x; zeros(n,1)]); % zero pad and FFT
x2 = ifft(fx.*conj(fx)); % abs()^2 and IFFT
% circulate to get the peak in the middle and drop one
% excess zero to get to 2*n-1 samples
x2 = [x2(n+2:end); x2(1:n)];
% calculate the error
d = x2-xref; % difference, this is actually zero
fprintf('Max error = %6.2f\n',max(abs(d)));

वाह कि एक सुंदर काम किया। मेरे पिच ट्रैकर का एक सीधा सी वर्जन (सिंगल थ्रेडेड, नो सिमड) 0.8 सेकंड में ऊपर चला गया, जो एक इंटेल परफॉर्मेंस आदिम बेस्ड वर्जन का विरोध करते हुए 0.4 सेकंड में चला गया। वह आश्चर्यजनक है! धन्यवाद
गोज़


3

एन2एन-1[-(एन-1),एन-1]0

2एन-12एन-12एन-12एन-1

एन2एन-1एन

एन-1एन2एन-102एन-12एन-1

संक्षेप में: आपको यह करना चाहिए था (अपनी प्रोग्रामिंग भाषा के अनुकूल होने के लिए):

autocorr = ifft( complex( abs(fft(inputData, n=2*N-1))**2, 0 ) )

या MATLAB में:

autocorr = ifft(abs(fft(inputData, 2*N-1)).^2)

0

Xcorr function के वांछित आउटपुट का मुख्य कारण FFT और IFFT फ़ंक्शन के अनुप्रयोग के समान नहीं है, क्योंकि इन फ़ंक्शन को सिग्नलों पर लागू करते समय अंतिम परिणाम परिपत्र रूप से विक्षेपित होता है

रैखिक कनवल्शन और परिपत्र कनवल्शन के बीच मुख्य अंतर में पाया जा सकता रैखिक और परिपत्र कनवल्शन

समस्या को प्रारंभिक रूप से सिग्नल को शून्य-पैड करके और IFFT के अंतिम आउटपुट को छोटा करके हल किया जा सकता है ।

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