قراءة
وضع القصص

الـ bilinear transform (التحويل الثنائي الخطي)

~13 دقيقة قراءة الدرس 3 من الوحدة 8

كوبري بين التناظري والرقمي

الدرس اللي فات قدّم تلات عائلات كلاسيكية من الـ filters التناظرية — Butterworth، وChebyshev، والـ elliptic — كل واحدة متميّزة بتوزيع poles وzeros معيّن في مستوى s. والسؤال دلوقتي: إزاي نحوّل الـ filter التناظري H_a(s) لـ filter رقمي H(z)؟ والإجابة اللي بتتستخدم في تقريبًا كل تصميم عملي هي الـ bilinear transform (التحويل الثنائي الخطي).

الـ bilinear transform هو تعويض بيربط كل نقطة في مستوى s بنقطة واحدة بس في مستوى z ومحور الـ jΩ على دايرة الوحدة — والعكس صحيح. والتحويل ده بيضمن إن الـ filter التناظري المستقر (poles في النص الشمال من مستوى s) دايمًا بيتحوّل لـ filter رقمي مستقر (poles جوه دايرة الوحدة). مفيش aliasing — ودي ميزة حاسمة على طريقة الـ impulse invariance الأقدم منه.

صيغة التعويض

الـ bilinear transform بيعوّض المتغيّر الترددي المركّب s بدالة في z:

تعويض الـ bilinear transform
s = \frac{2}{T}\cdot\frac{z - 1}{z + 1}
T هي فترة الـ sampling (T = 1/f_s). ولما تعوّض الصيغة دي في H_a(s) بيطلعلك H(z) = H_a(s)|_{s=(2/T)(z-1)/(z+1)}. والمعامل 2/T ساعات بيتكتب كثابت k لما إعادة scale الـ frequency بتتعالج بالـ prewarping.

التعويض ده جبري ومظبوط — مفيش تقريب في التحويل نفسه. والعيب الوحيد اللي بيدخّله هو تشويه مش خطي لمحور الـ frequency، ولازم يتعوّض.

الـ frequency warping

لما تحسب التعويض الـ bilinear على دايرة الوحدة (z = e^{jω}) بيبان إزاي الـ frequencies التناظرية Ω بتتحوّل لـ frequencies رقمية ω:

علاقة الـ frequency warping
\Omega = \frac{2}{T}\tan\!\left(\frac{\omega T}{2}\right)
Ω هي الـ frequency التناظرية (rad/s) وω هي الـ frequency الرقمية (rad/sample، من −π لـ π). ولما ω تقرّب من ±π (الـ Nyquist frequency)، Ω بتقرّب من ±∞. فمحور الـ frequency التناظري اللانهائي كله بيتضغط في النطاق الرقمي المحدود [−π, π].

والضغط ده هو مصدر الـ frequency warping (تشويه التردد). قريب من الـ DC (ω ≈ 0) التحويل تقريبًا خطي: Ω ≈ ω/T. بس كل ما ω تقرّب من π، الـ frequencies التناظرية بتتضغط جامد. والـ cutoff الحادة عند Ω_c في التناظري بتقابل frequency رقمية مختلفة ω_c — ومش متساويين.

ليه الـ warping مبيبوّظش الـ filter؟

الـ frequency warping بيشوّه محور الـ frequency — بس للـ filters اللي متطلباتها بتتحدّد بحواف الـ passband والـ stopband مش بالشكل الدقيق، ده مقبول. طابع الـ response الـ equiripple أو الـ monotonic جوه كل نطاق بيتحفظ. أماكن حواف الانتقال بس هي اللي بتتزحزح. والـ prewarping بيصلّح الأماكن دي بالظبط.

طابع النطاق محفوظ — frequencies الحواف بس هي اللي بتتغيّر

الـ prewarping للـ frequencies الحرجة

حل الـ frequency warping هو الـ prewarping (التحويل المسبق) للـ analog prototype قبل ما تطبّق الـ bilinear transform. لو عايز نقطة الـ −3 ديسيبل في الـ filter الرقمي (أو حافة النطاق الـ equiripple) تبقى عند الـ frequency الرقمية ω_c، صمّم الـ analog prototype بـ cutoff عند الـ frequency بعد الـ prewarping:

صيغة الـ prewarping
\Omega_c = \frac{2}{T}\tan\!\left(\frac{\omega_c T}{2}\right)
صمّم الـ analog prototype بالـ cutoff Ω_c (بعد الـ prewarping). وبعد ما تطبّق الـ bilinear transform، الـ cutoff بتاعة الـ filter الرقمي هتقع بالظبط عند ω_c. وT هي فترة الـ sampling؛ ولو حطّيت T = 2 الصيغة بتبقى Ω_c = tan(ω_c / 2).

الـ prewarping بيضمن إن frequency حرجة أو اتنين — حافة الـ passband، أو حافة الـ stopband، أو نقطة الـ −3 ديسيبل — يقعوا في المكان الصح بعد ما الـ bilinear transform يضغط محور الـ frequency. باقي الـ frequencies هتفضل متشوّهة، بس المتطلبات هتتحقق في الأماكن اللي بتفرق.

خطوات التصميم الكاملة

تصميم الـ analog prototype مع الـ bilinear transform بيعملوا مع بعض إجراء عملي كامل لتصميم الـ IIR filter:

الخطوة 1
حدّد الـ filter الرقمي
حدّد حافة الـ passband ω_p، وحافة الـ stopband ω_s، وأقصى passband ripple δ_p، وأقل stopband attenuation δ_s — كلهم بالـ frequency الرقمية (rad/sample).
الخطوة 2
اعمل prewarping للحواف
حوّل ω_p وω_s لـ frequencies تناظرية Ω_p = (2/T)·tan(ω_p·T/2) وΩ_s = (2/T)·tan(ω_s·T/2).
الخطوة 3
صمّم الـ analog prototype
استخدم صيغ Butterworth أو Chebyshev أو الـ elliptic مع Ω_p وΩ_s بعد الـ prewarping عشان تلاقي أقل درجة N وتحسب H_a(s).
الخطوة 4
طبّق الـ bilinear transform
عوّض s = (2/T)(z−1)/(z+1) في H_a(s). فكّ وبسّط عشان تاخد H(z) كنسبة بين polynomials في z^{−1}.

والنتيجة IIR filter رقمي الـ magnitude response بتاعه بيحقق المتطلبات الأصلية بالظبط عند الـ frequencies الحرجة اللي اتعملها prewarping. وعمليًا، أدوات التصميم زي bilinear() في MATLAB وscipy.signal.bilinear() في Python بتعمل الجبر ده لوحدها.

الـ bilinear transform قصاد الـ impulse invariance

قبل ما الـ bilinear transform يبقى المعيار، المهندسين كانوا بيستخدموا طريقة الـ impulse invariance (الاستجابة النبضية الثابتة) — بياخدوا samples من الـ impulse response التناظري عشان يعملوا الـ filter الرقمي. والـ bilinear transform مفضّل في أغلب التطبيقات لأن:

الخاصية الـ impulse invariance الـ bilinear transform
الـ aliasing آه — الـ stopband بيتطوي على نفسه لأ — تحويل كامل من s لـ z
محور الـ frequency خطي (بس فيه aliasing) متشوّه (بس من غير aliasing)
أنواع الـ filters المناسبة low-pass بس (الـ stopband لازم يبقى مهمل قريب من نايكويست) أي نوع — LP, HP, BP, BS
الـ impulse response محفوظ (sampling) بيتغيّر بسبب الـ warping
الاستخدام في الصناعة نادر (تاريخي) معياري

تصميم الـ high-pass والـ band-pass والـ band-stop

خطوات الـ bilinear transform مش مقصورة على الـ low-pass filters. عشان تصمّم high-pass وband-pass وband-stop، بتتضاف خطوة frequency transformation زيادة بين الـ low-pass analog prototype والتعويض الـ bilinear:

LP → HP
low-pass لـ high-pass
عوّض s بـ Ω_c/s في الـ prototype. وده بيحوّل الـ low-pass response لـ high-pass response بنفس frequencies الحواف (بعد الـ prewarping).
LP → BP
low-pass لـ band-pass
عوّض s بـ (s² + Ω_0²)/(B·s). بيضاعف درجة الـ filter لأن كل pole بيطلّع poleين band-pass. ومحتاج prewarping لحافتين النطاق.
LP → BS
low-pass لـ band-stop
عوّض s بـ B·s/(s² + Ω_0²). بيعمل بنية notch filter. وبيضاعف الدرجة برضه. مفيد لشيل الـ hum ورفض التداخل.
الأدوات
MATLAB / Python
دوال زي butter(N,'high')، وcheby1(N,Rp,'bandpass')، وscipy.signal.iirdesign() بتعمل كل التحويلات والـ bilinear transform لوحدها.

الاستقرار ودايرة الوحدة

من أحلى خصائص الـ bilinear transform إنه بيضمن الاستقرار. النص الشمال من مستوى s (Re{s} < 0) بيتحوّل بالظبط لجوه دايرة الوحدة في مستوى z (|z| < 1). والمحور التخيلي (jΩ) بيتحوّل لدايرة الوحدة نفسها (|z| = 1). والنص اليمين بيتحوّل لبرا دايرة الوحدة.

الاستقرار مضمون

لأن الـ bilinear transform تحويل one-to-one بين مستوى s ومستوى z (ما عدا z = −1 ↔ s = ∞)، الـ analog prototype الـ causal المستقر — اللي كل الـ poles بتاعته في النص الشمال — دايمًا بيطلّع filter رقمي causal مستقر كل الـ poles بتاعته جوه دايرة الوحدة. مش محتاج تفحص الاستقرار بعد التحويل.

النص الشمال ← جوه دايرة الوحدة: الاستقرار محفوظ بالبنية
أهم اللي اتعلّمته
  • الـ bilinear transform بيعوّض s = (2/T)(z−1)/(z+1) عشان يحوّل الـ analog prototype H_a(s) لـ IIR filter رقمي H(z) من غير aliasing.
  • التحويل بيضغط محور الـ frequency التناظري كله (من −∞ لـ +∞) في النطاق الرقمي (−π لـ π) — وده بيعمل الـ frequency warping.
  • الـ prewarping بيصلّح الـ warping ده: صمّم الـ analog prototype عند Ω_c = (2/T)·tan(ω_c·T/2) عشان الـ cutoff الرقمية تقع بالظبط في المكان اللي عايزه.
  • الاستقرار مضمون: poles التناظري في النص الشمال دايمًا بتتحوّل لـ poles رقمية جوه دايرة الوحدة.
  • الـ bilinear transform اتفوّق على طريقة الـ impulse invariance لأنه بيشيل الـ aliasing وبيشتغل مع كل أنواع الـ filters.
  • الـ frequency transformations الزيادة (LP→HP, LP→BP, LP→BS) بتتركّب مع الـ bilinear transform عشان تصمّم أي نوع filter من low-pass prototype.
  • عمليًا، الخطوات كلها متأتمتة بدوال butter()، cheby1()، ellip() في MATLAB وSciPy.
اللي بعده FIR قصاد IIR — المقايضات نظرة عامة على الموديول اللي فات Butterworth وChebyshev والـ elliptic filters