আমি তাত্ক্ষণিক ফ্রিকোয়েন্সি গণনা করার নীতিতে নতুন এবং এটি নিয়ে প্রচুর প্রশ্ন নিয়ে এসেছি। আপনি এই পাঠ্যের শেষে বুলেট-পয়েন্ট তালিকার মধ্যে সমস্তটি খুঁজে পান। লেখাটি কিছুটা দীর্ঘ হতে পারে, এর জন্য আমাকে ক্ষমা করুন, কিন্তু আমি সত্যিই নিজের থেকেই সেই সমস্যাটি নিয়ে কাজ করার চেষ্টা করেছি।
সুতরাং আমি আসল মূল্যবান সিগন্যাল এর তাত্ক্ষণিক ফ্রিকোয়েন্সি । গণনাটি বিশ্লেষণী সংকেত , যেখানে হল হিলবার্ট রূপান্তর ।
বিশ্লেষণী সংকেত থেকে তাত্ক্ষণিক ফ্রিকোয়েন্সি গণনা করার জন্য আমি কাগজটি অনুসরণ করেছি:
1992 থেকে আর্থার ই বার্নসের তাত্ক্ষণিক ফ্রিকোয়েন্সি এবং তাত্ক্ষণিক ব্যান্ডউইথের গণনা this এই কাগজে তিনি তাত্ক্ষণিক ফ্রিকোয়েন্সি গণনা করার জন্য একাধিক পদ্ধতি প্রবর্তন করেছেন। আমি লিখে রাখলাম, তিনি প্রস্তাবিত সমস্ত সূত্র (এবং আমি ব্যবহার করেছি) এক মুহুর্তে।
"শেখার" জন্য, আমি ম্যাটল্যাব-এ খুব সাধারণ এবং দুটি আরও জটিল জটিল সংকেত নিয়ে খেললাম এবং তাদের তাত্ক্ষণিক ফ্রিকোয়েন্সি পেতে চেয়েছিলাম।
Fs = 1000; % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs; % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2); % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10); % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10); % chirp * sin(10Hz), signal 3
এই তিনটি সিগন্যালের টাইম ডোমেনের প্লটগুলি নিম্নলিখিতটি দেখায়:
কাগজ থেকে সমস্ত পদ্ধতি প্রয়োগ করার পরে যে তাত্ক্ষণিক ফ্রিকোয়েন্সি পেয়েছি তার প্লটগুলি হ'ল:
খাঁটি চিপ সংকেতের তাত্ক্ষণিক ফ্রিকোয়েন্সি : যুক্ত সাইনোসয়েডের সাথে চিপ সিগন্যালের তাত্ক্ষণিক ফ্রিকোয়েন্সি : মোডুলেটেড চিপ সিগন্যালের তাত্ক্ষণিক ফ্রিকোয়েন্সি: দয়া করে নোট করুন, তিনটি চিত্রের মধ্যে, প্লট 3 এবং 4 এর y- অক্ষটি জুমযুক্ত, সুতরাং সেইগুলির বিস্তৃতিগুলি সিগন্যাল খুব ছোট!
তাত্ক্ষণিক ফ্রিকোয়েন্সি থেকে বিশ্লেষণী সংকেত থেকে পাওয়ার প্রথম সম্ভাবনা হ'ল:
যেখানে তাত্ক্ষণিক পর্যায়ে। আমি মনে করি এটি বর্তমানে ব্যবহৃত সবচেয়ে সাধারণ পদ্ধতি, কমপক্ষে ম্যাটল্যাবের ওয়েবপৃষ্ঠায় এটি সেভাবে গণনা করা হয়। কোডটি নিম্নলিখিতটি দেখায়:
function [instantaneous_frequency] = f2(analytic_signal,Fs)
factor = Fs/(2*pi);
instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
% Insert leading 0 in return-vector to maintain size
instantaneous_frequency = [0 instantaneous_frequency];
end
কাগজে বার্নস এখন বিশ্লেষণী সংকেত থেকে তাত্ক্ষণিক ফ্রিকোয়েন্সি গণনা করার জন্য আরও চারটি উপায় (বা বরং সংকলিত বলেছে) পরামর্শ দেয়। তিনি উপরের সূত্রটিও উল্লেখ করেছেন, তবে এই মতামতটি যে পর্যায়টির অস্পষ্টতার কারণে এটি ব্যবহারিক নয়। আমার ধারণা, তিনি unwrap()
পদ্ধতি সম্পর্কে জানতেন না , বা এর পিছনে আরও গণিতটি সুনির্দিষ্ট করে তুলতে পারেন। (তাত্ক্ষণিক ফ্রিকোয়েন্সিগুলিতে অন্য কোনও উত্স কোডের দিকে তাকানোর সময় আমি নিজেই সেই পদ্ধতিটি সম্পর্কে আজ শিখেছি)
তার কাগজে সূত্রে লেবেল নম্বর (2) রয়েছে, অতএব, আমি চ (টি) সূচকটি 2 দিয়েছিলাম other
ধাপে অস্পষ্টতার কারণে, তিনি বরং পরামর্শ দিয়েছেন:
function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
x = real(analytic_signal);
y = imag(analytic_signal);
diff_x = diff(x);
diff_y = diff(y);
factor = Fs/(2*pi);
a = x(2:end).*diff_y;
b = y(2:end).*diff_x;
c = x(2:end).^2;
d = y(2:end).^2;
instantaneous_frequency = factor * ((a-b)./(c+d));
% Insert leading 0 in return-vector to maintain size
instantaneous_frequency = [0 instantaneous_frequency];
end
তারপরে বার্নার আরও তিনটি সূত্র দিয়েছেন যার নাম তিনি "তাত্ক্ষণিক ফ্রিকোয়েন্সি আনুমানিকতা" রেখেছেন:
function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
x = real(analytic_signal);
y = imag(analytic_signal);
factor = Fs/(2*pi*T);
a = x(1:end-T).*y(1+T:end);
b = x(1+T:end).*y(1:end-T);
c = x(1:end-T).*x(1+T:end);
d = y(1:end-T).*y(1+T:end);
instantaneous_frequency = factor.*atan((a-b)./(c+d));
% Append 0 to return-vector to maintain size
instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end
function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
x = real(analytic_signal);
y = imag(analytic_signal);
factor = Fs/(4*pi*T);
a = x(1:end-2*T).*y(1+2*T:end);
b = x(1+2*T:end).*y(1:end-2*T);
c = x(1:end-2*T).*x(1+2*T:end);
d = y(1:end-2*T).*y(1+2*T:end);
instantaneous_frequency = factor.*atan((a-b)./(c+d));
% Append and insert 0s to maintain size
instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end
function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
x = real(analytic_signal);
y = imag(analytic_signal);
factor = 2*Fs/(pi*T);
a = x(1:end-T).*y(1+T:end);
b = x(1+T:end).*y(1:end-T);
c = (x(1:end-T)+x(1+T:end)).^2;
d = (y(1:end-T)+y(1+T:end)).^2;
instantaneous_frequency = factor * ((a-b)./(c+d));
% Append and insert 0s to maintain size
instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end
সমস্ত 3 অনুমানের মধ্যে সূত্র টি টি Fs (T = Fs = 1000 = 1s) তে সেট করা হয়েছিল, যেমনটি কাগজে প্রস্তাবিত হয়েছিল।
এখন আমার প্রশ্নগুলি হ'ল:
- সূত্রগুলি f2 এবং f3 খাঁটি চিপ সংকেতের জন্য একই ফলাফলটি দেয়। আমি মনে করি এটি ভাল, তারা যেমন গণনা করে। তিনটি অনুমানের পদ্ধতিটি একই রকম হয় না, এমনকি এমন কিছুও নয় যা এর কাছাকাছি থাকে! কেন এই রকম ক্ষেত্রে? (আমি আশা করি এটি কেবল প্রোগ্রামিং-বাগ নয় ...)
- যদিও তারা একই ফেরত দেয়, বিশেষত চক্রান্তের শেষে তারা অনেকটা 'উইগল' করা শুরু করে । এর ব্যাখ্যা কী? আমি প্রথমে এলিয়াসিংয়ের মতো কিছু নিয়ে ভাবলাম, তবে সংকেতগুলির ফ্রিকোয়েন্সিয়ের তুলনায় আমার স্যাম্পলিং ফ্রিকোয়েন্সি বেশ বেশি, তাই আমি মনে করি এটি বাদ দেওয়া যেতে পারে।
কমপক্ষে f2 এবং f3 খাঁটি চিপ সিগন্যালটিতে উপযুক্ত বলে মনে হয়, তবে সিগন্যালে একাধিক ফ্রিকোয়েন্সি আসে, তবে f2 এবং f3 সহ সমস্ত পদ্ধতি ভয়ঙ্কর ব্যর্থ বলে মনে হয়। বাস্তবে সিগন্যালে একাধিক ফ্রিকোয়েন্সি থাকা সবসময় ক্ষেত্রে হয়। তাহলে কীভাবে একজন (তত বেশি বা কম) সঠিক তাত্ক্ষণিক ফ্রিকোয়েন্সি পেতে পারেন?
- যখন আমি একাধিক ফ্রিকোয়েন্সি সংকেত উপস্থিত হয় তখন আমি কী প্রত্যাশা করব তা আসলে আমি জানি না। গণনাটি একটি নির্দিষ্ট সময়ের জন্য একটি সংখ্যা ফেরত দেয়, সুতরাং এখানে যখন আরও বেশি ফ্রিকোয়েন্সি উপস্থিত থাকে তখন এটি কী করা উচিত? সমস্ত ফ্রিকোয়েন্সিগুলির গড় বা এরকম কিছু ফিরিয়ে দিন?
এবং আমার সম্ভবত সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন হ'ল এটি কীভাবে বাস্তব এবং বিশদযুক্ত সফ্টওয়্যারটিতে পরিচালিত হয়? ধরা যাক আমি ১. s৫ এস তে সংশোধিত সিগন্যালের তাত্ক্ষণিক ফ্রিকোয়েন্সি জানতে চাই এবং আমি 'ভাগ্যবান' হতে পারার চেয়ে আমি পদ্ধতি f2 বেছে নিয়েছি এবং সম্ভবত [উত্তর] সম্ভবত 6 এর কাছাকাছি একটি নম্বর পেয়েছি যা সম্ভবত সঠিক উত্তর, বা আমি এর পাশের কয়েকটি ফলাফল আমার ফলাফলগুলি বাছাই করুন এবং হঠাৎ আমি কিছু তারযুক্ত হয়ে উঠি, উচ্চতর পথে, ফলাফল, কারণ দুর্ভাগ্যক্রমে আমি স্পাইকের একটি মান বাছাই করেছি। কীভাবে এটি পরিচালনা করা যায়? গড় বা এমনকি আরও ভাল একটি মিডিয়া ফিল্টার সহ পোস্টপ্রসেসিংয়ের মাধ্যমে? আমি মনে করি এমনকি এটি সম্ভবত খুব কঠিন হতে পারে বিশেষত এমন অঞ্চলে যেখানে অনেকগুলি স্পাইক একে অপরের পাশে থাকে।
এবং একটি শেষ, এতটা গুরুত্বপূর্ণ প্রশ্ন নয় যে কেন আমি তাত্ক্ষণিক ফ্রিকোয়েন্সিগুলিতে সন্ধান করি তা বেশিরভাগ কাগজপত্রগুলি ভূগোলের ক্ষেত্র থেকে, বিশেষত ভূমিকম্পের মতো ভূমিকম্প সংক্রান্ত ঘটনা গণনার ক্ষেত্রে। বার্নের কাগজও এটিকে উদাহরণ হিসাবে গ্রহণ করে। তাত্ক্ষণিক ফ্রিকোয়েন্সি কি অনেক ক্ষেত্রে আকর্ষণীয় নয়?
এটি এখনও অবধি, আমি প্রতিটি জবাবের জন্য অত্যন্ত কৃতজ্ঞ, বিশেষত যখন কেউ আমাকে কীভাবে এটি একটি বাস্তব সফ্টওয়্যার প্রকল্পে প্রয়োগ করতে হয় তার জন্য টিপস দেয় ;)
দয়া, প্যাট্রিক