সুচিপত্র:

আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়: 6 টি ধাপ
আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়: 6 টি ধাপ

ভিডিও: আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়: 6 টি ধাপ

ভিডিও: আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়: 6 টি ধাপ
ভিডিও: Your First Assembly Program - Part 5 Microcontroller Basics (PIC10F200) 2024, নভেম্বর
Anonim
আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়
আপনার মাইক্রোকন্ট্রোলার প্রকল্পগুলির জন্য চলমান গড়

এই নির্দেশে আমি ব্যাখ্যা করব যে একটি চলমান গড় কী এবং কেন আপনার এটির যত্ন নেওয়া উচিত, সেইসাথে এটি দেখানো হবে যে এটি সর্বাধিক গণনীয় দক্ষতার জন্য কীভাবে প্রয়োগ করা উচিত (জটিলতা সম্পর্কে চিন্তা করবেন না, এটি বোঝা খুব সহজ এবং আমি করব আপনার আরডুইনো প্রকল্পগুলির জন্য লাইব্রেরি ব্যবহার করা সহজ করে দিন:)

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

ধাপ 1: কেস ব্যবহার করুন: মসৃণতা এডিসি পরিমাপ

কেস ব্যবহার করুন: মসৃণতা এডিসি পরিমাপ
কেস ব্যবহার করুন: মসৃণতা এডিসি পরিমাপ

Arduino খুব কম শব্দ সহ একটি শালীন 10 বিট ADC আছে। যখন একটি সেন্সর যেমন potentiometer, photoresistor বা অন্যান্য উচ্চ শব্দের উপাদানগুলির মান পরিমাপ করা হয়, তখন বিশ্বাস করা কঠিন যে পরিমাপ সঠিক।

একটি সমাধান হল প্রতিবার যখন আপনি আপনার সেন্সরটি পড়তে চান এবং সেগুলি গড়তে চান তখন একাধিক পরিমাপ নেওয়া। কিছু ক্ষেত্রে এটি একটি কার্যকর সমাধান কিন্তু সবসময় নয়। আপনি যদি প্রতি সেকেন্ডে 1000 বার ADC পড়তে চান, আপনি যদি 10 টি পরিমাপের গড় গ্রহণ করেন তাহলে আপনাকে 10 000 করতে হবে। গণনার সময়ের বিশাল অপচয়।

আমার প্রস্তাবিত সমাধান হল প্রতি সেকেন্ডে 1000 বার পরিমাপ নেওয়া, প্রতিবার চলমান গড় আপডেট করা এবং এটিকে বর্তমান মান হিসাবে ব্যবহার করা। এই পদ্ধতিটি কিছু বিলম্বের প্রবর্তন করে কিন্তু আপনার অ্যাপ্লিকেশনের কম্পিউটেশনাল জটিলতা হ্রাস করে, যা আপনাকে অতিরিক্ত প্রক্রিয়াকরণের জন্য অনেক বেশি সময় দেয়।

উপরের ছবিতে আমি গত 32 টি পরিমাপের চলমান গড় ব্যবহার করেছি। আপনি দেখতে পাবেন যে এই পদ্ধতিটি 100% ব্যর্থ নয় কিন্তু এটি সঠিকভাবে উল্লেখযোগ্যভাবে উন্নতি করে (এটি প্রতিবার 32 টি নমুনার চেয়ে খারাপ নয়)। যদি আপনি প্রতিবার 32 টি পরিমাপের গড় গণনা করতে চান, তবে এটি কেবলমাত্র পরিমাপের জন্য আরডুইনো ইউএনওতে 0.25 এমএসের বেশি সময় নেয়!

ধাপ 2: কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা

কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা
কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা
কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা
কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা
কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা
কেস ব্যবহার করুন: মাইক্রোফোন সিগন্যালের ডিসি কম্পোনেন্ট পরিমাপ করা

Arduino 0 এবং Vcc (সাধারণত 5 V) এর মধ্যে ভোল্টেজ পরিমাপ করতে পারে। অডিও সংকেত সম্পূর্ণরূপে এসি এবং যদি আপনি এটি একটি মাইক্রোকন্ট্রোলারে পরিমাপ করতে চান, তাহলে আপনাকে এটিকে 1/2 Vcc এর কাছাকাছি পক্ষপাত করতে হবে। একটি আরডুইনো ইউএনও প্রকল্পে যার অর্থ মোটামুটি 2.5 V (DC) + অডিও সিগন্যাল (AC)। 10 বিট এডিসি এবং 5 ভি পাওয়ার সাপ্লাই ব্যবহার করার সময়, 2.5 ভি বায়াস 512 এর সমান পরিমাপ করা উচিত। সুতরাং সিগন্যালের একটি এসি মান পেতে, এডিসি পরিমাপ থেকে 512 বিয়োগ করা উচিত এবং ঠিক তাই?

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

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

সৌভাগ্যবশত অডিওর ডিসি অফসেট গণনা করার একটি উপায় আছে। এটা কোন আশ্চর্য হবে না যে চলমান গড়, এই নির্দেশযোগ্য বিষয়, একটি সমাধান প্রদান করে।

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

ধাপ 3: গণনা

হিসাব
হিসাব

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

অপেক্ষার ঘরে সব অপেক্ষমান রোগীর গড় ওজন জানতে, নার্স প্রতিটি রোগীকে তার ওজন সম্পর্কে জিজ্ঞাসা করতে পারে, সেই সংখ্যাগুলি যোগ করে এবং রোগীর সংখ্যা দ্বারা ভাগ করে। যতবার ডাক্তার নতুন রোগী গ্রহণ করবেন, নার্স পুরো প্রক্রিয়াটি পুনরাবৃত্তি করবেন।

আপনি হয়তো ভাবছেন: "এটি খুব বেশি কার্যকরী মনে হচ্ছে না … এটি করার জন্য আরও ভাল উপায় থাকতে হবে।" এবং আপনি সঠিক হবে।

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

কিন্তু যদি আপনি শেষ অনুচ্ছেদটি বিভ্রান্তিকর নাও পান তবে আপনার কাছে প্রশ্ন থাকতে পারে যেমন শুরুতে সংযোজক কী হওয়া উচিত, আমি একটি প্রকৃত সি কোডে যা পড়ি তা কীভাবে রাখব? এটি পরবর্তী ধাপে সমাধান করা হবে, যেখানে আপনি আমার সোর্স কোডও পাবেন।

ধাপ 4: কোড

কোড
কোড

চলমান গড় গণনা করার জন্য, আপনাকে প্রথমে শেষ N মানগুলি সংরক্ষণ করার একটি উপায় প্রয়োজন। আপনি এন উপাদানগুলির সাথে একটি অ্যারে থাকতে পারেন এবং প্রতিবার আপনি একটি উপাদান যোগ করার সময় পুরো বিষয়বস্তু এক জায়গায় সরিয়ে নিতে পারেন (দয়া করে এটি করবেন না), অথবা আপনি একটি পুরানো উপাদানকে ওভাররাইট করতে পারেন এবং নিক্ষেপ করার জন্য পরবর্তী উপাদানটিতে পয়েন্টার সামঞ্জস্য করতে পারেন (দয়া করে এটি করুন:)

একিউমুলেটর 0 থেকে শুরু করা উচিত, বিলম্ব লাইনের সমস্ত উপাদানগুলির জন্য একই। অন্য ক্ষেত্রে আপনার চলমান গড় সবসময় ভুল হবে। আপনি দেখতে পাবেন যে delayLine_init বিলম্ব লাইনটি শুরু করার যত্ন নেয়, আপনার নিজের সঞ্চয়কারীর যত্ন নেওয়া উচিত।

বিলম্ব রেখায় একটি উপাদান যোগ করা যতটা সম্ভব নতুন উপাদানটির সূচকে 1 দ্বারা হ্রাস করা, এটি নিশ্চিত করে যে এটি বিলম্ব লাইন অ্যারের পাশে নির্দেশ করে না। সূচক হ্রাস করার পরে যখন এটি 0 হয়, এটি প্রায় 255 এ লুপ হবে (কারণ এটি একটি 8 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা)। মডুলো (%) বিলম্ব লাইন অ্যারের আকার সহ অপারেটর নিশ্চিত করবে যে সূচক একটি বৈধ উপাদান নির্দেশ করবে।

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

সহজ, তাই না?

কিভাবে এই সব কাজ করে তা আরও ভালভাবে বোঝার জন্য অনুগ্রহ করে সংযুক্ত কোড ব্যবহার করে পরীক্ষা করুন। বর্তমানে যেমন দাঁড়িয়ে আছে, arduino এনালগ পিন A0 তে এনালগ মান পড়ে এবং সিরিয়াল পোর্টে 115200 বড রেটে "[ADC মান], [চলমান গড়]" প্রিন্ট করে। যদি আপনি সঠিক বড রেটে arduino এর সিরিয়াল প্লটার খুলেন, আপনি দুটি লাইন দেখতে পাবেন: ADC মান (নীল) এবং মসৃণ মান (লাল)।

ধাপ 5: অতিরিক্ত

অতিরিক্ত
অতিরিক্ত

আপনার প্রকল্পে চলমান গড় ব্যবহার করার জন্য এমন কিছু জিনিস আছে যা আপনার অগত্যা জানার দরকার নেই জানলে ক্ষতি হবে না।

বিলম্ব: আমি এই পদক্ষেপের দৃষ্টান্ত নিয়ে কথা বলে শুরু করব। আপনি লক্ষ্য করবেন যে আরো উপাদানের চলমান গড় বড় বিলম্বের সূচনা করে। যদি আপনার সাড়া দেওয়ার সময় মূল্য পরিবর্তন করতে হয়, তাহলে আপনি হয়ত ছোট চলমান গড় ব্যবহার করতে পারেন বা নমুনার হার বাড়িয়ে দিতে পারেন (আরো প্রায়ই পরিমাপ করুন)।

সরানো.

প্রারম্ভিক: যখন আমি সংযোজক এবং বিলম্বের উপাদানগুলিকে আরম্ভ করার কথা বলেছিলাম, তখন আমি বলেছিলাম যে আপনি তাদের সবগুলিকে 0 থেকে শুরু করুন। বিকল্পভাবে আপনি আপনার পছন্দ মতো কিছুতে বিলম্ব লাইন শুরু করতে পারেন কিন্তু সংযোজকটি বিলম্ব লাইন (যেখানে N আপনার চলমান গড়ের উপাদানগুলির সংখ্যা)। যদি সঞ্চয়কারী অন্য কোন মান হিসাবে শুরু হয়, গণনা করা গড় ভুল হবে - খুব কম বা খুব বেশি, সর্বদা একই পরিমাণে (একই প্রাথমিক শর্তগুলি ধরে)। আমি কিছু "কলম এবং কাগজ সিমুলেশন" ব্যবহার করে কেন এমন হয় তা জানার চেষ্টা করার পরামর্শ দিচ্ছি।

সঞ্চয়কারীর আকার: আপনার এটাও মনে রাখতে হবে যে, সমস্ত উপাদান ইতিবাচক বা নেতিবাচক সর্বাধিক হলে বিলম্ব লাইনে সমস্ত উপাদানের সমষ্টি সঞ্চয় করার জন্য সঞ্চয়কারী যথেষ্ট বড় হওয়া উচিত। ব্যবহারিকভাবে এর অর্থ হল বিলম্ব রেখার উপাদানগুলির চেয়ে সঞ্চয়কারী একটি ডেটা টাইপের বড় এবং স্বাক্ষরিত হওয়া উচিত, যদি বিলম্ব লাইন উপাদানগুলি স্বাক্ষরিত হয়।

কৌতুক: দীর্ঘ বিলম্ব লাইন অনেক মেমরি নেয়। এটি দ্রুত একটি সমস্যা হয়ে উঠতে পারে। যদি আপনি খুব মেমরি সীমাবদ্ধ থাকেন এবং নির্ভুলতা সম্পর্কে খুব বেশি যত্ন না করেন, তাহলে আপনি সম্পূর্ণ বিলম্ব বাদ দিয়ে চলমান গড় আনুমানিক করতে পারেন এবং এর পরিবর্তে এটি করতে পারেন: সংযোজক থেকে 1/N * সঞ্চয়কারী বিয়োগ করুন এবং নতুন মান যোগ করুন (8 দীর্ঘ চলমান গড়ের উদাহরণে: সঞ্চয়কারী = সঞ্চালক * 7/8 + নতুন মান)। এই পদ্ধতিটি ভুল ফলাফল দেয় কিন্তু যখন আপনি মেমরি কম চালাচ্ছেন তখন এটি চলমান গড় গণনার একটি শালীন পদ্ধতি।

ভাষাতত্ত্ব: "চলমান গড়/গড়" সাধারণত ব্যবহার করা হয় যখন রিয়েল টাইম এভারেজিং এর উল্লেখ করা হয় যখন "মুভিং এভারেজ/এভেন" সাধারণত বোঝায় অ্যালগরিদম এক্সেল স্প্রেডশীটের মতো স্ট্যাটিক ডেটা সেটে চলছে।

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

আমি আশা করি এই নির্দেশযোগ্যটি বোঝার জন্য যথেষ্ট সহজ ছিল এবং এটি আপনার ভবিষ্যতের প্রকল্পগুলিতে আপনাকে সাহায্য করবে। যদি অস্পষ্ট কিছু থাকে তাহলে অনুগ্রহ করে নীচের মন্তব্যগুলিতে প্রশ্ন পোস্ট করুন।

প্রস্তাবিত: