2010-10-16 24 views
19

में एफएफटी का उपयोग करके स्वत: सहसंबंध की गणना करें मैंने कुछ स्पष्टीकरण पढ़े हैं कि एक सिग्नल के एफएफटी का उपयोग करके स्वत: सहसंबंध की गणना कैसे की जा सकती है, जटिल संयोग (चौकोर डोमेन) द्वारा वास्तविक भाग को गुणा करके, फिर विपरीत एफएफटी का उपयोग करके, लेकिन मुझे matlab में यह महसूस करने में परेशानी हो रही है क्योंकि विस्तृत स्तर पर, मुझे वास्तव में पता नहीं है कि मैं क्या कर रहा हूं। : ओ) किसी भी प्रकार की आत्माओं को कुछ कोड और ज्ञान साझा करने की परवाह है?मैटलैब

धन्यवाद!

+1

है (केवल यह ... गद्दी, सामान्य, वेक्टर/मैट्रिक्स इनपुट, आदि के सभी मामलों से निपटने के लिए है) वहां कुछ कारण है कि आप केवल MATLAB के मौजूदा ऑटोकोरेशन फ़ंक्शन का उपयोग नहीं कर सकते हैं आयन? (होमवर्क शायद?) –

+0

@ पॉल आर: 'xcorr' सिग्नल प्रोसेसिंग टूलबॉक्स का हिस्सा है। –

+1

@ ओली: ठीक है - मुझे लगता है कि ओपी में सिग्नल प्रोसेसिंग टूलबॉक्स नहीं है? मैं MATLAB के बजाय ऑक्टेव का उपयोग करता हूं और ऐसा लगता है कि xcorr है। –

उत्तर

25

आप वैसे ही जैसे कहा गया है, fft लेने के लिए और इसकी जटिल संयुग्म द्वारा pointwise गुणा, तो (या दो संकेतों के पार से संबंध के मामले में: Corr(x,y) <=> FFT(x)FFT(y)*) उलटा fft का उपयोग

x = rand(100,1); 
len = length(x); 

%# autocorrelation 
nfft = 2^nextpow2(2*len-1); 
r = ifft(fft(x,nfft) .* conj(fft(x,nfft))); 

%# rearrange and keep values corresponding to lags: -(len-1):+(len-1) 
r = [r(end-len+2:end) ; r(1:len)]; 

%# compare with MATLAB's XCORR output 
all((xcorr(x)-r) < 1e-10) 

वास्तव में, यदि आप xcorr.m के कोड को देखो, कि वास्तव में यह क्या कर रही है

+0

स्पॉट पर। बहुत बहुत धन्यवाद! – skj

+1

जटिल संयोग लेने के बजाय, आप एक सिग्नल को भी उलट सकते हैं और उसके बाद एफएफटी कर सकते हैं। आपके कार्यक्रम के आधार पर एक दूसरे की तुलना में आसान हो सकता है। – endolith

+0

आपको '2^nextpow2 (2 * len-1) 'पर पैड करने की आवश्यकता क्यों है और' 2^nextpow2 (len) '? – Marius

23

Wiener–Khinchin theorem द्वारा, फ़ंक्शन का पावर-स्पेक्ट्रल घनत्व (PSD) स्वत: सहसंबंध का फूरियर रूपांतरण है। निर्धारक सिग्नल के लिए, PSD फूरियर ट्रांसफॉर्म की परिमाण-वर्ग है। convolution theorem भी देखें।

जब फूरियर ट्रांसफॉर्म (यानी एफएफटी का उपयोग करके) की बात आती है, तो आपको वास्तव में चक्रीय स्वायत्तता मिलती है। उचित (रैखिक) स्वत: सहसंबंध प्राप्त करने के लिए, आपको फूरियर ट्रांसफॉर्म लेने से पहले मूल डेटा को मूल लंबाई से दो बार पैड करना होगा। तो कुछ की तरह:

x = [ ... ]; 
x_pad = [x zeros(size(x))]; 
X  = fft(x_pad); 
X_psd = abs(X).^2; 
r_xx = ifft(X_psd);