পাঠ ১৭ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Digital Signal Processing / ইনভার্স

ইনভার্স Z-ট্রান্সফর্ম

Inverse Z-transform
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ইনভার্স Z-ট্রান্সফর্মের ধারণা এবং কেন এটি ROC (L16)-এর উপর নির্ভরশীল
  • একটি "প্রস্তাব করো, তারপর যাচাই করো" পদ্ধতি — যা প্রায়ই টেবিল-লুকআপ ও পার্শিয়াল-ফ্র্যাকশন পদ্ধতির পেছনের আসল যুক্তি
  • Python কোড দিয়ে একটি প্রস্তাবিত সিকোয়েন্সের Z-ট্রান্সফর্ম গণনা করে টার্গেট মানের সাথে তুলনা করা
  • কেন ভুল প্রস্তাব সহজেই সংখ্যাগতভাবে ধরা পড়ে

১ · ইনভার্স Z-ট্রান্সফর্ম কী

L14-এ আমরা x[n] থেকে X(z) বের করেছি (ফরওয়ার্ড Z-ট্রান্সফর্ম)। ইনভার্স Z-ট্রান্সফর্মInverse Z-transformএকটি Z-ডোমেইন ফাংশন X(z) (এবং তার ROC) থেকে মূল টাইম-ডোমেইন সিগন্যাল x[n] ফিরে বের করার প্রক্রিয়া। উল্টো দিকে যায় — X(z) (এবং তার ROC, কারণ L16-এ দেখেছি একই সূত্র ভিন্ন ROC-এ ভিন্ন সিগন্যালের প্রতিনিধিত্ব করতে পারে) থেকে x[n] বের করা। আনুষ্ঠানিক সংজ্ঞা একটি কনট্যুর ইন্টিগ্রাল ব্যবহার করে, কিন্তু ব্যবহারিকভাবে সবচেয়ে সাধারণ পদ্ধতি হলো পরিচিত জ্যামিতিক সিরিজ প্যাটার্ন চেনা (যেমন L16-এর 1/(1-az^-1) ফর্ম, যা সবসময় a^n u[n]-এর সাথে সম্পর্কিত) অথবা জটিল রেশনাল ফাংশনের জন্য পার্শিয়াল ফ্র্যাকশনে ভেঙে সেই প্যাটার্ন প্রয়োগ করা।

২ · প্রস্তাব করো, তারপর যাচাই করো

এই পাঠে আমরা একটি সহজ ও সংখ্যাগতভাবে যাচাইযোগ্য পদ্ধতি ব্যবহার করব: একটি সিকোয়েন্স প্রস্তাব করা, তারপর L14-এর পদ্ধতিতে তার Z-ট্রান্সফর্ম গণনা করে দেখা এটি আসল X(z)-এর মানের সাথে মেলে কিনা। L16-এ আমরা দেখেছি:

$$X(z) = \frac{1}{1 - 0.5\,z^{-1}}, \qquad |z| > 0.5 \qquad \longleftrightarrow \qquad x[n] = 0.5^n\, u[n]$$

যেহেতু x[n] অসীম-লেংথ, আমরা সরাসরি L14-এর ফিনিট-লুপ পদ্ধতি ব্যবহার করতে পারি না — কিন্তু একটি ট্রাংকেটেড (প্রথম N পদ পর্যন্ত কাটা) সাম দিয়ে আনুমানিক মান বের করে, N বাড়ানোর সাথে সাথে সেটি আসল X(z)-এর দিকে কনভার্জ করে কিনা তা দেখানো যায় — এটাই এই পাঠের মূল ডেমো।

প্যাটার্ন-চেনা পদ্ধতি
1/(1-az^-1) ফর্ম চিনলেই সরাসরি a^n u[n] লেখা যায় — এটিই সবচেয়ে দ্রুত ইনভার্স Z-ট্রান্সফর্ম কৌশল, একটি "লুকআপ টেবিল"-এর মতো।
সংখ্যাগত ক্রস-চেক
প্রস্তাবিত সিকোয়েন্সের Z-ট্রান্সফর্ম গণনা করে টার্গেট X(z)-এর সাথে তুলনা করলে সিদ্ধান্তটি অনুমান থাকে না, যাচাইযোগ্য তথ্য হয়ে যায়।
জটিল ক্ষেত্রে পার্শিয়াল ফ্র্যাকশন
জটিল রেশনাল X(z)-কে সরল 1/(1-az^-1)-আকৃতির টার্মে ভেঙে (পার্শিয়াল ফ্র্যাকশন) প্রতিটি টার্মে একই প্যাটার্ন প্রয়োগ করা যায় — L18-19-এ এই কৌশলের প্রয়োগ দেখা যাবে।

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

নিচের কোডে প্রস্তাবিত সিকোয়েন্স x[n] = 0.5^n-এর Z-ট্রান্সফর্ম z=2+0j-এ ট্রাংকেটেড সাম হিসেবে গণনা করে টার্গেট (বদ্ধ-রূপ) মানের সাথে তুলনা করা হয়েছে, তারপর একটি দ্বিতীয় টেস্ট পয়েন্টেও যাচাই করা হয়েছে, এবং শেষে একটি ইচ্ছাকৃত ভুল প্রস্তাব (x[n]=2^n) দিয়ে দেখানো হয়েছে ক্রস-চেক কীভাবে ব্যর্থ হয়।

Python
# আসল: X(z) = 1/(1-0.5z^-1), ROC |z|>0.5 (L16 থেকে)
# প্রস্তাব: x[n] = 0.5^n u[n]  (candidate inverse)
# যাচাই: L14-এর পদ্ধতিতে x[n]-এর Z-transform সরাসরি (truncated sum) হিসেব করে
# X(z)-এর বদ্ধ-রূপ মানের সাথে তুলনা করা, একটি টেস্ট পয়েন্টে (|z|>0.5)

def X_closed(z):
    return 1 / (1 - 0.5 * z**-1)

def Zt_truncated(z, N):
    total = 0j
    for n in range(N):
        c = 0.5**n            # প্রস্তাবিত x[n] = 0.5^n
        total += c * z**(-n)
    return total

z_test = 2 + 0j
target = X_closed(z_test)
print(f"টেস্ট পয়েন্ট z = {z_test},  |z| = {abs(z_test)} > 0.5  (ROC-এর ভেতরে)")
print(f"X(z) বদ্ধ-রূপ থেকে টার্গেট মান = {target}")
print()
for N in [1, 2, 5, 10, 20, 40]:
    approx = Zt_truncated(z_test, N)
    err = abs(approx - target)
    print(f"N={N:>2} পদ দিয়ে প্রস্তাবিত x[n]-এর Z-transform = {approx}   ত্রুটি = {err:.3e}")

print()
z_test2 = 1 + 1j
target2 = X_closed(z_test2)
approx2 = Zt_truncated(z_test2, 40)
print(f"দ্বিতীয় টেস্ট পয়েন্ট z = {z_test2}: X(z) = {target2},  N=40 আনুমানিক = {approx2},  ত্রুটি = {abs(approx2-target2):.3e}")

print()
# ভুল প্রস্তাব -- x[n] = 0.5^n-এর বদলে x[n] = 2^n (ভিন্ন সিকোয়েন্স/ROC)
def Zt_truncated_wrong(z, N):
    total = 0j
    for n in range(N):
        c = 2.0**n
        total += c * z**(-n)
    return total

wrong_approx = Zt_truncated_wrong(z_test, 10)
print(f"ভুল প্রস্তাব x[n]=2^n দিয়ে N=10 পদ -> {wrong_approx}  (X(z) টার্গেট {target}-এর ধারেকাছেও নয়!)")

    
Run চেপে দেখুন — টার্গেট মান X(2) = 1.3333333333333333। ট্রাংকেটেড সাম N=1-এ মাত্র 1.0 (ত্রুটি 3.333e-01), N=10-এ 1.3333320617675781 (ত্রুটি 1.272e-06), আর N=40-এ ঠিক টার্গেটের সমান, ত্রুটি 0.000e+00 — স্পষ্ট কনভারজেন্স। দ্বিতীয় টেস্ট পয়েন্ট z=1+1j-এও ত্রুটি মাত্র 2.289e-16 (ফ্লোটিং-পয়েন্ট নির্ভুলতার সীমা)। কিন্তু ভুল প্রস্তাব x[n]=2^n দিয়ে N=10-এই ফলাফল 10+0j — টার্গেট 1.333-এর ধারেকাছেও নয়, বরং |z|=2-এর ROC |z|>2 হওয়ায় এই সিরিজ z=2-এ আসলে ডাইভার্জ করে (L16-এর যুক্তি অনুযায়ী)।
মূল কথা · Key takeaway

ইনভার্স Z-ট্রান্সফর্ম একটি "অনুমান" নয় — এটি একটি যাচাইযোগ্য গাণিতিক দাবি, যা L14-এর ফরওয়ার্ড পদ্ধতিতে সংখ্যাগতভাবে পরীক্ষা করা যায়। এই ফরওয়ার্ড-ইনভার্স জোড়া এবং ROC-নির্ভরতা L18-এ ট্রান্সফার ফাংশন ও L19-এ ডিফারেন্স ইকুয়েশন সমাধানের ভিত্তি তৈরি করে।

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

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

প্র ০১ কেন ভুল প্রস্তাব x[n]=2^n দিয়ে z=2-তে ক্রস-চেক ব্যর্থ হলো, অথচ x[n]=0.5^n দিয়ে সফল হলো?

কারণ x[n]=2^n-এর নিজস্ব ROC হলো |z|>2 (L16-এর জ্যামিতিক-সিরিজ যুক্তি অনুযায়ী, r=2/z-এর জন্য |2/z|<1)। টেস্ট পয়েন্ট z=2 এই ROC-এর ঠিক সীমানায়, তাই সিরিজ কনভার্জ করে না — যেকোনো ভুল প্রস্তাব দিলেই এভাবে ক্রস-চেক ব্যর্থ হবে, এটাই এই পদ্ধতির শক্তি।

প্র ০২ যদি ক্রস-চেকে ত্রুটি N বাড়ার সাথে কমতে থাকলেও কখনো ঠিক শূন্যে না পৌঁছায় (শুধু ছোট হতে থাকে), সেটি কি প্রস্তাবটি ভুল বলে ইঙ্গিত দেয়?

না, এটি স্বাভাবিক — কারণ আমরা একটি অসীম সিরিজকে ফিনিট N পদে কেটে নিচ্ছি, তাই কিছু অবশিষ্ট ("টেইল") ত্রুটি সবসময় থাকবে, যতক্ষণ না N সত্যিই অসীমে পৌঁছায়। গুরুত্বপূর্ণ হলো ত্রুটি N বাড়ার সাথে ধারাবাহিকভাবে ছোট হচ্ছে কিনা (কনভার্জ করছে কিনা) — উপরের ডেমোতে N=1→N=40-এ ত্রুটি 0.333 থেকে 0-তে নেমে এসেছে, যা একটি সঠিক প্রস্তাবের লক্ষণ।

প্র ০৩ L16-এর ROC ধারণা এই পাঠের ক্রস-চেকের সাথে কীভাবে যুক্ত?

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

অনুশীলন

  1. চিন্তা করুন: X(z) = 1/(1-0.5z^-1)-এর জন্য প্রস্তাবিত সিকোয়েন্স x[n]=0.5^n সঠিক প্রমাণিত হয়েছে। যদি কেউ ভুলবশত x[n] = -0.5^n (ঋণাত্মক চিহ্নসহ) প্রস্তাব করে, z=2+0j-এ তার Z-ট্রান্সফর্ম কত হবে বলে আপনার ধারণা, এবং টার্গেট 1.3333-এর সাথে মিলবে কি?

    যেহেতু প্রতিটি টার্মের চিহ্ন উল্টে যাবে, ফলাফলও উল্টে যাবে: প্রায় -1.3333। এটি টার্গেট +1.3333-এর সাথে মিলবে না — ত্রুটি প্রায় 2.667, যা N বাড়ালেও কমবে না (এটি একটি ধারাবাহিক, N-নির্ভরহীন ভুল, কনভারজেন্স-সমস্যা নয়)।

  2. পরীক্ষা করুন: উপরের কোড সেলের Zt_truncated ফাংশনে c = 0.5**n-কে c = -(0.5**n)-এ পরিবর্তন করে Run চেপে আপনার হিসেব যাচাই করুন।

    রান করলে N=40-এ ফলাফল প্রায় -1.3333333333333333 দেখাবে — টার্গেট 1.3333333333333333-এর সাথে ত্রুটি প্রায় 2.667, যা কোনো N-এই শূন্যে পৌঁছায় না। এটি নিশ্চিত করে x[n]=-0.5^n ভুল প্রস্তাব — চিহ্নটাও প্রস্তাবের অংশ, শুধু ম্যাগনিচিউড মিললেই যথেষ্ট নয়।

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

আগের পাঠ
কনভারজেন্সের অঞ্চল (ROC)