পাঠ ৩০ · ৫৭-এর মধ্যে · মডিউল ৭
Home / Courses / Digital Signal Processing / FIR ফিল্টার ডিজাইন

ডিজিটাল ফিল্টার কী — FIR বনাম IIR

What is a digital filter — FIR vs IIR
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ডিজিটাল ফিল্টারের সাধারণ সংজ্ঞা এবং কীভাবে এটি M3-এর ডিফারেন্স ইকুয়েশন ধারণার সরাসরি প্রয়োগ
  • FIR ও IIR ফিল্টারের মৌলিক সংজ্ঞা, গাণিতিক রূপ ও পার্থক্য
  • কেন FIR ফিল্টার সবসময় BIBO স্ট্যাবল, আর IIR ফিল্টারের স্ট্যাবিলিটি পোল অবস্থানের উপর নির্ভরশীল
  • প্রকৃত কোড চালিয়ে দুই ধরনের ফিল্টারের ইমপালস রেসপন্স নিজে চোখে দেখা ও তুলনা করা
  • FIR/IIR-এর মধ্যে মূল ট্রেড-অফগুলো (রৈখিক ফেজ, কম্পিউটেশন কস্ট, স্ট্যাবিলিটি) — যা বাকি M7-M8 পাঠে বিস্তারিত আসবে

১ · ডিজিটাল ফিল্টার আসলে কী

M3-এ (L12) আমরা দেখেছি একটি ডিফারেন্স ইকুয়েশনএকটি সমীকরণ যা আউটপুট সিগন্যালের প্রতিটি নমুনা কীভাবে ইনপুট (এবং সম্ভবত অতীত আউটপুট) নমুনা থেকে গণনা করা হয় তা বর্ণনা করে। কীভাবে একটি সিস্টেমের আচরণ সম্পূর্ণভাবে বর্ণনা করে। একটি ডিজিটাল ফিল্টার মূলত এমনই একটি LTI সিস্টেম (M1/L04-এ সংজ্ঞায়িত), যা ইচ্ছাকৃতভাবে ডিজাইন করা হয়েছে যাতে ফ্রিকোয়েন্সি-ডোমেইনে (M5-M6-এ বিস্তারিত) নির্দিষ্ট আচরণ দেখায় — যেমন নিম্ন ফ্রিকোয়েন্সি রেখে উচ্চ ফ্রিকোয়েন্সি কমানো (লো-পাস), বা উল্টোটা (হাই-পাস)। সব ডিজিটাল ফিল্টারকে দুটি বড় শ্রেণীতে ভাগ করা যায় — এদের ইমপালস রেসপন্সের (M3/L12-এ সংজ্ঞায়িত, একক ইমপালস ইনপুট দিলে যে আউটপুট পাওয়া যায়) আচরণ অনুযায়ী।

২ · FIR — Finite Impulse Response

একটি FIR ফিল্টারের আউটপুট শুধুমাত্র বর্তমান ও সসীম সংখ্যক অতীত ইনপুট নমুনার ওয়েটেড যোগফল:

$$y[n] = \sum_{k=0}^{M-1} h[k]\,x[n-k]$$

এখানে h[0], h[1], ..., h[M-1] কে ফিল্টার ট্যাপ বা কোয়েফিসিয়েন্ট বলা হয়, আর M হলো ফিল্টারের অর্ডার/দৈর্ঘ্য। লক্ষ্য করুন — এই সমীকরণটি ঠিক M3/L10-এর কনভোলিউশন সমষ্টির মতোই দেখতে, কারণ একটি FIR ফিল্টার প্রয়োগ করা মানেই ইনপুট সিগন্যালকে ফিল্টারের ইমপালস রেসপন্সের সাথে কনভোলভ করা — এই সংযোগটি L31-এ ব্যবহার করা হবে। যেহেতু এখানে কোনো ফিডব্যাক (আউটপুটের উপর নির্ভরতা) নেই, তাই একটি একক ইমপালস ইনপুট দিলে আউটপুট ঠিক M নমুনা পরে শূন্যে নেমে যায় — এই কারণেই নাম "ফাইনাইট (সসীম) ইমপালস রেসপন্স"।

৩ · IIR — Infinite Impulse Response

একটি IIR ফিল্টার আউটপুটকে নিজের অতীত মানের উপরও নির্ভরশীল করে — অর্থাৎ এতে ফিডব্যাক থাকে:

$$y[n] = \sum_{k=0}^{P} b_k\,x[n-k] \;-\; \sum_{k=1}^{Q} a_k\,y[n-k]$$

দ্বিতীয় যোগফলটিই (অতীত আউটপুট y[n-k]-এর উপর নির্ভরতা) IIR ফিল্টারকে FIR থেকে আলাদা করে। এই রিকার্সিভ (self-referencing) কাঠামোর কারণে, একটি একক ইমপালস দিলেও আউটপুট তাত্ত্বিকভাবে কখনো ঠিক শূন্য হয় না — এটি চিরকাল (হ্রাসমান হারে, যদি সিস্টেম স্ট্যাবল হয়) চলতে থাকে। M4/L18-এ শেখা পোল-জিরো বিশ্লেষণ এখানে সরাসরি কাজে আসে — একটি IIR ফিল্টার BIBO স্ট্যাবল হবে কেবল যদি তার সবগুলো পোলের মান (abs(pole)) ইউনিট সার্কেলের ভেতরে থাকে (M4/L13, L18-এ প্রমাণসহ)। একটি FIR ফিল্টারের কোনো ফিডব্যাক না থাকায় তার কোনো পোলই নেই (শুধু জিরো) — তাই এটি সবসময় স্বয়ংক্রিয়ভাবে BIBO স্ট্যাবল, এটি একটি গুরুত্বপূর্ণ ব্যবহারিক সুবিধা যা M8-এ IIR-এর সাথে তুলনা করার সময় বারবার আসবে।

স্ট্যাবিলিটি
FIR সবসময় BIBO স্ট্যাবল (কোনো পোল নেই)। IIR স্ট্যাবল হতে হলে সব পোল ইউনিট সার্কেলের ভেতরে থাকতে হবে (M4/L18)।
ফেজ
FIR-কে সহজেই ঠিক লিনিয়ার ফেজ বানানো যায় (কোয়েফিসিয়েন্ট সিমেট্রিক হলে) — L31-এ বিস্তারিত। IIR-এর ফেজ সাধারণত নন-লিনিয়ার।
কম্পিউটেশন
একই শার্পনেসের জন্য IIR সাধারণত অনেক কম ট্যাপ/কোয়েফিসিয়েন্টে কাজ চালাতে পারে (M8-এ বিস্তারিত), তাই কম মেমোরি ও কম গণনা লাগে।
সহোদর ধারণার সাথে সম্পর্ক

M3/L12 থেকে মনে করুন — ইমপালস রেসপন্স বের করতে একটি একক ইমপালস সিকোয়েন্স ([1, 0, 0, ...]) সিস্টেমে ফিড করা হয়। নিচের কোড সেলে ঠিক এই কৌশলই দুটি ভিন্ন ফিল্টারে প্রয়োগ করে সরাসরি তুলনা করা হয়েছে।

৪ · কোড দিয়ে যাচাই — দুই ধরনের ইমপালস রেসপন্স

নিচে একটি ৫-ট্যাপ মুভিং-এভারেজ FIR ফিল্টার (h[k] = 0.2 প্রতিটি ট্যাপে, k=0..4) এবং একটি সাধারণ প্রথম-অর্ডার IIR ফিল্টার (y[n] = 0.5·y[n-1] + x[n]) — দুটোতেই একটি একক ইমপালস ইনপুট দিয়ে তাদের প্রকৃত কম্পিউটেড ইমপালস রেসপন্স দেখা যাক।

Python
import math

# ---- FIR: 5-ট্যাপ মুভিং-এভারেজ ফিল্টার ----
h_fir = [0.2, 0.2, 0.2, 0.2, 0.2]   # 5 taps, প্রতিটি 1/5

def convolve(x, h):
    ny = len(x) + len(h) - 1
    y = [0.0] * ny
    for n in range(ny):
        s = 0.0
        for k in range(len(h)):
            if 0 <= n - k < len(x):
                s += h[k] * x[n - k]
        y[n] = s
    return y

impulse = [1.0] + [0.0] * 14   # একক ইমপালস, 15 নমুনা লম্বা
fir_response = convolve(impulse, h_fir)

# ---- IIR: y[n] = 0.5*y[n-1] + x[n] ----
a = 0.5
N = 15
x_iir = [1.0] + [0.0] * (N - 1)
y_iir = [0.0] * N
for n in range(N):
    y_prev = y_iir[n - 1] if n > 0 else 0.0
    y_iir[n] = a * y_prev + x_iir[n]

print(f"{'n':>3} | {'FIR h[n]':>10} | {'IIR y[n]':>14}")
for n in range(15):
    print(f"{n:>3} | {fir_response[n]:>10.6f} | {y_iir[n]:>14.10f}")

nonzero_fir = sum(1 for v in fir_response if abs(v) > 1e-15)
print()
print(f"FIR-এর নন-জিরো ট্যাপ সংখ্যা: {nonzero_fir}  (মোট দৈর্ঘ্য {len(fir_response)})")
print(f"IIR-এর n=14-এ মান: {y_iir[14]}  (ঠিক শূন্য? {y_iir[14] == 0.0})")

    
প্রকৃত আউটপুটে দেখা যায় — FIR ফিল্টারের ইমপালস রেসপন্স n=0 থেকে n=4 পর্যন্ত ঠিক 0.2 (৫টি ট্যাপ), তারপর n=5 থেকে একদম 0.0 — চিরকালের জন্য। অন্যদিকে IIR ফিল্টারের রেসপন্স 1.0, 0.5, 0.25, 0.125, ... এভাবে অর্ধেক হয়ে কমতে থাকে, এবং n=14-এও এর মান 6.103515625 × 10⁻⁵ — অত্যন্ত ছোট কিন্তু গাণিতিকভাবে ঠিক শূন্য নয়। এই দুটোর গঠনই 0.5ⁿ — জ্যামিতিক (geometric) ক্ষয়, যা কখনো ঠিক শূন্যে পৌঁছায় না (শুধু সীমাহীনভাবে কাছাকাছি যায়) — এটাই "ইনফাইনাইট ইমপালস রেসপন্স" নামের কারণ।
মূল কথা · Key takeaway

FIR বনাম IIR-এর পার্থক্য কেবল তাত্ত্বিক নয় — এটি সরাসরি প্রভাব ফেলে স্ট্যাবিলিটি (FIR সবসময় নিরাপদ), ফেজ (FIR সহজে লিনিয়ার), আর কম্পিউটেশন কস্টের (IIR প্রায়ই বেশি এফিসিয়েন্ট) উপর। M7 (L31–L34) FIR ফিল্টার কীভাবে ডিজাইন ও ইমপ্লিমেন্ট করতে হয় শেখাবে; M8 (L35 থেকে) একই প্রশ্ন IIR-এর জন্য কভার করবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ কেন একটি FIR ফিল্টার সবসময় BIBO স্ট্যাবল হয়, তা প্রমাণ ছাড়াই যুক্তি দিয়ে ব্যাখ্যা করুন।

M4/L13-এ শেখা BIBO স্ট্যাবিলিটির শর্ত হলো ইমপালস রেসপন্স "অ্যাবসোলিউটলি সামেবল" হতে হবে, অর্থাৎ sum(abs(h[n]) for n in ...) < infinity। একটি FIR ফিল্টারের ইমপালস রেসপন্সে মাত্র M সংখ্যক সসীম, সীমিত মানের নন-জিরো টার্ম থাকে (উপরের কোডে M=5) — একটি সসীম সংখ্যক সসীম মানের যোগফল সবসময় সসীম, তাই শর্তটি স্বয়ংক্রিয়ভাবে পূরণ হয়। IIR-এ ইমপালস রেসপন্স চিরকাল চলতে থাকে বলে এই যোগফল সসীম কিনা তা পোলের অবস্থানের উপর নির্ভর করে যাচাই করতে হয়।

প্র ০২ উপরের IIR ফিল্টার n=14-এও ঠিক শূন্য হয়নি, কিন্তু ব্যবহারিক দিক থেকে (যেমন একটি অডিও প্রসেসিং সিস্টেমে) এটি কি সমস্যা তৈরি করে?

ব্যবহারিকভাবে না — 6.1 × 10⁻⁵ মাত্রার একটি মান শব্দে বা যেকোনো বাস্তব পরিমাপে সম্পূর্ণ অশ্রাব্য/অদৃশ্য, এবং ফ্লোটিং-পয়েন্ট গণনার নির্ভুলতার সীমার (সাধারণত ~10⁻¹⁶) তুলনায় অনেক বড় হলেও কার্যত "শূন্যের সমান" ধরা হয়। সমস্যাটি সম্পূর্ণ তাত্ত্বিক/গাণিতিক — একটি IIR ফিল্টারকে গাণিতিকভাবে "সসীম দৈর্ঘ্যের" বলা যায় না, তাই একে যেকোনো সসীম-দৈর্ঘ্যের কনভোলিউশন সমষ্টি দিয়ে এক্সাক্টলি প্রতিস্থাপন করা যায় না — বাস্তবায়ন করতে হয় রিকার্সিভ ডিফারেন্স ইকুয়েশন হিসেবে (M8-এ বিস্তারিত)।

প্র ০৩ একটি পুরনো অ্যানালগ RC ফিল্টার সার্কিট (রোধ + ক্যাপাসিটর) FIR নাকি IIR-এর সাথে বেশি মিলে যায়, এবং কেন?

IIR-এর সাথে। একটি RC লো-পাস ফিল্টারের আউটপুট (ক্যাপাসিটরের ভোল্টেজ) তার নিজের অতীত মানের উপর নির্ভরশীল (ক্যাপাসিটর "মনে রাখে" তার আগের চার্জ) — এটাই ফিডব্যাকের একটি ভৌত রূপ। এর ইমপালস রেসপন্সও একটি ক্ষয়িষ্ণু এক্সপোনেনশিয়াল, যা তাত্ত্বিকভাবে কখনো ঠিক শূন্যে পৌঁছায় না — ঠিক উপরের কোডের IIR রেসপন্সের মতোই। M8-এ দেখা যাবে (L36-L38) কীভাবে এমন অ্যানালগ ফিল্টার প্রোটোটাইপ থেকে সরাসরি ডিজিটাল IIR ফিল্টার ডিজাইন করা হয় (বাইলিনিয়ার ট্রান্সফর্ম দিয়ে)।

অনুশীলন

  1. চিন্তা করুন: যদি FIR ফিল্টারটি ৫-ট্যাপের বদলে ৩-ট্যাপ মুভিং-এভারেজ হতো (h = [1/3, 1/3, 1/3]), তাহলে ইমপালস রেসপন্সে কতগুলো নন-জিরো মান থাকবে এবং কোন n থেকে এটি শূন্যে নামবে বলে আপনার ধারণা?

    ঠিক ৩টি নন-জিরো মান (n=0,1,2, প্রতিটি 0.333333), এবং n=3 থেকে ঠিক 0.0। সাধারণভাবে, একটি M-ট্যাপ FIR ফিল্টারের ইমপালস রেসপন্সে ঠিক M সংখ্যক নন-জিরো মান থাকে — কোয়েফিসিয়েন্টের প্রকৃত মান যাই হোক না কেন।

  2. পরীক্ষা করুন: উপরের কোড সেলে IIR ফিডব্যাক কোয়েফিসিয়েন্ট a = 0.5-কে a = 0.8-এ পরিবর্তন করে Run চাপুন — n=14-এ মান কত হয় দেখুন, এবং এটি কি 0.5-এর তুলনায় শূন্যের কাছাকাছি পৌঁছায় দ্রুত না ধীরে?

    a=0.8 হলে y[14] = 0.8¹⁴ ≈ 0.043980 — যা a=0.5-এর তুলনায় (6.1 × 10⁻⁵) অনেক বড়, অর্থাৎ ক্ষয় অনেক ধীর। এটাই স্বাভাবিক — ফিডব্যাক কোয়েফিসিয়েন্ট যত ১-এর কাছাকাছি, ইমপালস রেসপন্স তত ধীরে ক্ষয় হয় (কিন্তু abs(a) < 1 থাকা পর্যন্ত সিস্টেম এখনও BIBO স্ট্যাবল, M4/L13-এর পোল-শর্ত অনুযায়ী)।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
FFT-এর প্রয়োগ — বাস্তবে স্পেকট্রাল অ্যানালাইসিস