দ্রুত এবং মেমরি দক্ষ চলমান গড় গণনা


33

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

এই মুহুর্তে, আমি কেবলমাত্র একটি রিং বাফারে সমস্ত মান সংরক্ষণ করি এবং প্রতিবার নতুন মান আসার সাথে সাথে যোগফলটি সঞ্চিত করে আপডেট করি। এটি সত্যিই দক্ষ, তবে দুর্ভাগ্যক্রমে আমার বেশিরভাগ উপলভ্য মেমরি ব্যবহার করে ...


3
আমি মনে করি না এটি করার জন্য আর কোনও স্থানের দক্ষ উপায় নেই।
রকেটম্যাগনেট

4
@ জোবিটাফি বেশ ভাল, এটি নিয়ন্ত্রণ ব্যবস্থায় বেশ বিস্তৃত ব্যবহৃত অ্যালগরিদম এবং এটির জন্য সীমিত হার্ডওয়্যার সংস্থানগুলি ব্যবহার করা দরকার requires সুতরাং আমি মনে করি তিনি এসও এর চেয়ে এখানে আরও সহায়তা পাবেন।
ক্লাবচিও

3
@ জবি: এই প্রশ্নটি সম্পর্কে কয়েকটি বলি রয়েছে যা ছোট সংস্থান-সীমিত সিস্টেমের সাথে প্রাসঙ্গিক। আমার উত্তর দেখুন। আপনি কোনও বড় ব্যবস্থায় এটি খুব আলাদাভাবে করতে চাই যেমন এসও লোকেরা অভ্যস্ত। ইলেক্ট্রনিক্স ডিজাইনিং করার ক্ষেত্রে আমার অভিজ্ঞতাটিতে এটি অনেকটাই এসেছে।
অলিন ল্যাথ্রপ

1
আমি রাজী. এটি এম্বেড থাকা সিস্টেমগুলির সাথে সম্পর্কিত বলে এটি এই ফোরামে উপযুক্ত।
রকেটম্যাগনেট

আমি আমার আপত্তি প্রত্যাহার করি
টবি জাফি

উত্তর:


55

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

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

ফিল্ট <- ফিল্ট + এফএফ (নতুন - ফিল্ট)

ফিল্ট একটি ধৈর্যশীল রাষ্ট্রের টুকরা। এই ফিল্টারটি গণনা করার জন্য এটি আপনার কেবলমাত্র প্রতিরোধী পরিবর্তনশীল। নতুন এই পুনরাবৃত্তির সাথে ফিল্টারটি আপডেট করা হচ্ছে এমন নতুন মান 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


1
+1 - সরাসরি অর্থের উপর। কেবলমাত্র আমি যুক্ত করব, মুভিং এভারেজ ফিল্টারগুলির কোনও স্থানে সিঙ্ক্রোনিকভাবে সঞ্চালন করার সময় তাদের স্থান থাকে (যেমন একটি আল্ট্রাসাউন্ড জেনারেটর চালানোর জন্য একটি ড্রাইভ ওয়েভফর্ম উত্পাদন করা) যাতে তারা 1 / টি এর সুরেলা ফিল্টার আউট করে যেখানে টি মুভিং হয় where গড় সময়
জেসন এস

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

3
দুটি ক্যাসকেডযুক্ত একক মেরু আইআইআর ফিল্টারগুলি একটি একক ২ য়-অর্ডার আইআইআর ফিল্টারের তুলনায় সংখ্যাগত ইস্যুতে আরও শক্তিশালী এবং ডিজাইন করা সহজ; ট্রেডঅফটি হ'ল 2 টি ক্যাসকেড পর্যায়ে আপনি কম Q (= 1/2?) ফিল্টার পান তবে বেশিরভাগ ক্ষেত্রে এটি কোনও বিশাল চুক্তি নয়।
জেসন এস

1
@ ক্লাবাচ্চিও: আমার আরও একটি বিষয় উল্লেখ করা উচিত ছিল ফার্মওয়্যার বাস্তবায়ন। আপনি একবারে একটি পোল লো পাস ফিল্টার সাব্রোটিন লিখতে পারেন, তারপরে এটি একাধিকবার প্রয়োগ করুন। প্রকৃতপক্ষে আমি ফিল্টার অবস্থায় স্মৃতিতে একটি পয়েন্টার নিতে সাধারণত এই জাতীয় একটি সাবরুটিন লিখি, তারপরে এটি পয়েন্টারটি অগ্রসর করুন যাতে এটি মাল্টি-মেরু ফিল্টারগুলি উপলব্ধি করতে সহজেই পরম্পরায় বলা যেতে পারে।
অলিন ল্যাথ্রপ

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

18

আপনি যদি দুটি সংখ্যার আইটেমের পাওয়ারের গড়পড়তা (যেমন 2,4,8,16,32 ইত্যাদি) সীমাবদ্ধতার সাথে বেঁচে থাকতে পারেন তবে বিভাজনটি কোনও নিবেদিত বিভাজন ছাড়াই কম পারফরম্যান্স মাইক্রোতে সহজেই এবং দক্ষতার সাথে করা যায় কারণ এটি একটি বিট শিফট হিসাবে করা যেতে পারে। প্রতিটি শিফ্ট ডান হ'ল দুটি শক্তির একটি শক্তি:

avg = sum >> 2; //divide by 2^2 (4)

অথবা

avg = sum >> 3; //divide by 2^3 (8)

প্রভৃতি


কিভাবে এটি সাহায্য করে? ওপি বলছে মূল সমস্যাটি অতীতের নমুনাগুলিকে স্মৃতিতে রেখে দেওয়া।
জেসন এস

এটি একেবারেই ওপি-র প্রশ্নের সমাধান করে না।
রকেটম্যাগনেট

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

8

সেখানে হয় , কম মেমরির প্রয়োজনীয়তা একটি সত্য মুভিং এভারেজ ফিল্টার (ওরফে "ওয়াগনের ফিল্টার") জন্য একটি উত্তর যদি আপনি downsampling আপত্তি নেই। একে ক্যাসকেড ইন্টিগ্রেটার-কম্ব ফিল্টার (সিআইসি) বলা হয়। ধারণাটি হ'ল আপনার একটি ইন্টিগ্রেটার রয়েছে যা আপনি একটি সময়ের সাথে পৃথক হন এবং মূল মেমরি-সেভিং ডিভাইসটি হ'ল ডাউন স্যাম্পলিংয়ের মাধ্যমে আপনাকে ইন্টিগ্রেটারের প্রতিটি মান সংরক্ষণ করতে হবে না। এটি নিম্নলিখিত সিউডোকোড ব্যবহার করে প্রয়োগ করা যেতে পারে:

function out = filterInput(in)
{
   const int decimationFactor = /* 2 or 4 or 8 or whatever */;
   const int statesize = /* whatever */
   static int integrator = 0;
   static int downsample_count = 0;
   static int ringbuffer[statesize];
   // don't forget to initialize the ringbuffer somehow
   static int ringbuffer_ptr = 0;
   static int outstate = 0;

   integrator += in;
   if (++downsample_count >= decimationFactor)
   {
     int oldintegrator = ringbuffer[ringbuffer_ptr];
     ringbuffer[ringbuffer_ptr] = integrator;
     ringbuffer_ptr = (ringbuffer_ptr + 1) % statesize;
     outstate = (integrator - oldintegrator) / (statesize * decimationFactor);
   }
   return outstate;
}

আপনার কার্যকর চলমান গড় দৈর্ঘ্য decimationFactor*statesizeতবে আপনার কেবলমাত্র statesizeনমুনার আশেপাশে থাকা প্রয়োজন । স্পষ্টতই আপনি আরও ভাল পারফরম্যান্স পেতে পারেন যদি আপনার statesizeএবং decimationFactor2 এর ক্ষমতা হয়, যাতে বিভাগ এবং বাকী অপারেটরগুলি শিফ্ট এবং মাস্ক-এন্ডগুলি দ্বারা প্রতিস্থাপিত হয়।


পোস্টস্ক্রিপ্ট: আমি ওলিনের সাথে একমত হই যে চলমান গড় ফিল্টারের আগে আপনার সর্বদা সাধারণ আইআইআর ফিল্টার বিবেচনা করা উচিত। আপনার যদি বক্সকার ফিল্টারটির ফ্রিকোয়েন্সি-নুলগুলির প্রয়োজন না হয় তবে একটি 1-মেরু বা 2-মেরু লো-পাস ফিল্টার সম্ভবত ভাল কাজ করবে।

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


8

অলিন ল্যাথ্রপ ডিজিটাল সিগন্যাল প্রসেসিং স্ট্যাক এক্সচেঞ্জে ইতিমধ্যে বর্ণনা করেছেন যে প্রথম অর্ডার আইআইআর ফিল্টারটি ব্যবহার করার পিছনে গণিতের কিছু গভীর-বিশ্লেষণ রয়েছে (এই প্রচুর চিত্র রয়েছে) এই আইআইআর ফিল্টারটির সমীকরণটি হ'ল:

Y [এন] = αx [এন] (1-α) Y [এন-1]

এটি কেবলমাত্র পূর্ণসংখ্যা এবং নিম্নলিখিত কোড ব্যবহার করে বিভাজন ব্যবহার করে প্রয়োগ করা যেতে পারে (আমি স্মৃতি থেকে টাইপ করার সময় কিছুটা ডিবাগিংয়ের প্রয়োজন হতে পারে))

/**
*  @details    Implement a first order IIR filter to approximate a K sample 
*              moving average.  This function implements the equation:
*
*                  y[n] = alpha * x[n] + (1 - alpha) * y[n-1]
*
*  @param      *filter - a Signed 15.16 fixed-point value.
*  @param      sample - the 16-bit value of the current sample.
*/

#define BITS 2      ///< This is roughly = log2( 1 / alpha )

short IIR_Filter(long *filter, short sample)
{
    long local_sample = sample << 16;

    *filter += (local_sample - *filter) >> BITS;

    return (short)((*filter+0x8000) >> 16);     ///< Round by adding .5 and truncating.
}

এই ফিল্টারটি আলার মান 1 / কে নির্ধারণ করে শেষ কে নমুনাগুলির চলমান গড়ের সমান করে। পূর্ববর্তী কোডে এই কি #defineing BITSকে = 16 সেট অর্থাত LOG2 করার (কে), BITS4, কে জন্য = 4 সেট BITS2, ইত্যাদি

(আমি পরিবর্তনটি পেয়েই এখানে তালিকাভুক্ত কোডটি যাচাই করব এবং প্রয়োজনে এই উত্তরটি সম্পাদনা করব))


6

এখানে একটি একক-মেরু লো-পাস ফিল্টার (চলমান গড়, কাট অফের ফ্রিকোয়েন্সি = কাটফফ ফ্রিকোয়েন্সি সহ)'s খুব সাধারণ, খুব দ্রুত, দুর্দান্ত কাজ করে এবং প্রায় কোনও স্মৃতি ওভারহেড করে না।

দ্রষ্টব্য: নতুন ইনপুটটিতে পাস ব্যতীত সমস্ত ভেরিয়েবলের ফিল্টার ফাংশনের বাইরেও সুযোগ রয়েছে

// One-time calculations (can be pre-calculated at compile-time and loaded with constants)
DecayFactor = exp(-2.0 * PI * CutoffFrequency / SampleRate);
AmplitudeFactor = (1.0 - DecayFactor);

// Filter Loop Function ----- THIS IS IT -----
double Filter(double newInput)
{
   MovingAverage *= DecayFactor;
   MovingAverage += AmplitudeFactor * newInput;

   return (MovingAverage);
}

দ্রষ্টব্য: এটি একটি একক পর্যায়ের ফিল্টার। ফিল্টারটির তীক্ষ্ণতা বাড়াতে একাধিক পর্যায় একসাথে ক্যাসকেড করা যায়। আপনি যদি একাধিক পর্যায় ব্যবহার করেন তবে ক্ষতিপূরণ দেওয়ার জন্য আপনাকে ডেকেএফেক্টরটি (যেমন কাটফফ-ফ্রিকোয়েন্সি সম্পর্কিত) সামঞ্জস্য করতে হবে।

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

(কাটফ্রেফ্রেন্সি / স্যাম্পলরেট) এর পরিধি 0 থেকে 0.5 এর মধ্যে রয়েছে। ডেকএফ্যাক্টর 0 এবং 1 এর মধ্যে একটি মান, সাধারণত 1 এর কাছাকাছি।

একক নির্ভুলতা ভাসমান বেশিরভাগ জিনিসের জন্য যথেষ্ট ভাল, আমি কেবল ডাবলকেই পছন্দ করি। আপনার যদি পূর্ণসংখ্যার সাথে লেগে থাকার প্রয়োজন হয় তবে আপনি ডেকএফ্যাক্টর এবং এমপ্লিটিউট ফ্যাক্টরকে ভগ্নাংশের পূর্ণসংখ্যায় রূপান্তর করতে পারেন, যেখানে সংখ্যাকে পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা হয় এবং ডিনোমিনিটারটি 2 এর পূর্ণসংখ্যা শক্তি হয় (যাতে আপনি ডানদিকে বিট-শিফট করতে পারেন ফিল্টার লুপ চলাকালীন বিভাজন করার চেয়ে ডিনোমিনেটর)। উদাহরণস্বরূপ, যদি ডেকেএফ্যাক্টর = 0.99, এবং আপনি পূর্ণসংখ্যার ব্যবহার করতে চান তবে আপনি ডেকেএফ্যাক্টর = 0.99 * 65536 = 64881 সেট করতে পারেন And এবং তারপরে যে কোনও সময় আপনি আপনার ফিল্টার লুপের মধ্যে ডেকএফ্যাক্টর দ্বারা গুণ করলে, কেবল ফলাফল >> 16 এ স্থানান্তর করুন।

এটি সম্পর্কে আরও তথ্যের জন্য, অনলাইনে একটি দুর্দান্ত বই, পুনরাবৃত্ত ফিল্টারগুলির উপর অধ্যায় 19: http://www.dspguide.com/ch19.htm

পিএস মুভিং এভারেজ প্যারাডিজমের জন্য, ডেকেএফেক্টর এবং এমপ্লিটিউডফ্যাক্টর স্থাপনের ভিন্ন পদ্ধতির যা আপনার প্রয়োজনের সাথে আরও প্রাসঙ্গিক হতে পারে, আসুন আমরা আপনাকে পূর্ববর্তী, প্রায় 6 টি আইটেম একসাথে গড় করতে চাই এবং এটি বিচ্ছিন্নভাবে করতে চাই, আপনি 6 টি আইটেম যুক্ত করে বিভাজন করতে পারবেন 6, যাতে আপনি প্রশস্ততা ফ্যাক্টরটি 1/6 এ সেট করতে পারেন, এবং ডেকেএ ফ্যাক্টরকে (1.0 - অ্যাপলিটিউডফ্যাক্টর) সেট করতে পারেন।


4

আপনি সাধারণ আইআইআর ফিল্টার সহ কিছু অ্যাপ্লিকেশনের জন্য চলন্ত অ্যাভারেজ আনুমানিক করতে পারেন।

ওজন 0..255 মান, উচ্চ মানগুলি = অ্যাওয়ারেজের জন্য সংক্ষিপ্ত টাইমস্কেল

মান = (নতুন মূল্য * ওজন + মান * (256-ওজন)) / 256

রাউন্ডিং ত্রুটিগুলি এড়াতে, মানটি সাধারণত দীর্ঘ হয়, যার মধ্যে আপনি কেবলমাত্র 'আসল' মান হিসাবে উচ্চতর-বর্ডার ব্যবহার করেন।


3

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

বেসিক এফআইআর রিং বাফার: সর্বশেষ এন মানগুলির একটি চলমান বাফার এবং বাফারে সমস্ত মানগুলির একটি চলমান এসএমএম রাখুন। প্রতিবার যখন একটি নতুন নমুনা আসে তখন এসএমএম থেকে বাফারের প্রাচীনতম মানটি বিয়োগ করুন, নতুন নমুনার সাথে এটি প্রতিস্থাপন করুন, এসএমএমে নতুন নমুনা যুক্ত করুন এবং এসএমএম / এন আউটপুট দিন।

unsigned int Filter(unsigned int sample){
    static unsigned int buffer[N];
    static unsigned char oldest = 0;
    static unsigned long sum;

    sum -= buffer[oldest];
    sum += sample;
    buffer[oldest] = sample;
    oldest += 1;
    if (oldest >= N) oldest = 0;

    return sum/N;
}

পরিবর্তিত আইআইআর রিং বাফার: সর্বশেষ এন মানগুলির একটি চলমান SUM রাখুন। প্রতিবার একটি নতুন নমুনা আসে, এসইএম - = এসইএম / এন, নতুন নমুনায় যোগ করুন এবং এসইএম / এন আউটপুট দেয়।

unsigned int Filter(unsigned int sample){
    static unsigned long sum;

    sum -= sum/N;
    sum += sample;

    return sum/N;
}

যদি আমি আপনাকে সঠিকভাবে পড়ছি তবে আপনি প্রথম আদেশের আইআইআর ফিল্টার বর্ণনা করছেন; আপনি যে মানটি বিয়োগ করছেন তা হ'ল সবচেয়ে পুরনো মান যা হ্রাস পাচ্ছে তা নয়, বরং এটি আগের মানগুলির গড়। প্রথম অর্ডারের আইআইআর ফিল্টারগুলি অবশ্যই কার্যকর হতে পারে তবে আপনি যখন নির্দিষ্ট করেন যে সমস্ত পর্যায়ক্রমিক সংকেতের জন্য আউটপুট একই রকম হয় তখন আপনি কী বোঝাতে চাই তা নিশ্চিত নই। একটি 10KHz নমুনা হারে, একটি 100-হার্জ বর্গাকার তরঙ্গকে 20-পর্যায়ের বক্স ফিল্টারে খাওয়ানো একটি সংকেত দেবে যা 20 নমুনার জন্য সমানভাবে উঠে আসে, 30-এর জন্য উচ্চে বসে থাকে, 20 টি নমুনার জন্য অভিন্ন ড্রপ হয় এবং 30-এ কম যায় A আইআইআর ফিল্টার ...
সুপারক্যাট

... একটি তরঙ্গ উঠবে যা দ্রুত বৃদ্ধি পেতে শুরু করে এবং ধীরে ধীরে ইনপুট সর্বাধিক বন্ধ হয়ে যায় (তবে তা নয়) তবে তীব্রভাবে পতন শুরু হয় এবং ধীরে ধীরে ইনপুট সর্বনিম্নের কাছাকাছি চলে যায় (তবে নয়)। খুব আলাদা আচরণ।
সুপারক্যাট

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

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

@ স্কটসিডম্যান: যদি এফআইআর-এর প্রতিটি পর্যায়ে হয় তবে কেবলমাত্র সেই পর্যায়ে ইনপুটটির গড় এবং তার পূর্ববর্তী সঞ্চিত মান আউটপুট থাকে এবং তারপরে ইনপুটটি সংরক্ষণ করতে পারে (যদি একটির সংখ্যার পরিসর থাকে তবে একটি যোগফল ব্যবহার করতে পারে) বরং গড়)। বক্স ফিল্টারের চেয়ে ভাল কিনা তা অ্যাপ্লিকেশনটির উপর নির্ভর করে (উদাহরণস্বরূপ, ইনপুট পরিবর্তন হওয়ার পরে এবং সম্পূর্ণ 1 মিমি পরে একটি দুরত্বপূর্ণ ডি 2 / ডিটি স্পাইক থাকবে) মোট 1 মিমি দেরি করে ফিল্টারটির জন্য সর্বনিম্ন সম্ভব d / dt)।
সুপারক্যাট

2

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

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

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


5
আমি আপনার সাথে ভাসমান পয়েন্ট সংখ্যা ব্যবহারের সুপারিশের সাথে একমত নই। ওপি সম্ভবত একটি কারণে 8-বিট মাইক্রোকন্ট্রোলার ব্যবহার করে। হার্ডওয়্যার ফ্লোটিং-পয়েন্ট সাপোর্টের সাথে একটি 8-বিট মাইক্রোকন্ট্রোলার সন্ধান করা একটি কঠিন কাজ হতে পারে (আপনি কোনও জানেন?)। এবং হার্ডওয়্যার সমর্থন ব্যতীত ভাসমান-পয়েন্ট নম্বর ব্যবহার করা খুব উত্সব নিবিড় কাজ হবে।
পেটপলসন

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

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

4
কেবলমাত্র 1-মেরু লো-পাস ফিল্টারের জন্য ভাসমান-পয়েন্ট (হার্ডওয়্যার বা সফ্টওয়্যার) ব্যবহার করার দরকার নেই।
জেসন এস

1
যদি তার ফ্লোটিং পয়েন্ট অপারেশন হয় তবে তিনি প্রথমে বিভাগে আপত্তি করবেন না।
ফেডেরিকো রুসো

0

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

উদাহরণস্বরূপ, ধরুন ধীরে ধীরে হ্রাসমান সিরিজ (8,8,8, ..., 8,7,7,7, ... 7,6,6,) এবং শুরুতে গড়টি 8 টি বলে মনে করুন। মুষ্টি "7" নমুনা ফিল্টার শক্তি যাই হোক না কেন, গড় 7 এ আনবে। শুধু একটি নমুনার জন্য। 6 এর জন্য একই গল্প, ইত্যাদি Now এখন বিপরীতে চিন্তা করুন: সেরি উপরে যায়। নমুনাটি পরিবর্তন করার পক্ষে যথেষ্ট বড় না হওয়া অবধি আপনার গড় চিরকাল 7 টি থাকবে।

অবশ্যই, আপনি 1/2 ^ N / 2 যোগ করে "পক্ষপাত" এর জন্য সংশোধন করতে পারেন, তবে এটি প্রকৃতপক্ষে নির্ভুল সমস্যার সমাধান করতে পারে না: সেক্ষেত্রে নমুনা 8-1 না হওয়া পর্যন্ত ক্রমহ্রাসমান সিরিজটি চিরকাল আটকে থাকবে / 2 ^ (n / 2)। উদাহরণস্বরূপ এন = 4 এর জন্য শূন্যের উপরে যে কোনও নমুনা গড় অপরিবর্তিত রাখবে।

আমি বিশ্বাস করি যে এর জন্য একটি সমাধান হ'ল এলএসবিগুলির সঞ্চিত সঞ্চালককে বোঝায়। তবে আমি কোড প্রস্তুত করার পক্ষে এটি এতটুকু করে ফেলিনি, এবং আমি নিশ্চিত নই যে এটি সিরিজের অন্যান্য কয়েকটি ক্ষেত্রে আইআইআর শক্তিকে ক্ষতি করবে না (উদাহরণস্বরূপ, 7,,, 9 তখন গড়পড়তা 8 হবে) ।

অলিন, আপনার দ্বি-পর্যায়ের ক্যাসকেডেরও কিছু ব্যাখ্যা দরকার হবে। আপনি কি বোঝাতে চেয়েছেন যে প্রতিটি পুনরুক্তিতে প্রথমবারের জন্য প্রথম খাওয়ানো ফলাফল সহ দুটি গড় মান রয়েছে ? এর কী লাভ?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.