কনভারজেন্সের অঞ্চল (ROC)
এই পাঠে যা শিখবেন
- কেন Z-ট্রান্সফর্মের সংজ্ঞা একটি অসীম সিরিজ, এবং কেন সেই সিরিজ সবসময় কনভার্জ করে না
- Region of Convergence (ROC)-এর সংজ্ঞা এবং একটি জ্যামিতিক-সিরিজ উদাহরণে এর প্রকৃত মান
- Python কোড দিয়ে ROC-এর ভেতরে ও বাইরে আংশিক যোগফলের ভিন্ন আচরণ সংখ্যাগতভাবে দেখা
- কেন একই
X(z)সূত্রের একাধিক সম্ভাব্য ROC থাকতে পারে (ভিন্ন ভিন্ন সিগন্যালের জন্য)
১ · কেন কনভারজেন্স গুরুত্বপূর্ণ
L14-এ আমরা ফিনিট-লেংথ সিগন্যালের Z-ট্রান্সফর্ম নিয়ে কাজ করেছি — সেখানে যোগফল ফিনিট বলে কোনো সমস্যা ছিল
না। কিন্তু বাস্তব বিশ্বের অনেক সিগন্যাল অসীম-লেংথ (যেমন একটি ক্ষয়প্রাপ্ত এক্সপোনেনশিয়াল
x[n] = 0.5^n, যা কখনো ঠিক শূন্য হয় না)। এমন সিগন্যালের জন্য
একটি অসীম সিরিজ — এবং যেকোনো অসীম সিরিজের মতোই, এটি কিছু z-মানে একটি সসীম মানে
কনভার্জConvergenceএকটি অসীম সিরিজের আংশিক যোগফল যত বেশি পদ যোগ করা হয় ততই একটি নির্দিষ্ট সসীম মানের কাছাকাছি পৌঁছায় — একে বলে সিরিজটি সেই মানে কনভার্জ করছে।
করে, আবার অন্য z-মানে অসীমের দিকে বেড়ে যায় (ডাইভার্জ করে)। যেখানে সিরিজটি কনভার্জ করে না,
সেখানে X(z)-এর কোনো অর্থ নেই — তাই ROC ছাড়া একটি Z-ট্রান্সফর্মের বর্ণনা অসম্পূর্ণ।
২ · একটি ক্লাসিক উদাহরণ
ধরা যাক x[n] = 0.5^n, সব n >= 0-এর জন্য (কজাল)। এটি একটি জ্যামিতিক সিরিজ:
একটি জ্যামিতিক সিরিজ $\sum r^n$ কনভার্জ করে ঠিক তখনই যখন $|r| < 1$। এখানে $r = 0.5/z$, তাই কনভারজেন্সের শর্ত $|0.5/z| < 1$, অর্থাৎ $|z| > 0.5$ — এটাই এই সিগন্যালের ROC। এই অঞ্চলে বদ্ধ-রূপ (closed-form) যোগফল হলো:
$$X(z) = \frac{1}{1 - 0.5\,z^{-1}}, \qquad |z| > 0.5$$|z| > 0.5-এ আংশিক যোগফল একটি নির্দিষ্ট সসীম মানে স্থির হয়ে যায় — সিরিজ কনভার্জ করে।|z| <= 0.5-এ আংশিক যোগফল অসীমের দিকে বেড়ে যায় — সিরিজ ডাইভার্জ করে, X(z)-এর কোনো অর্থ থাকে না।একটি কজাল (ডানদিকে অসীম) সিগন্যালের ROC সবসময় একটি বৃত্তের বাইরের অঞ্চল (
|z| > কিছু ব্যাসার্ধ) — এই প্যাটার্নটি L18-এর পোল-জিরো অ্যানালাইসিসে ফিরে আসবে।৩ · একটি সত্যিকারের ডেমো — কনভারজেন্স বনাম ডাইভারজেন্স
নিচের কোডে তিনটি টেস্ট পয়েন্ট ব্যবহার করা হয়েছে: z=1 (|z|=1 > 0.5, ROC-এর
ভেতরে), z=0.5 (|z|=0.5, ঠিক ROC-এর সীমানায়) এবং z=0.3
(|z|=0.3 < 0.5, ROC-এর বাইরে)। প্রতিটির জন্য আংশিক যোগফল N = 5, 10, 20, 50, 100
পদ পর্যন্ত গণনা করে দেখা হয়েছে সেগুলো কনভার্জ করে নাকি ডাইভার্জ করে।
# x[n] = 0.5^n n >= 0-এর জন্য (কজাল)
# X(z) = sum_{n=0}^inf 0.5^n z^-n = 1 / (1 - 0.5 z^-1), ROC: |z| > 0.5
def closed_form(z):
return 1 / (1 - 0.5 * z**-1)
def partial_sum(z, N):
total = 0j
for n in range(N):
total += (0.5**n) * z**(-n)
return total
test_zs = [1+0j, 0.5+0j, 0.3+0j]
Ns = [5, 10, 20, 50, 100]
for z in test_zs:
print(f"--- z = {z} |z| = {abs(z)} ---")
if abs(z) > 0.5:
cf = closed_form(z)
print(f" বদ্ধ-রূপ (closed form) X(z) = {cf}")
else:
print(" |z| <= 0.5 -> ROC-এর বাইরে, বদ্ধ-রূপ প্রযোজ্য নয়")
for N in Ns:
s = partial_sum(z, N)
print(f" N={N:>3} পদ পর্যন্ত আংশিক যোগফল = {s} |S_N| = {abs(s):.6e}")
print()
z=1-এ আংশিক যোগফল N=5-এ 1.9375,
N=10-এ 1.998, N=50-এ 1.999999999999998 — অর্থাৎ
বদ্ধ-রূপ মান X(1)=2-এর দিকে স্পষ্টভাবে কনভার্জ করছে। কিন্তু z=0.5 (ঠিক সীমানায়)-এ
আংশিক যোগফল প্রতিটি পদে ঠিক 1 করে বাড়ে (N=5→5, N=10→10, N=100→100) — কনভার্জ
করে না। আর z=0.3-এ পরিস্থিতি আরও নাটকীয়: N=20-এ যোগফল ইতিমধ্যে ≈41025,
N=100-এ তা ≈2.3×10²²-এ পৌঁছে যায় — স্পষ্টভাবে ডাইভার্জ করছে।
ROC হলো Z-ট্রান্সফর্মের "ব্যবহারযোগ্যতার অঞ্চল" — এর বাইরে সূত্রটি অর্থহীন। একটি সূত্র (যেমন
1/(1-0.5z^-1)) একাধিক ভিন্ন সিগন্যালের Z-ট্রান্সফর্ম হতে পারে, নির্ভর করে ROC কী — তাই
L17-এর ইনভার্স Z-ট্রান্সফর্মে ROC উল্লেখ করা অপরিহার্য।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
ঠিক সীমানায় (z=0.5) আংশিক যোগফল কনভার্জ না করে বরং প্রতি পদে ধ্রুবক হারে বাড়ে কেন?
কারণ z=0.5-এ প্রতিটি পদ (0.5)^n · (0.5)^-n = 1 — অর্থাৎ প্রতিটি পদই ঠিক
1, আর Nটি পদ যোগ করলে যোগফল N। এটি অসীমের দিকে গেলেও এটি
"ডাইভার্জ" শব্দের একটি বিশেষ রূপ (লিনিয়ারলি বৃদ্ধি) — সীমানায় সাধারণত সিরিজ কনভার্জ করে না, এটাই
স্বাভাবিক আচরণ।
প্র ০২
যদি সিগন্যাল x[n] = 0.5^n-এর বদলে x[n] = 0.9^n হতো, ROC কেমন হতো?
একই যুক্তিতে $r = 0.9/z$, কনভারজেন্সের শর্ত $|0.9/z| < 1$ অর্থাৎ $|z| > 0.9$। অর্থাৎ ROC-এর ব্যাসার্ধ
মূল সিগন্যালের ক্ষয়-হারের (এখানে 0.9) সমান — সাধারণ প্যাটার্ন: x[n]=a^n u[n]-এর
ROC সবসময় |z| > |a|।
প্র ০৩
উপরের ডেমোতে z=0.3-এ আংশিক যোগফল N=100-এ প্রায় 2.3×10²²-এ
পৌঁছায়। বাস্তব কম্পিউটেশনে এত বড় সংখ্যার সাথে কাজ করা কেন সমস্যাজনক হতে পারে?
এত বড় সংখ্যা ফ্লোটিং-পয়েন্ট প্রিসিশনের সীমা ছুঁয়ে ফেলতে পারে, এবং যদি সিরিজ আরও বেশি পদ পর্যন্ত চালানো
হয়, তা OverflowError-এর দিকেও যেতে পারে। এটি ঠিক M3/L13-এর অস্থিতিশীল (unstable)
সিস্টেমের আউটপুট বাড়ার মতোই আচরণ — ROC-এর বাইরে গণনা করলে সংখ্যাগতভাবে "বিস্ফোরিত" ফলাফল আসে, তাই
বাস্তব কোডে সবসময় গণনার আগে ROC নিশ্চিত করা জরুরি।
অনুশীলন
-
চিন্তা করুন: যদি টেস্ট পয়েন্ট
z = 5+0jব্যবহার করা হয় (যা|z|=5 > 0.5, ROC-এর ভেতরে), বদ্ধ-রূপX(5)-এর মান কত হবে বলে আপনার ধারণা? সূত্রX(z) = 1/(1-0.5z^-1)দিয়ে হাতে হিসেব করুন।$X(5) = 1/(1 - 0.5/5) = 1/(1-0.1) = 1/0.9 ≈ 1.1111$। যেহেতু
zবড়,0.5/zছোট, তাই ফলাফল1-এর কাছাকাছি হবে বলে প্রত্যাশা করা যায়। -
পরীক্ষা করুন: উপরের কোড সেলে
test_zsতালিকায়5+0jযোগ করে Run চেপে আপনার হিসেব যাচাই করুন, এবংNবাড়ার সাথে আংশিক যোগফল কত দ্রুত কনভার্জ করে তা লক্ষ্য করুন।রান করলে বদ্ধ-রূপ
X(5) ≈ 1.111111দেখাবে, এবং যেহেতু|0.5/5| = 0.1খুব ছোট, আংশিক যোগফল মাত্রN=5পদেই প্রায় সঠিক মানে পৌঁছে যাবে —zযত বড় (ROC-এর সীমানা থেকে যত দূরে), কনভারজেন্স তত দ্রুত।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
- L13 · কজালিটি, স্ট্যাবিলিটি ও BIBO স্ট্যাবিলিটি পূর্ব-প্রয়োজনীয় ROC ও পোল-জিরো অবস্থানের সাথে BIBO স্ট্যাবিলিটির সম্পর্ক L18-এ আরও স্পষ্ট হবে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।