قراءة
وضع العرض التقديمي

طريقة الـ windowed-sinc

~14 دقيقة قراءة الدرس 2 من الوحدة 7

الـ 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:

الـ impulse response بتاع الـ ideal low-pass filter
h_{\text{ideal}}[n] = \frac{\omega_c}{\pi}\,\text{sinc}\!\left(\frac{\omega_c n}{\pi}\right) = \frac{\sin(\omega_c n)}{\pi n}
h_ideal[n] مش صفر لكل n من −∞ لـ +∞. متناظر حوالين n = 0، وقمّته ω_c/π عند n = 0، وبيتذبذب بـ amplitude بيصغر في الاتجاهين. مينفعش يتنفّذ على طول.

العيب القاتل باين على طول: 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 بيبقى:

معاملات الـ windowed-sinc
h[n] = h_{\text{ideal}}[n] \cdot w[n] = \frac{\sin(\omega_c n)}{\pi n} \cdot w[n]
h[n] هو الـ impulse response بعد الـ windowing. لـ filter طوله N (ويُفضّل N فردي عشان التناظر)، n بيمشي من −(N−1)/2 لـ +(N−1)/2، وبعدين بيتزحزح (N−1)/2 عشان الـ filter يبقى causal.

الـ window function w[n] بتنزّل قيمة الـ sinc بنعومة لصفر عند حوافها بدل ما تقطعها فجأة. والنزول ده ضروري: القطع المفاجئ بـ rectangular window بيعمل ripple شديد في الـ frequency response (ظاهرة Gibbs)، أما النزول الناعم فبيقايض شوية من الـ stopband attenuation قصاد إنه يتجنّب الـ ripple ده.

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

تصميم FIR filter بطريقة الـ windowed-sinc فيه أربع خطوات محددة:

الخطوة 1
حدّد الـ filter
اختار نوع الـ filter (low-pass، high-pass، ...)، والـ cutoff frequency ω_c، ودرجة الـ filter M (الطول N = M+1)، والـ stopband attenuation المقبول بالديسيبل.
الخطوة 2
اختار الـ window function
حسب الـ stopband attenuation المطلوب، اختار window function (rectangular، Hann، Hamming، Blackman، أو Kaiser). الـ attenuation الأعلى محتاج window أتقل وtransition band أعرض.
الخطوة 3
احسب قيم الـ sinc
احسب h_ideal[n] = sin(ω_c · n) / (π · n) لـ n = −M/2 لـ +M/2، مع h_ideal[0] = ω_c/π كنهاية. وده بيدّي M+1 قيمة متمركزة حوالين الصفر.
الخطوة 4
طبّق الـ window وزحزح
اضرب عنصر بعنصر في w[n]، وبعدين زحزح الـ indices عشان أول معامل يبدأ عند n = 0 (فالـ filter يبقى causal). والنتيجة FIR filter متناظر linear phase.

اختيار الـ 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
M \approx \frac{A \cdot 0.9}{\Delta f} \quad (\text{Hamming}), \qquad M \approx \frac{A - 8}{2.285\,\Delta\omega} \quad (\text{Kaiser})
A هو الـ stopband attenuation بالديسيبل، وΔf هو عرض الـ transition band كنسبة من الـ sampling rate (يعني Δω / (2π))، وM هو درجة الـ filter. قرّب لفوق لأقرب عدد صحيح فردي عشان تحافظ على التناظر.

مثلًا، 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.

المقايضة بين الـ attenuation والدرجة

متقدرش توصل لـ 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 تحليليًا:

صيغة β
parameter شكل الـ window
β = 0.1102 · (A − 8.7) لـ A > 50 ديسيبل؛ β = 0.5842 · (A−21)^0.4 + 0.07886 · (A−21) لـ 21 ≤ A ≤ 50؛ β = 0 لـ A < 21.
صيغة الدرجة
طول الـ filter
M = (A − 8) / (2.285 · Δω)، حيث Δω هو عرض الانتقال بالراديان. قرّب لفوق لأقرب عدد صحيح (فردي لو أمكن).

الـ 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. بتتستخدم لما:

الصوت
equalizer low-pass / band-pass
FIR filters linear phase (Hamming أو Kaiser) بتشكّل محتوى الـ frequencies في الصوت من غير ما تدخّل phase distortion بيتسمع — حاجة حرجة في الـ mastering والـ post-production.
الـ multirate
الـ anti-aliasing والـ interpolation
filters الـ decimation والـ interpolation في محوّلات الـ sample rate بتستخدم تصميمات windowed-sinc عشان attenuation منتظم ومضمون للـ spectral images والـ aliases.
الاتصالات
الـ baseband filters في الـ SDR
الـ baseband filters في أجهزة الـ software-defined radio وchips الـ 5G NR تصميمات windowed-sinc — والـ stopband attenuation بيمنع تداخل القنوات اللي جنب بعض.
الطب الحيوي
عزل نطاقات EEG / ECG
عزل نطاقات موجات المخ (دلتا، ثيتا، ألفا، بيتا) من الـ EEG بيستخدم band-pass filters windowed-sinc — والـ linear phase ضروري عشان توقيت الموجة يتحفظ.
أهم النقط
  • الـ 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 عشان يلاقي المعاملات.
اللي بعده أنواع الـ filters نظرة عامة على الموديول اللي فات يعني إيه FIR filter؟