সুচিপত্র:

EasyFFT: Arduino এর জন্য ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT): 6 টি ধাপ
EasyFFT: Arduino এর জন্য ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT): 6 টি ধাপ

ভিডিও: EasyFFT: Arduino এর জন্য ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT): 6 টি ধাপ

ভিডিও: EasyFFT: Arduino এর জন্য ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT): 6 টি ধাপ
ভিডিও: QuickFFT: High Speed FFT for Arduino 2024, সেপ্টেম্বর
Anonim
Image
Image

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

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

এই প্রকল্পটি FFT এর কার্যকারিতা ব্যাখ্যা করে না কিন্তু FFT ফাংশনের প্রয়োগ ব্যাখ্যা করে। সংযুক্ত ভিডিওতেও একই প্রক্রিয়া ব্যাখ্যা করা হয়েছে।

আপনি যদি কেবল কোড প্রয়োগে আগ্রহী হন এবং এর ব্যাখ্যা করতে না চান। আপনি সরাসরি ধাপ 3 এ যেতে পারেন।

ধাপ 1: ফ্রিকোয়েন্সি ট্রান্সফর্মের ভূমিকা

ফ্রিকোয়েন্সি ট্রান্সফর্মের ভূমিকা
ফ্রিকোয়েন্সি ট্রান্সফর্মের ভূমিকা
ফ্রিকোয়েন্সি ট্রান্সফর্মের ভূমিকা
ফ্রিকোয়েন্সি ট্রান্সফর্মের ভূমিকা

যে কোন সংকেত বিভিন্ন সাইনোসয়েডাল তরঙ্গের সমন্বয়ে গঠিত হতে পারে। সুতরাং যেকোন সময়-ভিত্তিক সংকেতকে বিভিন্ন পরিমাপের বিভিন্ন সাইন এর সংমিশ্রণ হিসাবেও দেখানো যেতে পারে।

আমি DFT (ডিসক্রিট ফুরিয়ার ট্রান্সফর্ম) এর কাজকে আগের নির্দেশাবলীর একটিতে ব্যাখ্যা করার চেষ্টা করেছি (https://www.instructables.com/id/Arduino-Frequency…)। যে কোনো রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য এই পদ্ধতিগুলি অত্যন্ত ধীর। যা এটি প্রায় অকেজো করে তোলে।

ছবিতে, একটি সংকেত দেখানো হয়েছে যা দুটি ফ্রিকোয়েন্সি f2 এবং f5 এর সংমিশ্রণ। এই সংকেতটি f1 থেকে f5 মানের সাইন তরঙ্গ দ্বারা গুণিত হয়।

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

সুতরাং যদি আমাদের সংকেত f1 দ্বারা গুণিত হয় গুণের সমষ্টি হবে শূন্য (বাস্তব প্রয়োগের জন্য শূন্যের কাছাকাছি)। অনুরূপ f3, f4 এর ক্ষেত্রে। তবে মানের জন্য, f2 এবং f5 আউটপুট শূন্য হবে না, কিন্তু বাকি মানগুলির তুলনায় উল্লেখযোগ্যভাবে বেশি।

এখানে 5 টি ফ্রিকোয়েন্সি দিয়ে একটি সিগন্যাল পরীক্ষা করা হয়, তাই সিগন্যালকে পাঁচটি ফ্রিকোয়েন্সি দিয়ে গুণ করতে হয়। এই ধরনের তীব্র গণনা একটি উচ্চ সময় লাগে। গাণিতিকভাবে দেখানো হয়েছে যে N সংখ্যক নমুনার জন্য N*N জটিল গুণিতক লাগে।

ধাপ 2: ফাস্ট ফুরিয়ার ট্রান্সফর্ম

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

আপনি FFT এর পিছনে গণিতের বিস্তারিত বোঝার জন্য কোড লেখার সময় আমি যে রেফারেন্সগুলি উল্লেখ করেছি তা উল্লেখ করতে পারেন:

1.

2.

3.

4.

ধাপ 3: কোডের ব্যাখ্যা

1. দ্রুত সাইন এবং কোসিন:

গণনা এফএফটি বিভিন্ন সাইন এবং কোসাইনের মান একাধিক বার নেয়। Arduino এর অন্তর্নির্মিত ফাংশনটি যথেষ্ট দ্রুত নয় এবং প্রয়োজনীয় মান প্রদান করতে যথেষ্ট সময় নেয়। যা কোডটিকে উল্লেখযোগ্যভাবে ধীর করে তোলে (64 টি নমুনার জন্য সময় দ্বিগুণ করে)। 0 থেকে 90 ডিগ্রী পর্যন্ত এই সমস্যাটির মোকাবিলা করার জন্য সাইন এর মান 255 এর একাধিক হিসাবে সংরক্ষণ করা হয়। এটি করলে স্টোরিং নাম্বারগুলিকে ফ্লোট হিসাবে ব্যবহারের প্রয়োজন দূর হবে এবং আমরা এটিকে বাইট হিসেবে সংরক্ষণ করতে পারি যা Arduino তে 1/4 স্পেস নেয়। সাইন_ডাটা কে বৈশ্বিক পরিবর্তনশীল হিসেবে ঘোষণা করার জন্য কোডের উপরে পেস্ট করতে হবে।

সাইন_ডাটা ছাড়াও, f_peaks নামে একটি অ্যারে একটি গ্লোবাল ভেরিয়েবল হিসেবে ঘোষণা করা হয়েছে। FFT ফাংশনের প্রতিটি রান এর পর এই অ্যারে আপডেট হয়। যেখানে f_peaks [0] হল সবচেয়ে প্রভাবশালী ফ্রিকোয়েন্সি এবং ক্রমবর্ধমান ক্রমে আরও মান।

বাইট সাইন_ডাটা [91] = {0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, 49, 53, 57, 62, 66, 70, 75, 79, 83, 87, 91, 96, 100, 104, 108, 112, 116, 120, 124, 127, 131, 135, 139, 143, 146, 150, 153, 157, 160, 164, 167, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 206, 209, 211, 214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 253, 254, 254, 254, 254, 255, 255, 255}; ভাসা f_peaks [5];

যেহেতু আমরা সাইন এর মান 0 থেকে 90 ডিগ্রী পর্যন্ত সংরক্ষণ করেছি সাইন বা কোসাইন এর যে কোন মান গণনা করা যায়। নীচে সংখ্যাটির প্রথম রাউন্ড শূন্য দশমিক বিন্দু এবং সঞ্চিত ডেটা থেকে রিটার্ন ভ্যালু ফাংশন করে। এই পদ্ধতিতে শুধুমাত্র একটি ভাসমান বিভাগ প্রয়োজন। এটি সরাসরি সাইন মান সংরক্ষণ করে আরও কমিয়ে আনা যেতে পারে (255 একাধিক নয়)। কিন্তু এটি আরডুইনোতে উচ্চ স্মৃতি খায়।

উপরের পদ্ধতিটি ব্যবহার করলে নির্ভুলতা হ্রাস পায় কিন্তু গতি উন্নত হয়। 64 পয়েন্টের জন্য, এটি 8ms এর সুবিধা দেয় এবং 128 পয়েন্টের জন্য এটি 20ms এর সুবিধা দেয়।

ধাপ 4: কোডের ব্যাখ্যা: FFT ফাংশন

FFT শুধুমাত্র 2, 4, 8, 16, 32, 64 ইত্যাদি নমুনার আকারের জন্য করা যেতে পারে। যদি মান 2^n না হয়, তবে এটি মূল্যের নীচের দিকটি গ্রহণ করবে। উদাহরণস্বরূপ, যদি আমরা 70 এর নমুনা আকার নির্বাচন করি তবে এটি কেবল প্রথম 64 টি নমুনা বিবেচনা করবে এবং বিশ্রাম বাদ দেবে।

এটি সর্বদা 2। N আকারের নমুনার জন্য সুপারিশ করা হয়। যা হতে পারে:

2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, …

দুটি floats out_r এবং out_im একটি উচ্চ পরিমাণ মেমরি নেবে। Arduino ন্যানো জন্য উপলব্ধ মেমরির অভাবের কারণে 128 (এবং কিছু ক্ষেত্রে 128) এর বেশি নমুনার জন্য কাজ করবে না।

স্বাক্ষরবিহীন int ডেটা [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

int a, c1, f, o, x; a = N; জন্য // ভাসমান আউট_আর [ডেটা [ও] = {} সিকোয়েন্সিংয়ের জন্য ইনপুট; // ট্রান্সফর্ম ফ্লোটের আসল অংশ out_im [data [o] = {}; // রূপান্তরের কাল্পনিক অংশ

আরও প্রবাহ নিম্নরূপ:

1. প্রদত্ত নমুনা আকারের জন্য কোডটি কিছুটা বিপরীত ক্রম উৎপন্ন করে (রেফারেন্সে বিট বিপরীত বিবরণ: পদক্ষেপ 2)

2. উত্পন্ন আদেশ অনুযায়ী ইনপুট ডেটা অর্ডার করা হয়েছে, 3. FFT সঞ্চালিত

4. জটিল সংখ্যার প্রশস্ততা গণনা করা হয়েছে, 5. শৃঙ্গগুলি সনাক্ত করা হয় এবং ক্রমবর্ধমান ক্রমে আদেশ করা হয়

6. ফলাফল f_peaks থেকে অ্যাক্সেস করা যেতে পারে।

[অন্যান্য তথ্য অ্যাক্সেস করতে (সর্বোচ্চ ফ্রিকোয়েন্সি ছাড়া) কোড পরিবর্তন করা উচিত, যাতে স্থানীয় পরিবর্তনশীল কিছু পূর্বনির্ধারিত গ্লোবাল ভেরিয়েবলে অনুলিপি করা যায়]

ধাপ 5: কোড পরীক্ষা করা

কোড পরীক্ষা করা হচ্ছে
কোড পরীক্ষা করা হচ্ছে
কোড পরীক্ষা করা হচ্ছে
কোড পরীক্ষা করা হচ্ছে

একটি নমুনা ত্রিভুজ তরঙ্গ ইনপুট হিসাবে দেওয়া হয়। এই তরঙ্গের নমুনার ফ্রিকোয়েন্সি হল 10 Hz এবং তরঙ্গের ফ্রিকোয়েন্সি নিজেই 1.25 Hz।

কাঁচা আউটপুট থেকে দেখানো যেতে পারে, সিল্যাব দ্বারা গণনা করা FFT এর সাথে মান মিলছে। যাইহোক, এই মানগুলি ঠিক একই নয় যেমন আমরা কম নির্ভুলতা কিন্তু দ্রুত সাইন ওয়েভ।

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

গতি:

Arduino ন্যানোর জন্য এটি লাগে:

16 পয়েন্ট: 4ms32 পয়েন্ট: 10ms 64 পয়েন্ট: 26ms 128 পয়েন্ট: 53ms

ধাপ 6: উপসংহার

এই FFT কোডটি রিয়েল-টাইম অ্যাপ্লিকেশনগুলিতে ব্যবহার করা যেতে পারে। যেহেতু গণনা সম্পন্ন করতে প্রায় 30 ms লাগে। যাইহোক, এর রেজল্যুশন বেশ কয়েকটি নমুনার দ্বারা সীমাবদ্ধ। নমুনার সংখ্যা Arduino মেমরি দ্বারা সীমাবদ্ধ। Arduino মেগা বা অন্যান্য উচ্চতর কর্মক্ষমতা বোর্ড ব্যবহার করে সঠিকতা উন্নত করা যেতে পারে।

যদি আপনার কোন প্রশ্ন, পরামর্শ বা সংশোধন থাকে তবে নির্দ্বিধায় মন্তব্য করুন।

আপডেট (2/5/21)

আপডেট: // ----------------------------- FFT ফাংশন --------------- ------------------------------- // ফ্লোট এফএফটি (ইন্ট ইন , ইন্ট এন, ফ্লোট ফ্রিকোয়েন্সি)

N- এর ডাটা টাইপ পরিবর্তন করে ইন্টিজার (বিদ্যমান বাইট)> 255 নমুনার আকার সমর্থন করে। নমুনার আকার <= 128 হলে, বাইট ডাটা টাইপ ব্যবহার করা উচিত।

প্রস্তাবিত: