দক্ষতার সাথে এফএফটি ব্যবহার করে স্বতঃসংশোধন গণনা করা


12

আমি এমন প্ল্যাটফর্মে একটি স্বতঃসংশোধন গণনা করার চেষ্টা করছি যেখানে আমার পাওয়া কেবলমাত্র ত্বক আদিম হ'ল (আই) এফএফটি। যদিও আমার একটা সমস্যা হচ্ছে

আমি এটি ম্যাটল্যাবে প্রোটোটাইপ করেছি । আমি অবশ্য কিছুটা বিভ্রান্ত। আমি ধরে নিয়েছি যে এটি কেবল নীচের মত কাজ করে (এটি কিছুটা ভুল হয়ে থাকলে মেমোরি থেকে ক্ষমা প্রার্থনা করি)।

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

তবে আমি xcorrফাংশনটি ব্যবহার করে যা পেয়েছি তার থেকে আলাদা ফলাফল পাচ্ছি । এখন আমি সম্পূর্ণরূপে অটো সংযোগের বাম দিকটি না পাওয়ার প্রত্যাশা করছি (কারণ এটি ডান হাতের প্রতিচ্ছবি এবং সুতরাং যেভাবে প্রয়োজন নেই)। তবে সমস্যাটি হ'ল আমার ডান হাতটি নিজে থেকেই দেখা যাচ্ছে অর্ধেক পয়েন্টের চারপাশে প্রতিফলিত হয়েছে। যার কার্যকরভাবে অর্থ হল যে আমি যে পরিমাণ ডেটা আশা করছিলাম তার প্রায় অর্ধেক পরিমাণ আমি পেয়েছি।

সুতরাং আমি নিশ্চিত যে আমি অবশ্যই খুব সাধারণ কিছু ভুল করছি, তবে আমি কী বুঝতে পারি না।


1
সতর্ক হোন. ডেটা নির্ধারণাত্মক না হলে আমরা সাধারণত স্বতঃসংশোধের ক্রমটি অনুমান করতে পারি । স্বতঃসিদ্ধকরণের অনুমানের দুটি সাধারণ সংস্করণ রয়েছে: পক্ষপাতদুষ্ট এবং পক্ষপাতহীন। স্বতঃসংশ্লিষ্ট হিসাবের ভিত্তিতে নিরপেক্ষ ফলাফল যা পরিসংখ্যানগতভাবে নিরপেক্ষ। যাইহোক, উচ্চ ক্রম পিছনে জন্য বৈকল্পিকতা খুব বড় হতে পারে, উদাহরণস্বরূপ ম্যাট্রিক্স বিপরীতে যদি অটোকোররিলেশন অনুমান ব্যবহৃত হয় তবে সমস্যা দেখা দেয়। পক্ষপাতদুষ্ট নমুনাগুলি পরিসংখ্যানগত পক্ষপাত প্রদর্শন করে তবে কম বৈকল্পিক (এবং এর অর্থ বর্গ ত্রুটি)। উভয়ই পরিসংখ্যানগতভাবে সামঞ্জস্যপূর্ণ। আপনার উপরে একটি অস্বাভাবিক পক্ষপাতদুষ্ট অনুমান আছে।
— ব্রায়ান

উত্তর:


16

পিকনেটস অবশ্যই, ঠিক আছে। এফএফটি একটি বৃত্তাকার সমাবর্তন প্রয়োগ করে যখন 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 সেকেন্ডে চলেছিল ran এটা আশ্চর্যজনক! ধন্যবাদ
— Goz


3

N2N−1[−(N−1),N−1]0

2N−12N−12N−12N−1

N2N−1N

N−1N2N−102N−12N−1

সংক্ষেপে: আপনার এটি করা উচিত ছিল (আপনার প্রোগ্রামিং ভাষার সাথে খাপ খাইয়ে নিতে):

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

বা ম্যাটল্যাবে:

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

0

Xcorr ফাংশনটির কাঙ্ক্ষিত আউটপুটের মূল কারণ এফএফটি এবং আইএফএফটি ফাংশনের প্রয়োগের সাথে সাদৃশ্যপূর্ণ নয় কারণ এই ফাংশনটি সংকেতগুলিতে প্রয়োগ করার সময় চূড়ান্ত ফলাফলটি বৃত্তাকারভাবে সংশ্লেষিত হয় ।

লিনিয়ার সংবর্তন এবং সার্কুলার সংবর্তন মধ্যে মূল পার্থক্য খুঁজে পাওয়া যেতে পারে লিনিয়ার এবং সার্কুলার সংবর্তন ।

প্রাথমিকভাবে সিগন্যাল -প্যাডিং এবং আইএফএফটি-র চূড়ান্ত আউটপুট কেটে দিয়ে সমস্যার সমাধান করা যেতে পারে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.