كوبري بين التناظري والرقمي
الدرس اللي فات قدّم تلات عائلات كلاسيكية من الـ 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:
التعويض ده جبري ومظبوط — مفيش تقريب في التحويل نفسه. والعيب الوحيد اللي بيدخّله هو تشويه مش خطي لمحور الـ frequency، ولازم يتعوّض.
الـ frequency warping
لما تحسب التعويض الـ bilinear على دايرة الوحدة (z = e^{jω}) بيبان إزاي الـ frequencies التناظرية Ω بتتحوّل لـ frequencies رقمية ω:
والضغط ده هو مصدر الـ frequency warping (تشويه التردد). قريب من الـ DC (ω ≈ 0) التحويل تقريبًا خطي: Ω ≈ ω/T. بس كل ما ω تقرّب من π، الـ frequencies التناظرية بتتضغط جامد. والـ cutoff الحادة عند Ω_c في التناظري بتقابل frequency رقمية مختلفة ω_c — ومش متساويين.
الـ 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 بيضمن إن frequency حرجة أو اتنين — حافة الـ passband، أو حافة الـ stopband، أو نقطة الـ −3 ديسيبل — يقعوا في المكان الصح بعد ما الـ bilinear transform يضغط محور الـ frequency. باقي الـ frequencies هتفضل متشوّهة، بس المتطلبات هتتحقق في الأماكن اللي بتفرق.
خطوات التصميم الكاملة
تصميم الـ analog prototype مع الـ bilinear transform بيعملوا مع بعض إجراء عملي كامل لتصميم الـ IIR filter:
والنتيجة 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:
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.