الـ filter المثالي وعيبه القاتل
كل كتب الـ signal processing بتبدأ تصميم الـ FIR filters بنفس التجربة الفكرية: الـ low-pass filter المثالي هيبقى شكله إيه؟ الإجابة نضيفة رياضيًا — frequency response مستطيل بيعدّي كل الـ frequencies تحت ω_c بـ gain 1 وبيمنع كل اللي فوقها بـ gain 0. مفيش ripple، مفيش transition band، نزول فوري.
لما ناخد الـ inverse DTFT للـ response المثالي ده، بنلاقي الـ impulse response (الاستجابة النبضية) المقابل ليه. وهو دالة sinc:
العيب القاتل باين على طول: h_ideal[n] طوله لانهائي وnon-causal (ممتد لحد n = −∞). ومفيش نظام حقيقي يقدر يخزّن أو يعالج معاملات ملهاش عدد. محتاجين استراتيجية تحوّل الـ impulse response المثالي اللانهائي ده لواحد محدود وcausal — من غير ما نبوّظ الـ frequency response بتاع الـ filter بشكل مدمّر. والاستراتيجية دي هي الـ windowing (التبويب) (Windowing).
القطع والـ window function
أبسط طريقة تخلّي h_ideal[n] محدود إنك تضربه في window function (دالة تبويب) w[n] بتساوي 1 لمدى محدود من n وصفر في أي حتة تانية. والـ impulse response بعد الـ windowing بيبقى:
الـ window function w[n] بتنزّل قيمة الـ sinc بنعومة لصفر عند حوافها بدل ما تقطعها فجأة. والنزول ده ضروري: القطع المفاجئ بـ rectangular window بيعمل ripple شديد في الـ frequency response (ظاهرة Gibbs)، أما النزول الناعم فبيقايض شوية من الـ stopband attenuation قصاد إنه يتجنّب الـ ripple ده.
خطوات التصميم
تصميم FIR filter بطريقة الـ windowed-sinc فيه أربع خطوات محددة:
اختيار الـ window function المناسبة
الـ window function هي زرار التصميم الأساسي. والـ windows المختلفة بتدّي مقايضات مختلفة بين عرض الـ main lobe (اللي بيتحكّم في عرض الـ transition band) وأعلى مستوى side lobe (اللي بيتحكّم في الـ stopband attenuation). وأرقام أعلى side lobe اللي تحت ماشية على Harris (1978)، نفس المصدر اللي اتستخدم في الوحدة 5 — جداول الـ windows في المراجع بتختلف بديسيبل أو اتنين حسب المصدر.
| الـ window function | أعلى side lobe (dB) | أقل stopband attenuation (dB) | عرض الانتقال |
|---|---|---|---|
| rectangular | −13 | 21 | 0.9/N |
| Hann | −31 | 44 | 3.1/N |
| Hamming | −43 | 53 | 3.3/N |
| Blackman | −58 | 74 | 5.5/N |
| Kaiser (β = 8.6) | −63 | 80+ | بيتظبط |
عمود أعلى side lobe بيخص الـ window function w[n] لوحدها: هو أعلى ripple في |W(ejω)| بالنسبة للـ main lobe. أما عمود أقل stopband attenuation فبيخص الـ filter الكامل بعد ما تضرب الـ window في الـ sinc المثالي، وده العمود اللي قواعد الدرجة اللي تحت بتستخدمه. ومش هما نفس الرقم ولا قريبين منه.
وأوضح مثال هو Kaiser عند β = 8.6. الـ side lobe الأعلى بتاعه متقاس عند −63 dB، أما قاعدة تصميم Kaiser اللي هي β = 0.1102(A − 8.7) فبالعكس بتدّي A ≈ 87 dB من الـ stopband attenuation — يعني فرق حوالي 24 dB. فلو قابلت رقم side lobe لـ Kaiser قريب من −70 dB، يبقى عمود الـ attenuation اتسرّب لعمود الـ side lobe.
الـ side lobe صفة في w[n]. والـ stopband attenuation صفة في الـ filter اللي بنيته بيها.الـ Hamming window هي أشهر اختيار للأغراض العامة: بتوصل لـ 53 ديسيبل stopband attenuation — كفاية لأغلب تطبيقات الصوت والقياسات — مع transition band معتدل. ولو محتاج attenuation أكبر، روح لـ Blackman أو Kaiser. ولما الـ transition band لازم يبقى أضيق ما يمكن والـ ripple مقبول، استخدم الـ rectangular window.
اختيار درجة الـ filter
لـ window function معيّنة، درجة الـ filter M (عدد المعاملات = M+1) بتتحكّم على طول في عرض الـ transition band Δω (بالراديان لكل sample). كل ما الـ transition band يضيق، الدرجة المطلوبة بتعلى والحسابات لكل sample بتزيد. قاعدة تقريبية للـ windows المنتشرة:
مثلًا، filter بـ Hamming window (A ≈ 53 ديسيبل) وtransition band عرضه Δf = 0.05 (يعني 2.4 كيلوهرتز عند sampling rate 48 كيلوهرتز) محتاج M ≈ 53 × 0.9 / 0.05 = 954، يعني 955 معامل. ده ممكن يتدار في المعالجة الـ offline أو بتطبيق الـ overlap-add بالـ FFT، بس ممكن يبقى مكلّف في loop مدمجة ضيقة شغّالة real time.
متقدرش توصل لـ transition band ضيق وstopband attenuation عالي مع بعض بـ filter قصير. عشان تاخد الاتنين، لازم تزوّد M. ودي مقايضة التصميم الأساسية: كل ديسيبل زيادة من الـ stopband attenuation أو تقسيم عرض الانتقال على اتنين بيضاعف طول الـ filter تقريبًا.
مواصفات أحسن ← filter أطول ← حسابات أكتر. مفيش حاجة ببلاش.الـ Kaiser window — تحكّم متغيّر
كل الـ windows اللي اتكلّمنا عنها لحد دلوقتي شكلها ثابت. الـ Kaiser window مميزة لأن ليها parameter واحد β بيغيّر باستمرار المقايضة بين عرض الـ main lobe ومستوى الـ side lobe. زيادة β بتزوّد الـ attenuation وبتوسّع الـ transition band؛ وتقليله بيعمل العكس. وعند β = 0، الـ Kaiser window بتبقى rectangular window.
لو معاك هدف stopband attenuation A (بالديسيبل)، تقدر تحسب parameter الـ Kaiser window ودرجة الـ filter تحليليًا:
الـ Kaiser window بتتنفّذ باستخدام الـ modified Bessel function من الدرجة صفر I₀(·)، الموجودة في كل مكتبة حسابات علمية. وهي الـ window المفضّلة لما متطلبات الـ stopband attenuation تبقى صارمة أو لازم تتحقق بدقة.
طريقة الـ frequency sampling — طريق تصميم بديل
طريقة الـ windowed-sinc بتبدأ من الـ impulse response المثالي في الـ time domain وبتطبّق عليه window. طريقة الـ frequency sampling بتمشي في الطريق العكسي: بتحدّد الـ frequency response المطلوب على طول عند N frequency على مسافات متساوية، وبعدين تاخد IDFT عشان تطلّع الـ impulse response.
والنتيجة FIR filter طوله N والـ frequency response بتاعه بيطابق بالظبط القيم المحددة عند frequencies التصميم — خاصية حلوة لما تحتاج تحكّم دقيق عند frequencies معيّنة (زي منحنيات الـ equalizer). والعيب إن الـ frequency response بيتذبذب بشكل مش منتظم بين نقط التصميم إلا لو samples الانتقال اتظبطت بحرص، وغالبًا بيتم ده بإنك تضيف عدد صغير من "transition samples" متظبطة بين frequencies النطاقين.
الـ windowed-sinc عمليًا
طريقة الـ windowed-sinc هي الأداة الأساسية لتصميم الـ FIR filters. بتتستخدم لما:
- الـ ideal low-pass filter ليه impulse response sinc طوله لانهائي وnon-causal — مينفعش يتنفّذ على طول.
- الـ windowing بيضرب الـ sinc المثالي في تدرّج طوله محدود عشان يطلّع FIR filter عملي: h[n] = h_ideal[n] · w[n].
- خطوات التصميم الأربعة: حدّد المتطلبات ← اختار الـ window ← احسب الـ sinc ← طبّق الـ window وزحزح عشان الـ filter يبقى causal.
- اختيار الـ window بيحدد المقايضة: الـ rectangular بتدّي أضيق transition band بس 21 ديسيبل attenuation بس؛ والـ Kaiser بيتظبط ويقدر يوصل لـ 80+ ديسيبل.
- الـ Hamming هي الاختيار المعياري للأغراض العامة: 53 ديسيبل stopband attenuation مع transition band متحكّم فيه.
- درجة الـ filter M بتتناسب عكسيًا مع عرض الـ transition band — تقسيم Δf على اتنين بيضاعف عدد المعاملات تقريبًا.
- الـ Kaiser window ليها parameter β وبتسمح إنك تحسب M وβ تحليليًا من مواصفة الـ stopband.
- الـ frequency sampling طريق بديل بيحدّد الـ frequency response على طول عند N نقطة وبيستخدم IDFT عشان يلاقي المعاملات.