পাঠ ১৮ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Digital Signal Processing / পোল-জিরো

ট্রান্সফার ফাংশন ও পোল-জিরো অ্যানালাইসিস

Transfer functions & pole-zero analysis
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ট্রান্সফার ফাংশনের সংজ্ঞা এবং কীভাবে এটি numerator/denominator কোয়েফিসিয়েন্ট থেকে গঠিত হয়
  • পোল ও জিরোর সংজ্ঞা এবং ১ম-অর্ডার ও ২য়-অর্ডার সিস্টেমে হাতে-কলমে সেগুলো গণনা করা
  • কমপ্লেক্স পোল-জোড়া বের করতে cmath.sqrt ব্যবহার করা (ঋণাত্মক ডিসক্রিমিন্যান্টের ক্ষেত্রে)
  • BIBO স্ট্যাবিলিটির পোল-ভিত্তিক মানদণ্ড প্রয়োগ করে একটি সিস্টেম স্ট্যাবল না আনস্ট্যাবল তা সংখ্যাগতভাবে যাচাই করা

১ · ট্রান্সফার ফাংশন কী

M3/L12-এ আমরা একটি সিস্টেমকে ডিফারেন্স ইকুয়েশন দিয়ে বর্ণনা করেছিলাম, এবং L15-এ শিখেছি কনভোলিউশন Z-ডোমেইনে গুণে পরিণত হয়: $Y(z) = X(z) \cdot H(z)$। এখান থেকে ট্রান্সফার ফাংশনTransfer functionএকটি LTI সিস্টেমের আউটপুট ও ইনপুটের Z-ট্রান্সফর্মের অনুপাত H(z)=Y(z)/X(z), যা সিস্টেমের ইমপালস রেসপন্সের Z-ট্রান্সফর্মের সমান এবং সাধারণত দুটো পলিনোমিয়ালের ভাগফল হিসেবে লেখা হয়। সংজ্ঞায়িত হয়:

$$H(z) = \frac{Y(z)}{X(z)} = \frac{b_0 + b_1 z^{-1} + \dots + b_M z^{-M}}{a_0 + a_1 z^{-1} + \dots + a_N z^{-N}}$$

এখানে b কোয়েফিসিয়েন্টগুলো numerator (সংখ্যা), a কোয়েফিসিয়েন্টগুলো denominator (হর) গঠন করে। এই একই H(z) আসলে সিস্টেমের ইমপালস রেসপন্স h[n]-এর Z-ট্রান্সফর্ম — অর্থাৎ M3/L12-এর ইমপালস রেসপন্স ও এখানকার ট্রান্সফার ফাংশন একই বস্তুর দুটো রূপ (টাইম-ডোমেইন বনাম Z-ডোমেইন)।

২ · পোল ও জিরো

জিরো হলো সেই z-মান যেখানে H(z) = 0 (numerator শূন্য)। পোল হলো সেই z-মান যেখানে H(z) অসীম হয়ে যায় (denominator শূন্য)। ১ম-অর্ডার সিস্টেমে এগুলো সরাসরি বীজগণিত দিয়ে পাওয়া যায়; ২য়-অর্ডার সিস্টেমে (denominator-কে z-এর পলিনোমিয়ালে রূপান্তর করে) কোয়াড্রেটিক ফর্মুলা ব্যবহার করা যায়:

$$z = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$

যখন ডিসক্রিমিন্যান্ট ($b^2-4ac$) ঋণাত্মক হয়, পোল-জোড়া কমপ্লেক্স-কনজুগেট হয়ে যায় — Python-এর cmath.sqrt() ঋণাত্মক সংখ্যার বর্গমূলও সঠিকভাবে কমপ্লেক্স সংখ্যা হিসেবে গণনা করে, তাই এটি এখানে সবচেয়ে নিরাপদ পছন্দ।

পোল
যেখানে H(z) অসীম — সিস্টেমের প্রাকৃতিক (স্বতঃস্ফূর্ত) রেসপন্স মোড নির্ধারণ করে। L19-এ ডিফারেন্স ইকুয়েশনের ক্লোজড-ফর্ম সমাধানে এই পোলগুলোই বেস তৈরি করবে।
জিরো
যেখানে H(z)=0 — কোন ফ্রিকোয়েন্সি সিস্টেম বাতিল করে দেয় তা নির্দেশ করে (M7-M8 ফিল্টার ডিজাইনে গুরুত্বপূর্ণ)।
স্ট্যাবিলিটির মানদণ্ড
BIBO স্ট্যাবিলিটির জন্য প্রয়োজন সব পোল কঠোরভাবে ইউনিট সার্কেলের ভেতরে (|pole| < 1) — এটি একটি সুপ্রতিষ্ঠিত textbook উপপাদ্য, M3/L13-এর BIBO আলোচনার সরাসরি সম্প্রসারণ।

৩ · একটি সত্যিকারের ডেমো — তিনটি সিস্টেম

নিচের কোডে তিনটি উদাহরণ পরীক্ষা করা হয়েছে: (ক) একটি ১ম-অর্ডার সিস্টেম H(z)=(1-0.5z^-1)/(1-0.8z^-1) (একটি সত্যিকারের জিরো এবং পোলসহ), (খ) একটি ২য়-অর্ডার সিস্টেম H(z)=1/(1-z^-1+0.5z^-2) (কমপ্লেক্স পোল-জোড়া), এবং (গ) একটি ইচ্ছাকৃতভাবে আনস্ট্যাবল সিস্টেম H(z)=1/(1-1.2z^-1)।

Python
import cmath

print("=== ১ম-অর্ডার উদাহরণ: H(z) = (1 - 0.5z^-1) / (1 - 0.8z^-1) ===")
# numerator: 1 - 0.5z^-1 = 0  ->  জিরো z = 0.5
# denominator: 1 - 0.8z^-1 = 0  ->  পোল z = 0.8
zero1 = 0.5 + 0j
pole1 = 0.8 + 0j
print(f"শূন্য (zero): z = {zero1}")
print(f"পোল (pole):  z = {pole1}   |pole| = {abs(pole1):.4f}")
print(f"স্ট্যাবিলিটি: |pole| < 1 ? {abs(pole1) < 1}  ->  {'স্ট্যাবল' if abs(pole1) < 1 else 'আনস্ট্যাবল'}")

print()
print("=== ২য়-অর্ডার উদাহরণ (কমপ্লেক্স পোল জোড়া): H(z) = 1 / (1 - z^-1 + 0.5z^-2) ===")
# denominator z-তে: z^2 - z + 0.5 = 0  (1 - z^-1 + 0.5z^-2 কে z^2 দিয়ে গুণ করে)
a, b, c = 1, -1, 0.5
disc = b*b - 4*a*c
print(f"characteristic equation: z^2 + ({b})z + ({c}) = 0,  ডিসক্রিমিন্যান্ট = {disc}")
sqrt_disc = cmath.sqrt(disc)
p1 = (-b + sqrt_disc) / (2*a)
p2 = (-b - sqrt_disc) / (2*a)
print(f"পোল ১: z = {p1}   |z| = {abs(p1):.6f}")
print(f"পোল ২: z = {p2}   |z| = {abs(p2):.6f}")
stable2 = abs(p1) < 1 and abs(p2) < 1
print(f"স্ট্যাবিলিটি: উভয় |pole| < 1 ? {stable2}  ->  {'স্ট্যাবল' if stable2 else 'আনস্ট্যাবল'}")

print()
print("=== আনস্ট্যাবল উদাহরণ: H(z) = 1 / (1 - 1.2z^-1) ===")
pole3 = 1.2 + 0j
print(f"পোল: z = {pole3}   |pole| = {abs(pole3):.4f}")
stable3 = abs(pole3) < 1
print(f"স্ট্যাবিলিটি: |pole| < 1 ? {stable3}  ->  {'স্ট্যাবল' if stable3 else 'আনস্ট্যাবল'}  (M3/L13-এর BIBO মানদণ্ড অনুযায়ী)")

print()
print("--- H(z) মান যাচাই কয়েকটি z-তে (২য়-অর্ডার উদাহরণ) ---")
def H2(z):
    return 1 / (1 - z**-1 + 0.5*z**-2)

for z in [2+0j, 1j, 1+1j]:
    print(f"z = {z}  ->  H(z) = {H2(z)}   |H(z)| = {abs(H2(z)):.6f}")

    
Run চেপে দেখুন — (ক) |pole1| = 0.8 < 1, স্ট্যাবল। (খ) ডিসক্রিমিন্যান্ট -1.0 (ঋণাত্মক), তাই পোল-জোড়া কমপ্লেক্স: 0.5+0.5j ও 0.5-0.5j, উভয়ের |pole| ≈ 0.707107 < 1 — স্ট্যাবল, যদিও পোল বাস্তব সংখ্যা নয়। (গ) |pole3| = 1.2 > 1 — আনস্ট্যাবল, ইউনিট সার্কেলের বাইরে। শেষে ২য়-অর্ডার সিস্টেমের H(z) মান: z=2-এ 1.6, z=1j-এ 0.4-0.8j (|H|≈0.894427), z=1+1j-এ 1.6-0.8j (|H|≈1.788854)।
মূল কথা · Key takeaway

পোল-জিরো অ্যানালাইসিস একটি সিস্টেমের আচরণ সম্পূর্ণরূপে ধরে ফেলে — শুধু abs(pole) < 1 চেক করলেই স্ট্যাবিলিটির প্রশ্নের উত্তর পাওয়া যায়, কোনো সিমুলেশন চালানো ছাড়াই। L19-এ আমরা এই একই পোল-খোঁজার পদ্ধতি (কোয়াড্রেটিক ফর্মুলা) পুনর্ব্যবহার করে সরাসরি একটি ডিফারেন্স ইকুয়েশনের ক্লোজড-ফর্ম সমাধান বের করব।

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

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

প্র ০১ ২য়-অর্ডার উদাহরণে পোল-জোড়া কমপ্লেক্স-কনজুগেট (0.5+0.5j ও 0.5-0.5j) হলো কেন — এটি কি কাকতালীয়?

না, এটি একটি সাধারণ নিয়ম — যখন denominator-এর কোয়েফিসিয়েন্টগুলো বাস্তব সংখ্যা হয় (যেমন আমাদের উদাহরণে 1, -1, 0.5), তখন কোয়াড্রেটিক ফর্মুলার ঋণাত্মক ডিসক্রিমিন্যান্টের কারণে জটিল মূলগুলো সবসময় কমপ্লেক্স-কনজুগেট জোড়ায় আসে ($a \pm jb$ আকারে)। বাস্তব-কোয়েফিসিয়েন্ট সিস্টেমে এটি গাণিতিকভাবে অবধারিত, কাকতালীয় নয়।

প্র ০২ কমপ্লেক্স পোল থাকলেও একটি সিস্টেম স্ট্যাবল হতে পারে — এটি প্রথম দেখায় অদ্ভুত মনে হতে পারে কেন, আর আসলে কেন এতে সমস্যা নেই?

অদ্ভুত মনে হতে পারে কারণ "স্থিতিশীলতা" শব্দটি স্বজ্ঞাগতভাবে বাস্তব সংখ্যার সাথে যুক্ত মনে হয়। কিন্তু স্ট্যাবিলিটির মানদণ্ড শুধু পোলের ম্যাগনিচিউড (abs()) নিয়ে কাজ করে, তার বাস্তব বা কাল্পনিক অংশ নিয়ে নয় — কমপ্লেক্স পোল ইউনিট সার্কেলের ভেতরে থাকলে তার সাথে সম্পর্কিত মোড (একটি স্পন্দনশীল, ক্ষয়প্রাপ্ত সাইনুসয়েড) সময়ের সাথে সাথে ক্ষয় পায়, ঠিক যেমন বাস্তব পোলের ক্ষেত্রে এক্সপোনেনশিয়াল ক্ষয় হয়।

প্র ০৩ যদি আনস্ট্যাবল উদাহরণে পোল 1.2-এর বদলে ঠিক 1.0 হতো, সিস্টেমটি কি স্ট্যাবল গণ্য হতো?

না — মানদণ্ডটি কঠোর অসমতা (|pole| < 1, <= নয়)। পোল ঠিক ইউনিট সার্কেলের উপর (|pole|=1) থাকলে সিস্টেম "মার্জিনালি স্ট্যাবল" — বাউন্ডেড কিন্তু ক্ষয়প্রাপ্ত নয় ইনপুট থেকে আউটপুট বাউন্ডেড থাকবে না বলে এটিকে BIBO-স্ট্যাবল হিসেবে গণ্য করা হয় না। L19-এর ডেমোতে ঠিক এই পরিস্থিতি (পোল z=1) দেখা যাবে।

অনুশীলন

  1. চিন্তা করুন: যদি ২য়-অর্ডার উদাহরণের denominator 1 - z^-1 + 0.5z^-2-এর বদলে 1 - 2.5z^-1 + z^-2 হতো (অর্থাৎ a=1, b=-2.5, c=1), ডিসক্রিমিন্যান্ট ধনাত্মক না ঋণাত্মক হবে বলে আপনার ধারণা, এবং তার মানে পোলগুলো বাস্তব না কমপ্লেক্স হবে?

    ডিসক্রিমিন্যান্ট $= (-2.5)^2 - 4(1)(1) = 6.25 - 4 = 2.25$ — ধনাত্মক, তাই পোল-জোড়া বাস্তব (কমপ্লেক্স নয়)। $\sqrt{2.25}=1.5$, তাই পোল $z = (2.5 \pm 1.5)/2$ — অর্থাৎ z=2.0 ও z=0.5।

  2. পরীক্ষা করুন: উপরের কোড সেলে ২য়-অর্ডার অংশে a, b, c = 1, -1, 0.5-কে a, b, c = 1, -2.5, 1-এ পরিবর্তন করে Run চেপে আপনার হিসেব যাচাই করুন, এবং স্ট্যাবিলিটির ফলাফল লক্ষ্য করুন।

    রান করলে পোল (2+0j) এবং (0.5+0j) দেখাবে (উভয়ই বাস্তব)। কিন্তু |pole1|=2.0 > 1, তাই এই সিস্টেম আনস্ট্যাবল — একটি মাত্র পোল ইউনিট সার্কেলের বাইরে গেলেই পুরো সিস্টেম আনস্ট্যাবল হয়ে যায়, বাকি পোল স্ট্যাবল অঞ্চলে থাকলেও।

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

আগের পাঠ
ইনভার্স Z-ট্রান্সফর্ম