একটি একক ফ্রিকোয়সি জন্য পর্যায়টি গণনা করার জন্য কি অ্যালগরিদম আছে?


17

আপনার যদি ফাংশন থাকে এবং রেফারেন্স পাপ তরঙ্গ গণনা করার জন্য একটি দ্রুত অ্যালগরিদম কী হবে ?পাপ ( ω x ) ϕ ϕf(t)=Asin(ωt+ϕ)sin(ωx)ϕ

আমি গের্তজেল অ্যালগরিদমের দিকে তাকিয়ে ছিলাম , তবে মনে হচ্ছে এটি পর্যায়ের সাথে মোকাবেলা করবে না?

উত্তর:


5

নির্দিষ্ট ফ্রিকোয়েন্সি এ একটি ডিএফটি ব্যবহার করুন। তারপরে রিয়েল / ইমেজ অংশগুলি থেকে পরিমিত প্রশস্ততা এবং ধাপ। এটি আপনাকে স্যাম্পলিংয়ের সময় শুরুর সাথে সম্পর্কিত পর্ব দেয়।

একটি 'সাধারণ' এফএফটি (বা সমস্ত এন হারমোনিক্সের জন্য একটি ডিএফটি গণিত), আপনি সাধারণত এফ = কে * (স্যাম্পল_রেট) / এন দিয়ে ফ্রিকোয়েন্সি গণনা করেন, যেখানে কে একটি পূর্ণসংখ্যা। যদিও এটি ত্যাগমূলক বলে মনে হতে পারে (বিশেষত চার্চ অফ দ্য হোলি পূর্ণসংখ্যার সদস্যদের কাছে), আপনি যখন একটি একক ডিএফটি করার সময় আপনি আসলে অ-পূর্ণসংখ্যার মানগুলি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, ধরুন আপনি 27 Hz এর সাইন ওয়েভের N = 256 পয়েন্ট তৈরি করেছেন (বা প্রাপ্ত করেছেন)। (আসুন, নমুনা_রেট = 200) বলুন। 256 পয়েন্ট এফএফটি (বা এন পয়েন্ট ডিএফটি) এর জন্য আপনার 'স্বাভাবিক' ফ্রিকোয়েন্সিগুলি এর সাথে সম্পর্কিত হবে: f = k * (নমুনা_রেট) / এন = কে * (200) / 256, যেখানে কে একটি পূর্ণসংখ্যা। তবে 34.56 এর একটি অ-পূর্ণসংখ্যার 'কে' উপরের তালিকাভুক্ত প্যারামিটারগুলি ব্যবহার করে 27 হার্জ। এটি এমন একটি ডিএফটি 'বিন' তৈরির মতো যা আগ্রহের ফ্রিকোয়েন্সি (27 হার্জ।) -কে কেন্দ্র করে। কিছু সি ++ কোড (ডিভিসি ++ সংকলক) নীচের মত দেখতে পারে:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;

// arguments in main needed for Dev-C++ I/O
int main (int nNumberofArgs, char* pszArgs[ ] ) {
const long N = 256 ;
double sample_rate = 200., amp, phase, t, C, S, twopi = 6.2831853071795865; 
double  r[N] = {0.}, i[N] = {0.}, R = 0., I = 0. ;
long n ;

// k need not be integer
double k = 34.56;

// generate real points
for (n = 0; n < N; n++) {
    t =  n/sample_rate;
    r[n] = 10.*cos(twopi*27.*t - twopi/4.);
}  // end for

// compute one DFT
for (n = 0; n < N; n++) {
    C = cos(twopi*n*k/N); S = sin(twopi*n*k/N);
    R = R + r[n]*C + i[n]*S;
    I = I + i[n]*C - r[n]*S;
} // end for

cout<<"\n\ndft results for N = " << N << "\n";
cout<<"\nindex k     real          imaginary       amplitude         phase\n";

amp = 2*sqrt( (R/N)*(R/N) + (I/N)*(I/N) ) ;
phase = atan2( I, R ) ;
// printed R and I are scaled
printf("%4.2f\t%11.8f\t%11.8f\t%11.8f\t%11.8f\n",k,R/N,I/N,amp,phase);

cout << "\n\n";
system ("PAUSE");
return 0;
} // end main

//**** end program

(পিএস: আমি আশা করি উপরেরগুলি উপরের স্ট্যাকওভারফ্লোতে ভাল অনুবাদ করেছে - এর কিছুটা হয়ত গুটিয়ে যাবে)

উপরের ফলাফলটি -twopi / 4 এর একটি পর্যায়, উত্পন্ন আসল পয়েন্টগুলিতে দেখানো হয়েছে (এবং পোস্ট / নেপ ফ্রিকোয়েন্সি প্রতিফলিত করার জন্য অ্যাম্প দ্বিগুণ হয়)।

কয়েকটি বিষয় লক্ষণীয় - আমি পরীক্ষার তরঙ্গরূপ উত্পন্ন করতে এবং ফলাফল ব্যাখ্যা করতে কোসাইন ব্যবহার করি - আপনাকে সে সম্পর্কে সতর্ক থাকতে হবে - সময়টি 0 = 0 এর সাথে উল্লেখ করা হয়, আপনি যখন নমুনা শুরু করেছিলেন (যেমন: আপনি যখন সংগ্রহ করেছিলেন [0] ), এবং কোসাইন হ'ল সঠিক ব্যাখ্যা)।

উপরের কোডটি মার্জিত বা দক্ষ নয় (উদাহরণস্বরূপ: পাপ / কোস মান ইত্যাদির জন্য সন্ধানের টেবিলগুলি ব্যবহার করুন)।

আপনি বৃহত্তর এন ব্যবহার করার সাথে সাথে আপনার ফলাফলগুলি আরও নির্ভুল হয়ে উঠবে এবং উপরের নমুনা হার এবং এন একে অপরের গুণক নয় এই কারণে কিছুটা ত্রুটি ঘটেছে।

অবশ্যই, আপনি যদি আপনার নমুনার হার, N বা f পরিবর্তন করতে চান তবে আপনাকে কোড এবং কে এর মানটি পরিবর্তন করতে হবে। অবিচ্ছিন্ন ফ্রিকোয়েন্সি লাইনের যে কোনও জায়গায় আপনি ডিএফটি বিনটি নিমজ্জিত করতে পারেন - কেবলমাত্র নিশ্চিত হন যে আপনি কে এর মান ব্যবহার করছেন যা আগ্রহের ফ্রিকোয়েন্সিটির সাথে মিলে যায়।


এই পদ্ধতির উন্নতি N কে সামঞ্জস্য করে পুরোটিকে আরও কাছাকাছি করে তোলা যেতে পারে। আমি একটি পৃথক উত্তর পোস্ট করেছি যা এই অ্যালগরিদমের যথার্থতাকে প্রভাবিত করে।
মোজুবা

10

সমস্যাটি (ননলাইনার) সর্বনিম্ন-স্কোয়ার সমস্যা হিসাবে তৈরি করা যেতে পারে:

F(ϕ)=12i=1n[Asin(ωi+ϕ)fi(ω)]2

যেখানে থেকে সম্মান সঙ্গে কমান উদ্দেশ্য ফাংশন ।F(ϕ)ϕ

ডেরাইভেটিভ খুব সহজ:

F(ϕ)=i=1nAcos(ωi+ϕ)[Asin(ωi+ϕ)fi(ω)]

উপরোক্ত উদ্দেশ্য ফাংশনটি গ্রেডিয়েন্ট বংশোদ্ভূত পদ্ধতি (প্রথম অর্ডার আনুমানিক), নিউটন পদ্ধতি , গাউস-নিউটন পদ্ধতি বা লেভেনবার্গ-মার্কোয়ার্ড পদ্ধতি (দ্বিতীয় ক্রমের আনুমানিক - প্রয়োজন রয়েছে ব্যবহার করে পুনরাবৃত্তভাবে হ্রাস করা যায়।F(ϕ)

স্পষ্টতই, পর্যায়ক্রমিকতার কারণে উপরের উদ্দেশ্যমূলক ফাংশনটিতে একাধিক মিনিমা রয়েছে, সুতরাং অন্য মিনিমাকে বৈষম্যমূলক করার জন্য কিছু দণ্ডের শর্ত যুক্ত করা যেতে পারে (উদাহরণস্বরূপ, মডেল সমীকরণে adding যোগ করা )। তবে আমি মনে করি অপ্টিমাইজেশনটি কেবল নিকটতম মিনিমে রূপান্তরিত হবে এবং আপনি বিয়োগ করে ফলাফল আপডেট করতে পারবেন । 2 π কে , কে এনϕ22πk,kN


আমি মনে করি না কোন সময়সীমার কারণে আপনাকে শাস্তি দিতে হবে? আপনি কেবলমাত্র পর্যায় স্থানের মিনিমাকে নিতে পারেন এটি রূপান্তর করে এবং একটি মডুলু , না? 2π
স্পেসি

@ মোহাম্মদ হ্যাঁ, তবে কিছু অপ্টিমাইজেশান কৌশলগুলি একাধিক সূচনা পয়েন্টগুলি ব্যবহার করতে পারে যা একই মানকে রূপান্তর করতে পারে বা একক গ্লোবাল মিনিমাইজারের সাথে উত্তল ফাংশন ধরে নেওয়া উচিত যা চতুষ্কোণের সাথে ভালভাবে অনুমান করা যায়। অন্যান্য সুবিধার যে আমরা যেকোনো শুরুর স্থান জন্য একই ফলাফল দিয়ে শেষ হয় । ϕ0
Libor

মজাদার. আমি কি আপনাকে এই সম্পর্কিত প্রশ্নটিতে ক্র্যাক নিতে আমন্ত্রণ জানাতে পারি ? :-)
স্পেসি

@ মোহাম্মদ ওকে, আমি সেখানে কিছুটা অবদান রেখেছি :)
Libor

ফাংশন ফাই (ডাব্লু) কোথায় যায়? ফাই (ডাব্লু) কোনও ধ্রুবক নয় তাই যখন আপনি কোনও ধ্রুবককে ডেরিভেটিভ নেন তখন এটি শূন্য হয় কীভাবে?
স্যামফিশার 83

5

গের্তজেল অ্যালগরিদমের বিভিন্ন ধরণের সূত্র রয়েছে। যেগুলি 2 টি স্টেট ভেরিয়েবল (অরথগোনাল বা তার কাছাকাছি) সরবরাহ করে, বা একটি জটিল রাষ্ট্র পরিবর্তনশীল, সম্ভাব্য আউটপুটগুলি প্রায়শই গের্তজেল উইন্ডোতে কিছু পয়েন্ট যেমন মধ্যম হিসাবে রেফারেন্স সহ পর্যায়টি গণনা বা অনুমানের জন্য ব্যবহার করা যেতে পারে। যেগুলি একা একক স্কেলারের আউটপুট সরবরাহ করে তা সাধারণত পারে না।

আপনার গুর্তজেল উইন্ডোটি আপনার সময়ের অক্ষের সাথে সম্পর্কিত কিনা তাও আপনাকে জানতে হবে।

যদি আপনার সিগন্যালটি আপনার গোর্তজেল উইন্ডোতে ঠিক পূর্ণসংখ্যার পর্যায়ক্রমিক না হয় তবে উইন্ডোর মাঝখানে কোনও রেফারেন্স পয়েন্টের চারপাশের পর্যায়টির অনুমানটি আরও সঠিক হতে পারে তবে শুরুতে বা শেষের দিকে রেফারেন্সিং পর্বটি।

আপনি যদি আপনার সংকেতের ফ্রিকোয়েন্সি জানেন তবে একটি পূর্ণ এফএফটি ওভারকিল হয়। এফএফটি দৈর্ঘ্যে পর্যায়ক্রমে নয় এমন একটি ফ্রিকোয়েন্সিটিতে একটি গুর্তজেল টিউন করা যেতে পারে, অন্যদিকে একটি এফএফটি-অন-পিরিয়ড-ইন-উইন্ডো ফ্রিকোয়েন্সিগুলির জন্য অতিরিক্ত ইন্টারপোলেশন বা শূন্য প্যাডিংয়ের প্রয়োজন।

একটি জটিল গের্তজেল একটি ডিএফটি-র 1 টি বিনের সমতুল্য যা কোসাইন এবং সাইন ভিত্তি ভেক্টর বা এফএফটি ট্যুইডল ফ্যাক্টরগুলির জন্য পুনরাবৃত্তি ব্যবহার করে।


ঠিক একই নির্ভুলতার উইন্ডোর মধ্যে কোথাও এই পর্বের অনুমান নয়, কারণ আপনি উইন্ডোটির শুরুতে পর্বের প্রাক্কলনের সাথে যুক্ত করে উইন্ডোর মধ্যে নমুনা পর্বের অনুমান গণনা করতে চান ( উইন্ডো শুরু)? কে কে =ωkkk=0
অলি নিমিত্তালো

না, কারণ উইকিপিডিয়া যুক্ত করার ফলে উইন্ডোটির শেষের দিকে অ-পূর্ণসংখ্যার-পিরিয়ডিক-ইন-অ্যাপারচার সাইনোসয়েডের চেয়ে শুরুতে ভিন্ন ধাপে ফলাফল পাওয়া যায় results কিন্তু 1-বিন ডিএফটি একই বিন্দুতে একটি একক বিজ্ঞপ্তি পর্যায়ে গণনা করে। সুতরাং 3 টি মানগুলি পৃথক হবে। তবে কেন্দ্র পর্বটি সর্বদা বিজোড় / এমনকি ফাংশনের অনুপাতের সাথে সম্পর্কিত, এফ 0 যাই হোক না কেন।
হটপাউ 2

চেষ্টা করছি, কিন্তু আমি তা পাই না।
ওলি নিমিত্তালো

একটি কোসাইন ব্যবহার করুন (কে = 0 তে শূন্যের পর্যায়), ফ্রিকোয়েন্সিটি সামান্য সামান্য ঝাঁকুনি করুন (একটি ক্ষুদ্র অযৌক্তিক সংখ্যার দ্বারা, তবে কে = 0 তে পর্বটি পরিবর্তন না করে)। একটি ডিএফটি জানিয়েছে পর্বটি বদলে গেছে! ঠিক = কে / এন / ২ এ কেন্দ্রিক একটি কোসাইন দিয়ে চেষ্টা করুন। কোনও ডিএফের জন্য কে = এন / 2 এ কোনও পরিবর্তন নেই। পাপ বা যে কোনও মিশ্রণের জন্য একই। ফেজ রেফারেন্স পয়েন্টকে কেন্দ্র করে f0 এর পরিবর্তনের সাথে পরিমাপক পর্যায়ে কম পরিবর্তন দেখা যায়। যেমন ফ্রিকোয়েন্সি ত্রুটি বৃদ্ধি পর্ব পরিমাপ ত্রুটিগুলিতে অবদান রাখে না।
হটপাউ 2

1
হ্যাঁ, সাইনোসয়েড এবং গের্তজেল ফিল্টার যদি বিভিন্ন ফ্রিকোয়েন্সিতে থাকে তবে উইন্ডোটির কেন্দ্রে ফেজ অনুমানের ত্রুটি কম হওয়া অর্থবোধ করে। সেক্ষেত্রে, পর্বের আনুমানিক উইন্ডোটির শেষে বলা হয় একটি ধ্রুবক দ্বারা পক্ষপাতদুষ্ট যা কেন্দ্র এবং উইন্ডোর শেষের মধ্যে দূরত্ব এবং সাইনোসয়েড এবং গের্তজেল ফিল্টার ফ্রিকোয়েন্সিগুলির মধ্যে পার্থক্য। এই পক্ষপাতিত্বকে বিয়োগ করা কেন্দ্রের অনুমান হিসাবে একই আকারের ত্রুটি দেয় তবে এটি সাইনোসয়েডের ফ্রিকোয়েন্সিটি জানতে হবে।
অলি নিমিত্তো

4

যদি আপনার সিগন্যালগুলি শব্দহীন থাকে তবে আপনি উভয়ই শূন্য ক্রসিং সনাক্ত করতে পারেন এবং ফ্রিকোয়েন্সি এবং আপেক্ষিক পর্যায়ে নির্ধারণ করতে পারেন।


3

এটি আপনার "দ্রুত" এর সংজ্ঞা কী, আপনি কীভাবে আপনার অনুমান চান বা আপনার স্যাম্পলিংগুলির সাথে তুলনামূলক পর্ব চান এবং আপনার ফাংশন এবং রেফারেন্স সাইন ওয়েভ সম্পর্কে কতটা শব্দ আছে তা নির্ভর করে dependsϕ

এটি করার একটি উপায় হ'ল এর FFT নেওয়া এবং ome নিকটতম । ωf(t)ω যাইহোক, এটি বিন কেন্দ্রের ফ্রিকোয়েন্সিটির কাছাকাছি থাকার উপর নির্ভর করবে ।ω

তাই:

  • "দ্রুত" বলতে কী বোঝ?
  • আপনার অনুমানের কতটা সঠিক দরকার?
  • আপনি কি নমুনা শুরুর তুলনায় (রেফারেন্সের তুলনায় ফেজ) বা পর্ব চান? এটা কোন ব্যাপার?ϕ
  • প্রতিটি সিগন্যালে শব্দ স্তর কী?

PS: আমি ধরে নিচ্ছি আপনি চেয়ে ।f(t)=Asin(ωt+ϕ)f(t)=Asin(ωx+ϕ)


2

শুরুর পয়েন্ট:
1) আপনার সংকেত এবং রেফারেন্সের পাপ তরঙ্গকে গুণ করুন: = এসিন (+ + ϕ) inসিন (ωt) = 0.5⋅A⋅ (কোস (ϕ) - কোস (2⋅ωt + ϕ) ) 2) সময়কালে অবিচ্ছেদ্য সন্ধান করুন : 3) আপনি গণনা করতে পারেন :
টি = π / ω আমি ( φ ) = টি 0 এফ ( T ) টন = 0.5 একটি গুলি ( φ ) টি φ গুলি ( φ ) = আমি ( T ) / ( 0.5 একটি টি )F(t)
T=π/ω
I(ϕ)=0TF(t)dt =0.5Acos(ϕ)T
ϕ
cos(ϕ)=I(t)/(0.5AT)

সম্পর্কে চিন্তা করুন:
কীভাবে পরিমাপ করবেন?
কিভাবে নির্ধারণ করতে মধ্যে ব্যবধান? ("রেফারেন্স কোস ওয়েভ" সম্পর্কে ভাবেন )0 .. ( 2 π )ϕ0..(2π)

বিচ্ছিন্ন সিগন্যালের জন্য অখণ্ডার যোগফল পরিবর্তন করুন এবং সাবধানে টি নির্বাচন করুন!


1

আপনি এটিও করতে পারেন (ছদ্মবেশী স্বরলিপিতে):

np.arctan( (signal*cos).sum() / (signal*sin).sum() ))

যেখানে সংকেতটি আপনার পর্যায়-স্থানান্তরিত সংকেত, কোপ এবং পাপ হ'ল রেফারেন্স সিগন্যাল এবং আপনি দুটি পণ্যের সংমিশ্রনের মাধ্যমে একটি নির্দিষ্ট সময়ের মধ্যে একটি ইন্টিগ্রালের একটি অনুমানের উত্পন্ন করেন।


0

ভগ্নাংশ বিন সূচক সহ একক ফ্রিকোয়েন্সি ডিএফটি ব্যবহার করার জন্য @ কেভিন ম্যাকগির পরামর্শে এটি একটি উন্নতি। কেভিনের অ্যালগরিদম দুর্দান্ত ফলাফল দেয় না: অর্ধেকটি এবং পুরো পাত্রে এটি খুব সুনির্দিষ্ট, পুরোপুরি এবং অর্ধেকের কাছাকাছিও এটি খুব ভাল, তবে অন্যথায় ত্রুটি 5% এর মধ্যে থাকতে পারে, যা সম্ভবত বেশিরভাগ কাজের জন্য গ্রহণযোগ্য নয় probably ।

আমি সামঞ্জস্য করে কেভিনের অ্যালগরিদম উন্নত করার পরামর্শ দিচ্ছি , অর্থাৎ ডিএফটি উইন্ডোর দৈর্ঘ্য যাতে যতটা সম্ভব পুরোটা কাছে যায়। এটি FFT এর বিপরীতে কাজ করে, DFT এর এর 2 শক্তি হওয়ার প্রয়োজন হয় না ।NkN

নীচের কোডটি সুইফটে রয়েছে, তবে স্বজ্ঞাগতভাবে এটি পরিষ্কার হওয়া উচিত:

let f = 27.0 // frequency of the sinusoid we are going to generate
let S = 200.0 // sampling rate
let Nmax = 512 // max DFT window length
let twopi = 2 * Double.pi

// First, calculate k for Nmax, and then round it
var k = round(f * Double(Nmax) / S)

// The magic part: recalculate N to make k as close to whole as possible
// We also need to recalculate k once again due to rounding of N. This is important.
let N = Int(k * S / f)
k = f * Double(N) / S

// Generate the sinusoid
var r: [Double] = []
for i in 0..<N {
    let t = Double(i) / S
    r.append(sin(twopi * f * t))
}

// Compute single-frequency DFT
var R = 0.0, I = 0.0
let twopikn = twopi * k / Double(N)
for i in 0..<N {
    let x = Double(i) * twopikn
    R += r[i] * cos(x)
    I += r[i] * sin(x)
}
R /= Double(N)
I /= Double(N)

let amp = 2 * sqrt(R * R + I * I)
let phase = atan2(I, R) / twopi

print(String(format: "k = %.2f    R = %.8f    I = %.8f    A = %.8f    φ/2π = %.8f", k, R, I, amp, phase))

এফএফটি হ'ল দক্ষভাবে কোনও ডিএফটি গণনা করার উপায়। আধুনিক গ্রন্থাগারগুলি সহ, দুটি বিধিনিষেধের শক্তি আর নেই। আপনার যদি কেবল এক বা দুটি বিন মান প্রয়োজন হয় তবে আপনার মতো করে সরাসরি এটি গণনা করা ভাল। একটি একক খাঁটি স্বর (বাস্তব বা জটিল) জন্য, ফ্রিকোয়েন্সি, পর্ব এবং প্রশস্ততা হুবহু গণনা করার জন্য কেবল দুটি বিন মান প্রয়োজন। Dsprelated.com/showarticle/1284.php দেখুন । গণিতটি বেশ পরিশীলিত, তবে নিবন্ধগুলির লিঙ্কগুলি রয়েছে যেখানে অনুকরণগুলি ব্যাখ্যা করা হয়েছে। লিনিয়ার বীজগণিত একটি সত্য বোঝার জন্য পূর্বশর্ত।
সিডরন ডগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.