পাঠ ৩৮ · ৫৭-এর মধ্যে · মডিউল ৮
Home / Courses / Digital Signal Processing / বাইলিনিয়ার ট্রান্সফর্ম

বাইলিনিয়ার ট্রান্সফর্ম — অ্যানালগ-টু-ডিজিটাল ফিল্টার কনভার্সন

Bilinear transform — analog-to-digital filter conversion
১১ মিনিট পড়া উচ্চ · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

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

  • বাইলিনিয়ার ট্রান্সফর্মের সাবস্টিটিউশন সূত্র এবং কেন এটি $s$-প্লেনের ইমাজিনারি অক্ষকে $z$-প্লেনের একক বৃত্তে ম্যাপ করে
  • একটি সহজ অ্যানালগ ফিল্টারে এই সাবস্টিটিউশন হাতে-কলমে প্রয়োগ করে ডিজিটাল কোয়েফিশিয়েন্ট ডেরাইভ করা
  • অ্যানালগ ও ডিজিটাল রেসপন্স সত্যিকারের কম্পিউট করে তুলনা করা, এবং ফ্রিকোয়েন্সি-ওয়ার্পিং সত্যিই ঘটতে দেখা
  • ডেরাইভ করা ডিফারেন্স ইকুয়েশনকে একটি সরাসরি সিমুলেশনের সাথে ক্রস-চেক করা

১ · সাবস্টিটিউশন সূত্র

বাইলিনিয়ার ট্রান্সফর্মBilinear transformএকটি সুপরিচিত গাণিতিক ম্যাপিং যা s-ডোমেইনের ইমাজিনারি অক্ষকে z-ডোমেইনের একক বৃত্তে ম্যাপ করে, ফলে একটি স্থিতিশীল অ্যানালগ ফিল্টার সবসময় একটি স্থিতিশীল ডিজিটাল ফিল্টারে রূপান্তরিত হয়। হলো একটি অ্যানালগ ট্রান্সফার ফাংশন $H(s)$-কে ডিজিটাল $H(z)$-এ রূপান্তরের সবচেয়ে বহুল-ব্যবহৃত, প্রমাণিত পদ্ধতি। এর সাবস্টিটিউশন সূত্র:

$$s = \frac{2}{T}\cdot\frac{1-z^{-1}}{1+z^{-1}}$$

এখানে $T$ হলো স্যাম্পলিং পিরিয়ড। এই ম্যাপিংয়ের একটি সুপ্রতিষ্ঠিত, গুরুত্বপূর্ণ বৈশিষ্ট্য হলো — এটি সম্পূর্ণ $s$-প্লেনের বাম অর্ধকে (স্থিতিশীল অঞ্চল) $z$-প্লেনের একক বৃত্তের ভেতরে ম্যাপ করে — মানে একটি স্থিতিশীল অ্যানালগ প্রোটোটাইপ (L36-L37, যার সব পোল বাম অর্ধ-প্লেনে) বাইলিনিয়ার ট্রান্সফর্মের পর সবসময় স্বয়ংক্রিয়ভাবে একটি স্থিতিশীল ডিজিটাল ফিল্টারে (সব পোল একক বৃত্তের ভেতরে, L13-এর BIBO শর্ত) পরিণত হয়।

২ · হাতে-কলমে ডেরিভেশন — $H(s) = 1/(s+1)$

একটি সহজ প্রথম-অর্ডার অ্যানালগ লো-পাস ফিল্টার নেওয়া যাক: $H(s) = \dfrac{1}{s+1}$। উপরের সাবস্টিটিউশন সরাসরি বসিয়ে ডিজিটাল $H(z)$ ডেরাইভ করা যাক। ধরা যাক $K = 2/T$:

$$H(z) = \frac{1}{\dfrac{2}{T}\cdot\dfrac{1-z^{-1}}{1+z^{-1}} + 1} = \frac{1+z^{-1}}{K(1-z^{-1}) + (1+z^{-1})} = \frac{1+z^{-1}}{(K+1) + (1-K)z^{-1}}$$

$(K+1)$ দিয়ে লব ও হর উভয়কে ভাগ করলে প্রমিত রূপ পাওয়া যায়:

$$H(z) = \frac{b_0 + b_1 z^{-1}}{1 + a_1 z^{-1}}, \qquad b_0 = b_1 = \frac{1}{K+1}, \quad a_1 = \frac{1-K}{K+1}$$

যা সরাসরি একটি ডিফারেন্স ইকুয়েশনে রূপান্তরিত হয়: $y[n] = b_0\,x[n] + b_1\,x[n-1] - a_1\,y[n-1]$। নিচের কোড সেলে $T=1$ (তাই $K=2$) নিয়ে এই কোয়েফিশিয়েন্ট সত্যিকারের কম্পিউট করা হয়েছে।

Python
import cmath, math

T = 1.0
K = 2 / T   # = 2.0

# হাতে-কলমে ডেরাইভ করা কোয়েফিশিয়েন্ট
b0 = 1 / (K + 1)
b1 = 1 / (K + 1)
a1 = (1 - K) / (K + 1)

print(f"K = 2/T = {K}")
print(f"b0 = {b0:.6f},  b1 = {b1:.6f},  a1 = {a1:.6f}")
print(f"ডিফারেন্স ইকুয়েশন: y[n] = {b0:.4f}*x[n] + {b1:.4f}*x[n-1] + {-a1:.4f}*y[n-1]")

    
কোড চালালে b0 = b1 = 0.333333 আর a1 = -0.333333 পাওয়া যায় — অর্থাৎ ফাইনাল ডিফারেন্স ইকুয়েশন হলো y[n] = 0.3333·x[n] + 0.3333·x[n-1] + 0.3333·y[n-1]। এটাই আমাদের প্রথম কার্যকর, সরাসরি ব্যবহারযোগ্য IIR ডিজিটাল ফিল্টার — একটি অ্যানালগ প্রোটোটাইপ থেকে হাতে-কলমে ডেরাইভ করা।

৩ · যাচাই — এবং ফ্রিকোয়েন্সি-ওয়ার্পিং

এখন যাচাই করা যাক এই রূপান্তর কতটা "সঠিক" — অ্যানালগ $H(s)$ কে $s=j\omega$-তে (সরাসরি 1j*omega বসিয়ে) আর ডিজিটাল $H(z)$ কে সংশ্লিষ্ট ডিজিটাল ফ্রিকোয়েন্সিতে ($z = e^{j\omega T}$, cmath.exp দিয়ে) মূল্যায়ন করে পাশাপাশি রাখা যাক:

Python
def H_analog(omega):
    s = 1j * omega
    return 1 / (s + 1)

def H_digital(omega, T):
    z = cmath.exp(1j * omega * T)
    num = b0 + b1 * z ** -1
    den = 1 + a1 * z ** -1
    return num / den

print(f"{'omega':>8} | {'|H_analog|':>10} | {'|H_digital|':>11} | {'পার্থক্য':>10}")
for omega in [0.01, 0.1, 0.3, 0.5, 1.0, 1.5, 2.0, 3.0]:
    Ha = abs(H_analog(omega))
    Hd = abs(H_digital(omega, T))
    print(f"{omega:>8.4f} | {Ha:>10.6f} | {Hd:>11.6f} | {abs(Ha - Hd):>10.6f}")

    
কম্পিউটেড টেবিলে স্পষ্ট দেখা যায় — $\omega=0.01$-এ পার্থক্য প্রায় শূন্য (0.000000), $\omega=0.3$-এ পার্থক্য ≈0.0006, কিন্তু $\omega=1.0$-এ পার্থক্য বেড়ে ≈0.032, আর $\omega=3.0$-এ পার্থক্য ≈0.281-এ পৌঁছায় — নিম্ন ফ্রিকোয়েন্সিতে চমৎকার মিল, কিন্তু ফ্রিকোয়েন্সি বাড়ার সাথে সাথে ক্রমাগত বাড়তে থাকা পার্থক্য। এটাই সুপরিচিত ফ্রিকোয়েন্সি-ওয়ার্পিং প্রভাব — বাইলিনিয়ার ট্রান্সফর্ম সসীম অ্যানালগ ফ্রিকোয়েন্সি অক্ষকে (${-\infty,\infty}$) একটি সসীম ডিজিটাল রেঞ্জে ($-\pi/T$ থেকে $\pi/T$) "গুটিয়ে" আনে বলে ফ্রিকোয়েন্সি অক্ষ অরৈখিকভাবে সংকুচিত হয় — যা এই সুপ্রতিষ্ঠিত সম্পর্ক দিয়ে বর্ণনা করা হয়: $\omega_{\text{analog}} = \frac{2}{T}\tan\!\left(\frac{\omega_{\text{digital}}\,T}{2}\right)$। ব্যবহারিক ফিল্টার ডিজাইনে এই ওয়ার্পিং আগে থেকে ক্ষতিপূরণ (pre-warp) করে নেওয়া হয়, যাতে নির্দিষ্ট কাটঅফ ফ্রিকোয়েন্সিতে ঠিক লক্ষ্যমাত্রা পাওয়া যায়।

সবশেষে, ডেরাইভ করা ডিফারেন্স ইকুয়েশনটি একটি সরাসরি সিমুলেশনে (স্যাম্পল-বাই-স্যাম্পল) প্রয়োগ করে দেখা যাক এর স্টেডি-স্টেট আউটপুট $H(z)$ সূত্রের পূর্বাভাসের সাথে মেলে কিনা — একটি genuine ক্রস-চেক:

Python
omega_test = 0.3
N = 200
x = [math.cos(omega_test * n) for n in range(N)]

y = [0.0] * N
for n in range(N):
    xn1 = x[n - 1] if n - 1 >= 0 else 0.0
    yn1 = y[n - 1] if n - 1 >= 0 else 0.0
    y[n] = b0 * x[n] + b1 * xn1 - a1 * yn1

steady = y[100:]                       # ট্রানজিয়েন্ট বাদ দিয়ে স্টেডি-স্টেট অংশ
amp_est = (max(steady) - min(steady)) / 2

print(f"H_digital সূত্র থেকে পূর্বাভাসিত |H(omega=0.3)| = {abs(H_digital(omega_test, T)):.6f}")
print(f"সরাসরি সিমুলেশন থেকে স্টেডি-স্টেট আউটপুট অ্যামপ্লিটিউড = {amp_est:.6f}")

    
কম্পিউটেড আউটপুটে $H_{\text{digital}}$ সূত্রের পূর্বাভাস $\approx 0.957226$, আর সরাসরি সিমুলেশনের স্টেডি-স্টেট অ্যামপ্লিটিউড $\approx 0.955266$ — দুটি সম্পূর্ণ স্বতন্ত্র পদ্ধতি (একটি বন্ধ-রূপ সূত্র, একটি স্যাম্পল-বাই-স্যাম্পল সিমুলেশন) প্রায় একই ফলাফল দিচ্ছে (ছোট পার্থক্যটি সীমিত $N$ ও ট্রানজিয়েন্টের অবশিষ্টাংশের কারণে) — এটি নিশ্চিত করে আমাদের হাতে-কলমে ডেরাইভ করা কোয়েফিশিয়েন্ট সঠিক।
মূল কথা · Key takeaway

বাইলিনিয়ার ট্রান্সফর্ম একটি নিশ্চিত, প্রমাণিত পথ দেয় — স্থিতিশীল অ্যানালগ প্রোটোটাইপ থেকে সবসময় স্থিতিশীল ডিজিটাল ফিল্টারে যাওয়া। কিন্তু ফ্রিকোয়েন্সি-ওয়ার্পিং একটি বাস্তব, ঘটমান প্রভাব — বিশেষভাবে উচ্চ ফ্রিকোয়েন্সির জন্য ডিজাইন করার সময় এটি হিসেবে রাখতে হয়। L39-এ এখন আমরা দেখব — এই ধরনের একটি ডিজিটাল ফিল্টারকে সত্যিকারের হার্ডওয়্যারে/কোডে কীভাবে বাস্তবায়ন করা হয়, দুটি প্রমিত স্ট্রাকচার — Direct Form I ও II — দিয়ে।

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

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

প্র ০১ যদি $T$-এর মান দ্বিগুণ করা হয় (স্যাম্পল রেট অর্ধেক করা হয়), তাহলে $K = 2/T$-এর মান কী হবে, এবং কোয়েফিশিয়েন্ট $b_0, b_1, a_1$ কীভাবে পরিবর্তিত হবে বলে আপনার ধারণা?

$T$ দ্বিগুণ হলে $K = 2/T$ অর্ধেক হয়ে যাবে (যেমন $T=2 \Rightarrow K=1$)। সূত্র অনুযায়ী $b_0=b_1=1/(K+1)$ আর $a_1=(1-K)/(K+1)$ — $K=1$-এ $b_0=b_1=0.5$ আর $a_1 = 0$। অর্থাৎ কম স্যাম্পল রেটে (বড় $T$) কোয়েফিশিয়েন্টের মানও পরিবর্তিত হয় — এটাই কেন $T$ সবসময় সুনির্দিষ্টভাবে বলে দিতে হয়, একই অ্যানালগ প্রোটোটাইপ থেকে ভিন্ন স্যাম্পল রেটের জন্য ভিন্ন ডিজিটাল কোয়েফিশিয়েন্ট আসে।

প্র ০২ উপরের তুলনা টেবিলে $\omega=0.01$-এ পার্থক্য প্রায় শূন্য কেন — এটা কি কাকতালীয়?

না, এটা প্রত্যাশিত। ফ্রিকোয়েন্সি-ওয়ার্পিং সম্পর্ক $\omega_{\text{analog}} = \frac{2}{T}\tan(\omega_{\text{digital}}T/2)$-এ, ছোট $\omega$-এর জন্য $\tan(x) \approx x$ (ছোট-কোণ অনুমান) — তাই $\omega_{\text{analog}} \approx \omega_{\text{digital}}$ প্রায় সমান থাকে যখন ফ্রিকোয়েন্সি ছোট। ফ্রিকোয়েন্সি বাড়ার সাথে সাথে $\tan(x)$ আর $x$-এর মধ্যে পার্থক্য বাড়তে থাকে, যা টেবিলে দেখা ক্রমবর্ধমান পার্থক্যের সাথে মিলে যায়।

প্র ০৩ বাইলিনিয়ার ট্রান্সফর্মের বদলে যদি আমরা সরাসরি $s$কে $(1-z^{-1})/T$ দিয়ে প্রতিস্থাপন করতাম (একটি সরল "ফরওয়ার্ড অয়লার" পদ্ধতি), তাহলে কী গ্যারান্টি হারাবো বলে আপনার ধারণা?

স্থিতিশীলতার গ্যারান্টি হারাবো। বাইলিনিয়ার ট্রান্সফর্মের বিশেষত্ব হলো এটি নিশ্চিতভাবে $s$-প্লেনের পুরো বাম অর্ধকে $z$-প্লেনের একক বৃত্তের ভেতরে ম্যাপ করে — কোনো ব্যতিক্রম ছাড়াই। সরল ফরওয়ার্ড-অয়লার সাবস্টিটিউশন এই গ্যারান্টি দেয় না — একটি স্থিতিশীল অ্যানালগ পোল সহজেই একক বৃত্তের বাইরে গিয়ে পড়তে পারে, ফলে ডিজিটাল ফিল্টারটি অস্থিতিশীল (BIBO unstable, L13) হয়ে যেতে পারে। এই কারণেই বাইলিনিয়ার ট্রান্সফর্ম IIR ফিল্টার ডিজাইনে সবচেয়ে বহুল ব্যবহৃত পদ্ধতি।

অনুশীলন

  1. চিন্তা করুন: $H(s) = 1/(s+1)$-এর বদলে $H(s) = 1/(s+2)$ (একটি দ্রুততর অ্যানালগ লো-পাস) নিয়ে বাইলিনিয়ার ট্রান্সফর্ম করলে $b_0, b_1, a_1$-এর সূত্র কীভাবে বদলাবে বলে আপনার ধারণা? (ইঙ্গিত: $H(s)=1/(s+2)$-এ $s$-এর বদলে $K(1-z^{-1})/(1+z^{-1})$ বসিয়ে $2$ যোগ করুন।)

    একই ধরনের বীজগণিত করলে ডিনোমিনেটর হয় $(K+2) + (2-K)z^{-1}$ আর নিউমারেটর $(1+z^{-1})$। তাই $b_0=b_1=1/(K+2)$ এবং $a_1=(2-K)/(K+2)$ (স্বাভাবিকীকরণের পর)। $K=2$ ($T=1$) বসালে $b_0=b_1=0.25$, $a_1=0$ পাওয়া যায় — মূল $1/(s+1)$-এর তুলনায় ভিন্ন কোয়েফিশিয়েন্ট, যা প্রত্যাশিত কারণ কাটঅফ ফ্রিকোয়েন্সি ভিন্ন।

  2. পরীক্ষা করুন: দ্বিতীয় কোড সেলে (তুলনা টেবিল) T = 1.0-কে T = 0.1 (অর্থাৎ ১০ গুণ বেশি স্যাম্পল রেট) করে Run চেপে দেখুন উচ্চ ফ্রিকোয়েন্সিতে পার্থক্য কমে কিনা।

    রান করলে দেখা যাবে (মনে রাখবেন b0,b1,a1 নতুন K=2/T=20 দিয়ে পুনরায় গণনা করতে হবে) — একই $\omega$ মানে এবার পার্থক্য অনেক কম, কারণ বেশি স্যাম্পল রেট মানে নাইকুইস্ট সীমা ($\pi/T$) অনেক দূরে সরে যায়, ফলে একই পরম ফ্রিকোয়েন্সিতে ওয়ার্পিং প্রভাব কম অনুভূত হয় — এটাই কেন উচ্চতর স্যাম্পল রেট ওয়ার্পিং-জনিত সমস্যা কমায়।

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

আগের পাঠ
অ্যানালগ প্রোটোটাইপ ফিল্টার — চেবিশেভ ও এলিপটিক