পাঠ ১২ · ৫৭-এর মধ্যে · মডিউল ৩
Home / Courses / Digital Signal Processing / ডিফারেন্স ইকুয়েশন

ডিফারেন্স ইকুয়েশন ও ইমপালস রেসপন্স

Difference equations & impulse response
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ডিফারেন্স ইকুয়েশন কী এবং কীভাবে এটি একটি LTI সিস্টেমকে বর্ণনা করে
  • একটি ডিফারেন্স ইকুয়েশন স্যাম্পল-বাই-স্যাম্পল সিমুলেট করা
  • ইউনিট ইমপালস ইনপুট দিয়ে সিস্টেমের ইমপালস রেসপন্স বের করা
  • ডিফারেন্স ইকুয়েশন ও কনভোলিউশনের মধ্যে সম্পর্ক বোঝা

১ · ডিফারেন্স ইকুয়েশন কী

একটি লিনিয়ার কনস্ট্যান্ট-কোয়েফিসিয়েন্ট ডিফারেন্স ইকুয়েশন (linear constant-coefficient difference equation) হলো একটি LTI সিস্টেম বর্ণনা করার সবচেয়ে সরাসরি উপায় — আউটপুট y[n]-কে ইনপুট x[n]-এর (এবং কখনো কখনো আউটপুটের নিজের আগের মানগুলোর, যেমন L13/M8-এ IIR সিস্টেমে) একটি সরল বীজগাণিতিক সমীকরণ হিসেবে লেখা হয়। এই পাঠে আমরা একটি সাধারণ উদাহরণ ব্যবহার করব:

$$y[n] = 0.5\,x[n] + 0.5\,x[n-1]$$

লক্ষ্য করুন — এই ইকুয়েশনটি দেখতে ঠিক L09-এর h = [0.5, 0.5] ইমপালস রেসপন্সের সাথে কনভোলিউশনের মতোই! এটা কাকতালীয় নয় — নিচে আমরা দেখব কেন।

২ · একটি টেস্ট ইনপুটে সরাসরি প্রয়োগ

একটি ডিফারেন্স ইকুয়েশন প্রয়োগ করতে আমরা n = 0 থেকে শুরু করে ক্রমান্বয়ে প্রতিটি y[n] গণনা করি, ধরে নিই জিরো ইনিশিয়াল কন্ডিশন (x[-1] = 0, কারণ সিস্টেমটি "শুরুর আগে" কিছু দেখেনি)। নিচের কোড সেলে এই লজিকটি একটি টেস্ট সিগন্যাল x = [1, 3, 2, 5, 4, 0, -2, 1]-এর উপর সত্যিকারভাবে প্রয়োগ করা হয়েছে।

Python
def apply_difference_equation(x):
    """y[n] = 0.5*x[n] + 0.5*x[n-1], কজাল, জিরো ইনিশিয়াল কন্ডিশন x[-1] = 0"""
    y = []
    for n in range(len(x)):
        xn = x[n]
        xn_1 = x[n - 1] if n - 1 >= 0 else 0.0
        y.append(0.5 * xn + 0.5 * xn_1)
    return y

x = [1, 3, 2, 5, 4, 0, -2, 1]
y = apply_difference_equation(x)

print("x =", x)
print("y = 0.5*x[n] + 0.5*x[n-1] =", y)
print()
print(f"{'n':>3} | {'x[n]':>6} | {'x[n-1]':>7} | {'y[n]':>6}")
for n in range(len(x)):
    xn_1 = x[n-1] if n-1 >= 0 else 0
    print(f"{n:>3} | {x[n]:>6} | {xn_1:>7} | {y[n]:>6.2f}")

    
কোডের প্রকৃত আউটপুট: y = [0.5, 2.0, 2.5, 3.5, 4.5, 2.0, -1.0, -0.5]। লক্ষ্য করুন প্রথম ৬টি মান (0.5, 2.0, 2.5, 3.5, 4.5, 2.0) হুবহু L09-এর কনভোলিউশন উদাহরণের আউটপুটের সাথে মিলে যায় (একই x = [1,3,2,5,4] প্রথম অংশ ব্যবহার করা হয়েছে) — এটাই পরবর্তী সেকশনে বিস্তারিত ব্যাখ্যা করা সংযোগের প্রথম ইঙ্গিত।

৩ · ইমপালস রেসপন্স ডেরাইভ করা

এখন প্রশ্ন — এই সিস্টেমের ইমপালস রেসপন্স h[n] কী? সংজ্ঞা অনুযায়ী, একটি ইউনিট ইমপালস \delta[n] = [1, 0, 0, 0, \ldots] ইনপুট দিলে যে আউটপুট পাওয়া যায়, সেটাই ইমপালস রেসপন্স। আমরা ঠিক একই ফাংশন ব্যবহার করব — শুধু ইনপুট হিসেবে এবার একটি ইউনিট ইমপালস দেব।

Python
L = 8
impulse = [1.0] + [0.0] * (L - 1)     # ইউনিট ইমপালস: [1, 0, 0, 0, 0, 0, 0, 0]
h = apply_difference_equation(impulse)   # একই ফাংশন, শুধু ইনপুট বদলে গেছে

print("unit impulse =", impulse)
print("impulse response h[n] =", h)
print()
print(f"{'n':>3} | {'h[n]':>6}")
for n in range(L):
    print(f"{n:>3} | {h[n]:>6.2f}")

    
কোডের প্রকৃত আউটপুট: h = [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] — অর্থাৎ ইমপালস রেসপন্স হলো ঠিক [0.5, 0.5] (বাকি সব শূন্য)। এটাই ডিফারেন্স ইকুয়েশনের কোয়েফিসিয়েন্টগুলোর সাথে হুবহু মিলে যায় — এই সিস্টেমের ক্ষেত্রে কোয়েফিসিয়েন্ট আর ইমপালস রেসপন্স একই জিনিস, কারণ এটি একটি সহজ FIR (Finite Impulse Response)-ধরনের সিস্টেম (M7-এ বিস্তারিত)।
মূল কথা · Key takeaway

এখন আমরা দেখতে পাই কেন L09-এ প্রথম ৬টি আউটপুট মান মিলে গিয়েছিল — এই ডিফারেন্স ইকুয়েশনটি আসলে ঠিক h = [0.5, 0.5]-এর সাথে ইনপুটকে কনভলভ করার সমতুল্য। এটি একটি সাধারণ, শক্তিশালী সত্য: যেকোনো FIR-ধরনের ডিফারেন্স ইকুয়েশন y[n] = \sum_k b_k\, x[n-k]-এর ইমপালস রেসপন্স হলো ঠিক কোয়েফিসিয়েন্ট তালিকা [b_0, b_1, \ldots], এবং তা প্রয়োগ করা মানে সেই তালিকার সাথে কনভলভ করা। L13-এ আমরা দেখব যখন ডিফারেন্স ইকুয়েশনে আউটপুটের আগের মান (y[n-1]) জড়িত থাকে (রিকার্সিভ/IIR সিস্টেম), তখন ইমপালস রেসপন্স আর কখনো ঠিক শূন্যে পৌঁছায় না।

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

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

প্র ০১ দ্বিতীয় কোড সেলে h[2] থেকে h[7] পর্যন্ত সব শূন্য কেন? ইমপালস তো শুধু n=0-এ ১, বাকি সব 0 — এটার সাথে এর কী সম্পর্ক?

ইকুয়েশনটি শুধু বর্তমান ও ঠিক আগের ইনপুট স্যাম্পল ব্যবহার করে (x[n] ও x[n-1])। n \ge 2-এর জন্য, x[n] = 0 (ইমপালসের পরে সবই শূন্য) এবং x[n-1] = 0 (কারণ n-1 \ge 1, সেটাও শূন্য) — তাই y[n] = 0.5\times 0 + 0.5\times 0 = 0। ইমপালসের প্রভাব মাত্র ২টি স্যাম্পল পরেই সম্পূর্ণ শেষ হয়ে যায় — এটাই একটি ফাইনাইট ইমপালস রেসপন্সের সংজ্ঞা।

প্র ০২ যদি ইকুয়েশনটি y[n] = 0.5\,x[n] + 0.5\,x[n-1] + 0.5\,x[n-2] করা হতো (৩-ট্যাপ), তাহলে ইমপালস রেসপন্স h কেমন হতো বলে মনে হয়?

h = [0.5, 0.5, 0.5, 0, 0, \ldots] — ঠিক কোয়েফিসিয়েন্টগুলোর তালিকা, কারণ ইউনিট ইমপালস দিলে প্রতিটি y[n] সরাসরি সংশ্লিষ্ট কোয়েফিসিয়েন্ট বের করে দেয় (x-এর একমাত্র অ-শূন্য মানটি n=0-এ, তাই y[k] = 0.5 যতক্ষণ x[k]-এর ইনডেক্স বৈধ থাকে)।

প্র ০৩ এই পাঠে আমরা "একই ফাংশন, ভিন্ন ইনপুট" পদ্ধতি ব্যবহার করেছি — সাধারণ টেস্ট ইনপুটের জন্যও, ইমপালস রেসপন্স বের করার জন্যও। এটা কোড-ডিজাইনের দিক থেকে কেন গুরুত্বপূর্ণ?

এটি নিশ্চিত করে যে আমরা একই সিস্টেম লজিক নিয়ে কাজ করছি — যদি আলাদা ফাংশন লেখা হতো, তাহলে দুটোর মধ্যে ভুলবশত অসামঞ্জস্যতা (inconsistency) ঢুকে যাওয়ার ঝুঁকি থাকত। "একই ফাংশন, ভিন্ন ইনপুট" পদ্ধতি একটি সাধারণ, নির্ভরযোগ্য সফটওয়্যার-ইঞ্জিনিয়ারিং প্র্যাকটিস — DSP-তে বিশেষভাবে গুরুত্বপূর্ণ কারণ এটি প্রমাণ করে ইমপালস রেসপন্স সত্যিই সেই একই সিস্টেম থেকে বের করা হয়েছে, আলাদা কোনো "শর্টকাট" সূত্র থেকে নয়।

অনুশীলন

  1. চিন্তা করুন: প্রথম কোড সেলে y[5]-এর মান হাতে হিসেব করুন — মনে রাখুন x = [1, 3, 2, 5, 4, 0, -2, 1], তাই x[5] = 0 ও x[4] = 4।

    y[5] = 0.5\times x[5] + 0.5\times x[4] = 0.5\times 0 + 0.5\times 4 = 0 + 2.0 = 2.0।

  2. পরীক্ষা করুন: প্রথম কোড সেলটি Run চেপে চালান এবং টেবিলে n=5 সারিতে y[n]-এর প্রিন্ট করা মান আপনার হাতে-করা হিসেবের সাথে মেলে কিনা যাচাই করুন।

    রান করলে n=5 | x[n]=0 | x[n-1]=4 | y[n]=2.00 দেখাবে — আপনার হাতে-করা হিসেব ২.০-এর সাথে ঠিক মিলে যায়।

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

আগের পাঠ
কোরিলেশন — ক্রস-কোরিলেশন ও অটোকোরিলেশন