অন্যরা যেমন উল্লেখ করেছে, আপনি এখন ব্যবহার করছেন এমন এফআইআর (সসীম প্রবণতা প্রতিক্রিয়া) ফিল্টারের পরিবর্তে আপনার আইআইআর (অসীম ইমালস প্রতিক্রিয়া) ফিল্টারটি বিবেচনা করা উচিত। এটি আরও আছে, কিন্তু প্রথম নজরে এফআইআর ফিল্টারগুলি সমীকরণ সহ সুস্পষ্ট কনভলিউশন এবং আইআইআর ফিল্টার হিসাবে প্রয়োগ করা হয়।
মাইক্রোকন্ট্রোলারগুলিতে আমি যে আইআইআর ফিল্টারটি প্রচুর পরিমাণে ব্যবহার করি তা হ'ল একক পোল লো পাস ফিল্টার। এটি একটি সাধারণ আরসি অ্যানালগ ফিল্টারটির ডিজিটাল সমতুল্য। বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য, আপনি যে বাক্স ফিল্টারটি ব্যবহার করছেন তার তুলনায় এগুলির আরও ভাল বৈশিষ্ট্য থাকবে। আমি যে বক্স ফিল্টারটির মুখোমুখি হয়েছি তার বেশিরভাগ ব্যবহার ডিজিটাল সিগন্যাল প্রসেসিং ক্লাসে মনোযোগ না দেওয়ার ফলে, বিশেষ বৈশিষ্ট্যগুলির প্রয়োজনের ফলস্বরূপ নয়। আপনি যদি উচ্চ উচ্চ ফ্রিকোয়েন্সিগুলি যে শব্দগুলি জানেন তা কেবল আরও কমিয়ে আনতে চান তবে একটিমাত্র মেরু লো পাস ফিল্টার আরও ভাল। একটি মাইক্রোকন্ট্রোলারে ডিজিটালি প্রয়োগের সর্বোত্তম উপায়টি সাধারণত:
ফিল্ট <- ফিল্ট + এফএফ (নতুন - ফিল্ট)
ফিল্ট একটি ধৈর্যশীল রাষ্ট্রের টুকরা। এই ফিল্টারটি গণনা করার জন্য এটি আপনার কেবলমাত্র প্রতিরোধী পরিবর্তনশীল। নতুন এই পুনরাবৃত্তির সাথে ফিল্টারটি আপডেট করা হচ্ছে এমন নতুন মান NEW এফএফ হ'ল ফিল্টার ভগ্নাংশ , যা ফিল্টারটির "ভারীতা" সামঞ্জস্য করে। এই অ্যালগরিদমটি দেখুন এবং দেখুন যে এফএফ = 0 এর জন্য ফিল্টার অসীম ভারী কারণ আউটপুট কখনই পরিবর্তন হয় না। এফএফ = 1 এর জন্য, আউটপুট কেবল ইনপুট অনুসরণ করে এটি আসলে কোনও ফিল্টার নয়। দরকারী মানগুলির মধ্যে রয়েছে। ছোট সিস্টেমে আপনি এফএফটি বেছে নিন 1/2 এনযাতে এফএফ দ্বারা গুণিত করা যায় এন বিট দ্বারা ডান শিফট হিসাবে। উদাহরণস্বরূপ, এফএফ 1/16 হতে পারে এবং এফএফ দ্বারা গুণিত হয় সুতরাং 4 বিটের ডান শিফট। অন্যথায় এই ফিল্টারটির জন্য কেবল একটি বিয়োগ এবং একটি যোগ প্রয়োজন, যদিও সংখ্যাগুলি সাধারণত ইনপুট মানের (আরও নীচে পৃথক বিভাগে সংখ্যাসম্য নির্ভুলতায় আরও বেশি) হওয়া উচিত need
আমি সাধারণত এ / ডি রিডিংগুলি প্রয়োজনের তুলনায় তাড়াতাড়ি দ্রুত গ্রহণ করি এবং এই দুটি ফিল্টারকে ক্যাসকেড করে প্রয়োগ করি। এটি সিরিজের দুটি আরসি ফিল্টারগুলির ডিজিটাল সমতুল্য, এবং রোলফ ফ্রিকোয়েন্সি থেকে 12 ডিবি / অক্টেভ দ্বারা সজ্জিত। তবে, এ / ডি রিডিংয়ের জন্য সাধারণত সময় পদক্ষেপের ফিল্টারটি এর ধাপের প্রতিক্রিয়া বিবেচনা করে দেখার জন্য এটি আরও প্রাসঙ্গিক। এটি আপনাকে জানায় যে আপনি যখন জিনিসটি পরিমাপ করছেন তখন আপনার সিস্টেমে কত দ্রুত পরিবর্তন দেখা যাবে।
এই ফিল্টারগুলি ডিজাইনের সুবিধার্থে (যার অর্থ কেবল এফএফ বাছাই করা এবং তাদের মধ্যে কতটি ক্যাসকেড করা উচিত তা সিদ্ধান্ত নেওয়ার জন্য), আমি আমার প্রোগ্রাম ফিলটবাইট ব্যবহার করি। আপনি ফিল্টারগুলির ক্যাসকেড সিরিজের প্রতিটি এফএফের জন্য শিফট বিটের সংখ্যা উল্লেখ করেন এবং এটি পদক্ষেপের প্রতিক্রিয়া এবং অন্যান্য মানগুলিকে গণনা করে। আসলে আমি সাধারণত আমার মোড়ক স্ক্রিপ্ট প্লটফিল্টের মাধ্যমে এটি চালাই। এটি ফিল্টবিটস চালায় যা একটি সিএসভি ফাইল তৈরি করে, তারপরে সিএসভি ফাইল প্লট করে। উদাহরণস্বরূপ, এখানে "প্লটফিল্ট 4 4" এর ফলাফল রয়েছে:
প্লটফিল্টের দুটি পরামিতি মানে উপরে বর্ণিত ধরণের দুটি ফিল্টার ক্যাসকেড হবে। 4 এর মানগুলি এফএফ দ্বারা গুণন করতে শিফট বিটের সংখ্যা নির্দেশ করে। দুটি এফএফ মান এই ক্ষেত্রে 1/16 হয়।
লাল ট্রেস হ'ল একক পদক্ষেপের প্রতিক্রিয়া, এবং এটি দেখার প্রধান বিষয়। উদাহরণস্বরূপ, এটি আপনাকে বলে যে যদি ইনপুটটি তাত্ক্ষণিকভাবে পরিবর্তিত হয় তবে সম্মিলিত ফিল্টারটির আউটপুট 60 টি পুনরাবৃত্তিতে 90% নতুন মানের হয়ে যাবে। যদি আপনি 95% নিষ্পত্তির সময় সম্পর্কে যত্নশীল হন তবে আপনাকে প্রায় 73 টি পুনরাবৃত্তি অপেক্ষা করতে হবে, এবং 50% নিষ্পত্তির সময় কেবল 26 টি পুনরাবৃত্তি করতে হবে।
সবুজ ট্রেস আপনাকে একটি একক পূর্ণ প্রশস্ততা স্পাইক থেকে আউটপুট দেখায়। এটি আপনাকে এলোমেলো শব্দ দমন সম্পর্কে কিছু ধারণা দেয়। দেখে মনে হচ্ছে কোনও একক নমুনা আউটপুটে 2.5% এর বেশি পরিবর্তন আনবে না।
নীল ট্রেস হ'ল এই শব্দটি সাদা শব্দের সাথে কী করে তার একটি বিষয়গত অনুভূতি দেওয়া। এটি একটি কঠোর পরীক্ষা নয় যেহেতু প্লটফিল্টের এই দৌড়ের জন্য সাদা গোলমাল ইনপুট হিসাবে এলোমেলো সংখ্যার বিষয়বস্তুটি কীভাবে নির্ধারণ করা হয়েছিল তা ঠিক কোনও গ্যারান্টি নেই। এটি কেবল কতটা স্কোয়াশ হবে এবং এটি কতটা মসৃণ হবে তার মোটামুটি অনুভূতিই আপনাকে দেয়।
প্লটফিল্ট, সম্ভবত ফিল্টবাইটস এবং আরও অনেক দরকারী জিনিস, বিশেষত পিআইসি ফার্মওয়্যার বিকাশের জন্য আমার সফ্টওয়্যার ডাউনলোডের পৃষ্ঠায় পিআইসি বিকাশ সরঞ্জাম সফটওয়্যার রিলিজ পাওয়া যায় ।
সংখ্যাগত নির্ভুলতা সম্পর্কে যোগ করা হয়েছে
আমি মন্তব্যগুলি এবং এখন একটি নতুন উত্তর থেকে দেখছি যে এই ফিল্টারটি বাস্তবায়নের জন্য প্রয়োজনীয় বিটের সংখ্যা নিয়ে আলোচনা করার আগ্রহ রয়েছে। নোট করুন যে এফএফ দ্বারা গুণিত বাইনারি পয়েন্টের নীচে লগ 2 (এফএফ) নতুন বিট তৈরি করবে । ছোট সিস্টেমে সাধারণত এফএফকে 1/2 এন হিসাবে বেছে নেওয়া হয় যাতে এন বিটগুলির ডান শিফটটি দ্বারা এই গুণটি বাস্তবে উপলব্ধি হয়।
ফিল্ট সাধারণত একটি নির্দিষ্ট পয়েন্ট পূর্ণসংখ্যা হয়। নোট করুন যে এটি প্রসেসরের দৃষ্টিকোণ থেকে গণিতের কোনও পরিবর্তন করে না। উদাহরণস্বরূপ, আপনি যদি 10 বিট এ / ডি রিডিং এবং এন = 4 (এফএফ = 1/16) ফিল্টার করছেন তবে আপনার 10 বিট পূর্ণসংখ্যার এ / ডি রিডিংয়ের নীচে 4 ভগ্নাংশ বিট প্রয়োজন। একজন সর্বাধিক প্রসেসর, আপনি 10 বিট এ / ডি রিডিংয়ের কারণে 16 বিট ইন্টিজার অপারেশন করছেন। এই ক্ষেত্রে, আপনি এখনও ঠিক একই 16 বিট পূর্ণসংখ্যার পছন্দ করতে পারেন, তবে 4 বিট দ্বারা স্থানান্তরিত এ / ডি রিডিং দিয়ে শুরু করুন। প্রসেসর পার্থক্য জানে না এবং প্রয়োজন নেই। পুরো 16 বিট সংখ্যায় গণিত করা আপনার কাজগুলি 12.4 টি নির্দিষ্ট পয়েন্ট বা সত্য 16 বিট পূর্ণসংখ্যার (16.0 নির্দিষ্ট পয়েন্ট) হিসাবে বিবেচনা করে কিনা তা কার্যকর করে।
সাধারণভাবে, আপনি সংখ্যার উপস্থাপনের কারণে যদি শব্দটি যোগ করতে না চান তবে আপনাকে প্রতিটি ফিল্টারের মেরুতে এন বিট যুক্ত করতে হবে। উপরের উদাহরণে, দুটির দ্বিতীয় ফিল্টারটিতে তথ্য না হারাতে 10 + 4 + 4 = 18 বিট থাকতে হবে। একটি 8 বিট মেশিনে অনুশীলনে যার অর্থ আপনি 24 বিট মান ব্যবহার করবেন। প্রযুক্তিগতভাবে কেবলমাত্র দুটিয়ের মেরুটির আরও বিস্তৃত মান প্রয়োজন হবে, তবে ফার্মওয়্যার সরলতার জন্য আমি সাধারণত ফিল্টারের সমস্ত মেরুতে একই উপস্থাপনা এবং একই কোড ব্যবহার করি।
একটি ফিল্টার পোলের ক্রিয়াকলাপ সম্পাদনের জন্য সাধারণত আমি সাব্রোটিন বা ম্যাক্রো লিখি, তারপরে প্রতিটি মেরুতে এটি প্রয়োগ করুন। সাব্রোটিন বা ম্যাক্রো নির্ভর করে কিনা সেই নির্দিষ্ট প্রকল্পে চক্র বা প্রোগ্রামের মেমরির আরও গুরুত্বপূর্ণ whether যে কোনও উপায়ে, আমি সাব্রুটিন / ম্যাক্রোতে নতুন পাস করার জন্য কিছু স্ক্র্যাচ স্টেট ব্যবহার করি যা ফিল্টকে আপডেট করে, একই সাথে একই স্ক্র্যাচ স্টেট নিউতেও ছিল এটি লোড করে দেয় po এক মেরুর আপডেট হওয়া ফিল্ট হওয়ায় একাধিক খুঁটি প্রয়োগ করা সহজ হয় পরেরটির নতুন যখন সাবরুটাইন হয়, তখন পথে চলতে ফিল্টের পয়েন্টার পয়েন্ট রাখা দরকারী, যা বাইরে যাওয়ার পথে ফিল্টের ঠিক পরে আপডেট করা হয়েছে। একাধিকবার ডাকা হলে সাব্রোটিন স্বয়ংক্রিয়ভাবে মেমরিতে টানা ফিল্টারগুলিতে কাজ করে। আপনি প্রতিটি পুনরাবৃত্তির উপর পরিচালনা করতে ঠিকঠাক পাস করার পরে ম্যাক্রোর সাথে আপনার কোনও পয়েন্টার লাগবে না।
কোড উদাহরণ
এখানে একটি পিক 18 এর জন্য উপরে বর্ণিত ম্যাক্রোর উদাহরণ রয়েছে:
////////////////////////////////////////////////// //////////////////////////////
//
// ম্যাক্রো ফিল্টার ফিল্ট
//
// NEWVAL এ নতুন মান সহ একটি ফিল্টার পোল আপডেট করুন। NEWVAL এ আপডেট করা হয়েছে
// নতুন ফিল্টারকৃত মান ধারণ করে।
//
// ফিল্ট ফিল্টার স্টেট ভেরিয়েবলের নাম। এটি 24 বিট হিসাবে ধরে নেওয়া হয়
// প্রশস্ত এবং স্থানীয় ব্যাঙ্কে।
//
// ফিল্টার আপডেট করার সূত্রটি হ'ল:
//
// ফিল্ট <- ফিল্ড + এফএফ (নতুন - ফিল্ট)
//
// এফএফ দ্বারা গুণিত FILTBITS বিট ডান শিফট দ্বারা সম্পন্ন করা হয়।
//
/ ম্যাক্রো ফিল্টার
/ লেখা
dbankif lbankadr
Movf [আরগ 1] +0, ডাব্লু; নিউভাল <- নিউভাল - ফিল্ট
subwf newval + 0
Movf [আরগ 1] +1, ডাব্লু
subwfb newval + 1
Movf [আরগ 1] +2, ডাব্লু
subwfb newval + 2
/ লেখা
/ লুপ এন ফিলিবিটস; প্রতিটি বিটের জন্য একবার নতুন ডানদিকে স্থানান্তরিত
rlcf newval + 2, ডাব্লু; শিফট NEWVAL ডানদিকে একটি বিট
আরসিআরএফ নিউভাল + ২
আরসিআরএফ নিউভাল +1
আরসিআরএফ নতুন + 0
/ endloop
/ লেখা
Movf newval + 0, w; ফিল্টারে স্থানান্তরিত মান যুক্ত করুন এবং NEWVAL এ সংরক্ষণ করুন
addwf [আরগ 1] +0, ডাব্লু
মুভফ [আর্গ 1] +0
Movwf newval + 0
Movf newval + 1, ডাব্লু
addwfc [আরগ 1] +1, ডাব্লু
মুভফ [আর্গ 1] +1
মুভিফ নিউভাল +1 1
Movf newval + 2, ডাব্লু
addwfc [আরগ 1] +2, ডাব্লু
মুভফ [আর্গ 1] +২
মুভিফ নিউভাল + 2 2
/ endmac
এবং এখানে পিআইসি 24 বা ডিএসপিক 30 বা 33 এর জন্য একই রকম ম্যাক্রো রয়েছে:
////////////////////////////////////////////////// //////////////////////////////
//
// ম্যাক্রো ফিল্টার ffbit
//
// একটি লো পাস ফিল্টারের অবস্থা আপডেট করুন। নতুন ইনপুট মানটি ডাব্লু 1: ডাব্লু 0 এ রয়েছে
// এবং ফিল্টার স্থিতি আপডেট করতে ডাব্লু 2 দ্বারা নির্দেশিত।
//
// আপডেট হওয়া ফিল্টার মানটি ডাব্লু 1: ডাব্লু 0 এবং ডাব্লু 2 তে ফিরে আসবে point
// ফিল্টার অবস্থায় অতীতের প্রথম স্মৃতি। এই ম্যাক্রো তাই হতে পারে
// ক্যাসকেড লো পাস ফিল্টারগুলির একটি সিরিজ আপডেট করার জন্য পর পর আমন্ত্রণ জানানো হয়েছিল।
//
// ফিল্টার সূত্রটি হ'ল:
//
// ফিল্ট <- ফিল্ড + এফএফ (নতুন - ফিল্ট)
//
// যেখানে এফএফ দ্বারা গুণিত একটি ডান পাটিগণিত ডান শিফট দ্বারা সঞ্চালিত হয়
// এফএফবিআইটিএস।
//
// সতর্কতা: ডাব্লু 3 ট্র্যাশ হয়েছে।
//
/ ম্যাক্রো ফিল্টার
/ var নতুন এফবিটস পূর্ণসংখ্যা = [আরগ 1]; শিফটে বিটের সংখ্যা পান
/ লেখা
/ লিখুন "; একটি মেরুতে কম পাস ফিল্টারিং করুন, শিফট বিট =" এফবিটস
/ লিখুন ";"
উপ ডাব্লু 0, [ডাব্লু 2 ++], ডব্লু0; নতুন - ফিল্ট -> ডাব্লু 1: ডাব্লু0
subb ডাব্লু 1, [ডাব্লু 2--], ডাব্লু 1
lsr w0, # [v ffbit], w0; ফলাফলকে ডাব্লু 1: ডাব্লু 0-এ ডানদিকে সরান
sl ডাব্লু 1, # [- 16 ffbit], ডাব্লু 3
ior w0, w3, w0
আসর ডাব্লু 1, # [ভি এফবিটস], ডাব্লু 1
W0, [w2 ++], w0 যোগ করুন; ডাব্লু 1: ডাব্লু 0 এ চূড়ান্ত ফলাফল করতে ফিল্ড যুক্ত করুন
addc w1, [w2--], w1
মুভি ডাব্লু0, [ডাব্লু 2 ++]; ফিল্টার স্থিতিতে অগ্রণী পয়েন্টার লিখুন
মুভ ডাব্লু 1, [ডাব্লু 2 ++]
/ লেখা
/ endmac
এই দুটি উদাহরণই আমার পিআইসি এসেম্বলার প্রিপ্রোসেসর ব্যবহার করে ম্যাক্রো হিসাবে প্রয়োগ করা হয়েছে , যা অন্তর্নির্মিত ম্যাক্রো সুবিধারগুলির চেয়ে বেশি সক্ষম capable