ডিফারেন্স ইকুয়েশন ও ইমপালস রেসপন্স
এই পাঠে যা শিখবেন
- ডিফারেন্স ইকুয়েশন কী এবং কীভাবে এটি একটি LTI সিস্টেমকে বর্ণনা করে
- একটি ডিফারেন্স ইকুয়েশন স্যাম্পল-বাই-স্যাম্পল সিমুলেট করা
- ইউনিট ইমপালস ইনপুট দিয়ে সিস্টেমের ইমপালস রেসপন্স বের করা
- ডিফারেন্স ইকুয়েশন ও কনভোলিউশনের মধ্যে সম্পর্ক বোঝা
১ · ডিফারেন্স ইকুয়েশন কী
একটি লিনিয়ার কনস্ট্যান্ট-কোয়েফিসিয়েন্ট ডিফারেন্স ইকুয়েশন (linear constant-coefficient
difference equation) হলো একটি LTI সিস্টেম বর্ণনা করার সবচেয়ে সরাসরি উপায় — আউটপুট
y[n]-কে ইনপুট x[n]-এর (এবং কখনো কখনো আউটপুটের নিজের আগের মানগুলোর, যেমন
L13/M8-এ IIR সিস্টেমে) একটি সরল বীজগাণিতিক সমীকরণ হিসেবে লেখা হয়। এই পাঠে আমরা একটি সাধারণ উদাহরণ
ব্যবহার করব:
লক্ষ্য করুন — এই ইকুয়েশনটি দেখতে ঠিক L09-এর h = [0.5, 0.5] ইমপালস রেসপন্সের সাথে কনভোলিউশনের
মতোই! এটা কাকতালীয় নয় — নিচে আমরা দেখব কেন।
২ · একটি টেস্ট ইনপুটে সরাসরি প্রয়োগ
একটি ডিফারেন্স ইকুয়েশন প্রয়োগ করতে আমরা n = 0 থেকে শুরু করে ক্রমান্বয়ে প্রতিটি
y[n] গণনা করি, ধরে নিই জিরো ইনিশিয়াল কন্ডিশন (x[-1] = 0, কারণ
সিস্টেমটি "শুরুর আগে" কিছু দেখেনি)। নিচের কোড সেলে এই লজিকটি একটি টেস্ট সিগন্যাল
x = [1, 3, 2, 5, 4, 0, -2, 1]-এর উপর সত্যিকারভাবে প্রয়োগ করা হয়েছে।
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] ইনপুট দিলে যে আউটপুট পাওয়া যায়, সেটাই ইমপালস রেসপন্স।
আমরা ঠিক একই ফাংশন ব্যবহার করব — শুধু ইনপুট হিসেবে এবার একটি ইউনিট ইমপালস দেব।
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-এ বিস্তারিত)।
এখন আমরা দেখতে পাই কেন 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-তে বিশেষভাবে গুরুত্বপূর্ণ কারণ এটি প্রমাণ করে ইমপালস রেসপন্স সত্যিই সেই একই সিস্টেম থেকে বের করা হয়েছে, আলাদা কোনো "শর্টকাট" সূত্র থেকে নয়।
অনুশীলন
-
চিন্তা করুন: প্রথম কোড সেলে
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। -
পরীক্ষা করুন: প্রথম কোড সেলটি Run চেপে চালান এবং টেবিলে
n=5সারিতেy[n]-এর প্রিন্ট করা মান আপনার হাতে-করা হিসেবের সাথে মেলে কিনা যাচাই করুন।রান করলে
n=5 | x[n]=0 | x[n-1]=4 | y[n]=2.00দেখাবে — আপনার হাতে-করা হিসেব ২.০-এর সাথে ঠিক মিলে যায়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ — কজালিটি, স্ট্যাবিলিটি ও BIBO স্ট্যাবিলিটি L13 একটি সিস্টেম কজাল কিনা এবং বাউন্ডেড ইনপুটে বাউন্ডেড আউটপুট দেয় কিনা তা কোড দিয়ে সত্যিকারভাবে যাচাই করা, সাথে একটি প্রকৃত অস্থির সিস্টেমের ডেমো।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
- Numerical Methods কোর্স সহোদর কোর্স সাধারণ সংখ্যাগত অ্যালগরিদম, রুট-ফাইন্ডিং, ইন্টিগ্রেশন ও ODE সলভিং-এর গভীর কভারেজ — এই কোর্স সেই একই "হাতে-লেখা" দর্শনের উপর সিগন্যাল-প্রসেসিং-নির্দিষ্ট দিকটি যোগ করে।