সুচিপত্র:

QuickFFT: Arduino এর জন্য হাই স্পিড FFT: 3 টি ধাপ
QuickFFT: Arduino এর জন্য হাই স্পিড FFT: 3 টি ধাপ

ভিডিও: QuickFFT: Arduino এর জন্য হাই স্পিড FFT: 3 টি ধাপ

ভিডিও: QuickFFT: Arduino এর জন্য হাই স্পিড FFT: 3 টি ধাপ
ভিডিও: QuickFFT: High Speed FFT for Arduino 2024, নভেম্বর
Anonim
কুইকএফএফটি: আরডুইনোর জন্য হাই স্পিড এফএফটি
কুইকএফএফটি: আরডুইনোর জন্য হাই স্পিড এফএফটি

সাধারণ Arduino র্যাম এবং প্রক্রিয়াকরণ ক্ষমতা সীমিত, এবং FFT একটি গণনীয়-নিবিড় প্রক্রিয়া। অনেক রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য, একমাত্র প্রয়োজনীয়তা সর্বাধিক প্রশস্ততার সাথে ফ্রিকোয়েন্সি পেতে বা ফ্রিকোয়েন্সি শিখর সনাক্ত করতে প্রয়োজন।

আমার একটি নির্দেশের মধ্যে, আমি FFT এর জন্য একটি কোড প্রস্তুত করেছি যা এখানে পাওয়া যাবে: EasyFFT

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

ধাপ 1: কাজ করা

কর্মরত
কর্মরত
কর্মরত
কর্মরত
কর্মরত
কর্মরত
কর্মরত
কর্মরত

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

এই ফাংশনে, সাইন/কোসাইন তরঙ্গ একটি বর্গ তরঙ্গ দ্বারা প্রতিস্থাপিত হয়। যেহেতু আমাদের একটি পরীক্ষার সংকেতকে বর্গাকার তরঙ্গ দিয়ে গুণ করতে হবে যার মান 0, 1 বা -1 থাকতে পারে। এর কারণে, আমরা ভাসমান গুণকে কেবল পূর্ণসংখ্যা যোগ বা বিয়োগে প্রতিস্থাপন করতে পারি। Arduino পূর্ণসংখ্যা যোগ বা বিয়োগ প্রায় 5 গুণ দ্রুত। এটি প্রায় 5 গুণ দ্রুত সমাধান করে।

এই পরিবর্তনের কারণে এখন ফ্রিকোয়েন্সি বিন মানগুলি একটি পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা যেতে পারে (যা আগে ভাসমান ছিল) এবং আমরা কম মেমরি ব্যবহারের আরেকটি সুবিধা পাই। আরডুইনো ন্যানোতে, int 2 বাইট মেমরি খরচ করে যখন ফ্লোট 4 বাইট মেমরি খরচ করে। নতুন কোডে এই সুবিধার কারণে, আমরা প্রায় 256 টি নমুনার (পূর্বে 128 টি নমুনা) FFT করতে সক্ষম।

সাধারণ এফএফটি -তে আমাদের দ্রুত সমাধান করার জন্য সাইন ভ্যালু সংরক্ষণ করতে হবে। নতুন ফাংশনে, যেহেতু আমাদের আর সাইন/কোসাইন মানের প্রয়োজন নেই আমরা এটিকে বাদ দিতে পারি এবং কিছু স্মৃতি সংরক্ষণ করতে পারি।

বাস্তবায়ন:

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

float f = Q_FFT (data, 256, 100); Q_FFT ফাংশনে, ডেটা: এই শব্দটি একটি অ্যারে যার সংকেত মান রয়েছে, প্রস্তাবিত নমুনার আকার হল 2, 4, 8, 32, 64, 128, 256, 512,… এর পরে। যদি নমুনার আকার এই মানগুলির অন্তর্গত না হয় তবে এটি মানগুলির নিকটতম নিচের দিকে ক্লিপ করা হবে। উদাহরণস্বরূপ, যদি নমুনার আকার FFT এর চেয়ে 75 হয় তাহলে 64 সংখ্যক নমুনার জন্য বাহিত হবে। সর্বাধিক নমুনা আকার Arduino এ উপলব্ধ RAM দ্বারা সীমাবদ্ধ।

দ্বিতীয় শব্দটি একটি অ্যারেতে নমুনার সংখ্যা নির্দিষ্ট করে এবং শেষ মেয়াদটি Hz এর নমুনা ফ্রিকোয়েন্সি।

ধাপ 2: কোড

এই বিভাগটি EasyFFT কোডে করা পরিবর্তন ব্যাখ্যা করে যা কোডে পরিবর্তন করার সময় মনে রাখা প্রয়োজন, 1. আগে যেমন ব্যাখ্যা করা হয়েছে, এখানে FFT করতে পূর্ণসংখ্যা ব্যবহার করা হয়। Arduino তে Int হল একটি 16 -বিট সংখ্যা এবং এতে -32768 থেকে 32768 পর্যন্ত মান থাকতে পারে। যখনই এই int এর মান এই পরিসীমা অতিক্রম করে তখনই সমস্যার সৃষ্টি করে। কখনও স্তরের গণনার পর এই সমস্যা দূর করতে। যদি কোন মান 15000 এর বেশি হয় তাহলে সম্পূর্ণ অ্যারে 100 দ্বারা ভাগ করা হবে।

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

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

4. ফাংশনে নিম্নলিখিত লাইন রয়েছে:

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

উপরের ভেরিয়েবলগুলিকে গ্লোবাল ভেরিয়েবল হিসাবে ঘোষণা করা (কোডের শুরুতে পেস্ট করা) প্রতিটি এক্সিকিউশনে কোথাও 1 মিলিসেকেন্ড সময় বাঁচাবে।

5. EasyFFT ফাংশন থেকে ভিন্ন, যেখানে শীর্ষ 5 টি শিখর পূর্বনির্ধারিত অ্যারেতে সংরক্ষিত ছিল। এই ফাংশনটি একটি ভাসমান মান ফিরিয়ে দেবে। এই মানটি Hz এর সর্বাধিক প্রশস্ততার সাথে ফ্রিকোয়েন্সি উপস্থাপন করে। সুতরাং কোড উপস্থাপনা এই মত কিছু দেখতে হবে।

float f = Q_FFT (তথ্য, 256, 100);

6. পিক ডিটেকশন: একবার সর্বাধিক প্রশস্ততার সাথে ফ্রিকোয়েন্সি পাওয়া গেলে এই ফাংশনটি সঠিক ফলাফল গণনার জন্য ঠিক আগে এবং পরে ফ্রিকোয়েন্সি একটি প্রশস্ততা ব্যবহার করে। এই গণনায় ব্যবহৃত প্রশস্ততাও মডুলাসের যোগফল (বর্গের সমষ্টির বর্গমূল নয়)

যদি Fn হল সর্বাধিক প্রশস্ততার সাথে ফ্রিকোয়েন্সি তাহলে ফ্রিকোয়েন্সিটি নীচের সূত্র থেকে গণনা করা যেতে পারে।

প্রকৃত F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)

যেখানে একটি হল n এর কম্পাঙ্ক এবং ফ্রিকোয়েন্সি হল Fn-1।

ধাপ 3: ফলাফল:

ফলাফল
ফলাফল
ফলাফল
ফলাফল

ইজিএফএফটির সাথে উপরের চিত্রের তুলনা করে সমাধানের সময় দেখানো হয়েছে। তুলনার সাথে এর গতি দেখানো হয়েছে।

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

আমি আশা করি আপনি এই কোডটি আপনার প্রকল্পের জন্য উপযোগী পেয়েছেন। কোন প্রশ্ন বা পরামর্শের ক্ষেত্রে দয়া করে মন্তব্য করুন।

প্রস্তাবিত: