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

الـ periodogram وطريقة Welch

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

الـ periodogram (الدورية) — مراجعة

في الدرس اللي فات، اتعرّفنا على الـ periodogram على إنه أبسط estimator للـ power spectral density (كثافة الطيف الطاقي) أو PSD. بيحسب مربّع magnitude الـ DFT لـ N sample x[0], x[1], …, x[N−1]، مقسوم على N:

الـ periodogram
\hat{S}(\omega) = \frac{1}{N}\left|\sum_{n=0}^{N-1} x[n]\, e^{-j\omega n}\right|^2
X_N(ω) هو الـ DFT لسجل البيانات اللي فيه N sample. والقسمة على N بتخلّي الـ estimator asymptotically unbiased — قيمته المتوقعة بتقرّب من الـ PSD الحقيقية لما N → ∞.

الـ periodogram جذّاب في بساطته، بس عنده مشكلة إحصائية أساسية: الـ variance بتاعه مبيقلّش لما طول البيانات N يزيد. في الحقيقة، الـ variance لكل تقدير طيفي بيساوي تقريبًا مربّع قيمة الـ PSD الحقيقية — يعني غلطة نسبية حوالي ~100٪ عند كل frequency. ومهما جمعت بيانات، الـ periodogram بيفضل estimator متلخبط.

عشان تفهم السبب: إنك تجمع بيانات أكتر في DFT واحد بيدّيك frequency resolution أحسن (Δf = f_s/N أصغر)، بس كل frequency bin بيفضل متمثّل بـ sample مركّبة واحدة. "حجم العيّنة" لكل bin عمره ما بيزيد — دايمًا بتحسب قياس واحد متلخبط لكل frequency.

الـ bias والـ variance في الـ periodogram

أي estimator إحصائي بيتوصف بخاصيتين: الـ bias (التحيّز) (الغلط المنهجي) والـ variance (التباين) (التذبذب العشوائي). بالنسبة للـ periodogram:

الخاصية السلوك الأثر
الـ bias بيقل لما N → ∞ asymptotically unbiased — بيقرّب من الـ PSD الحقيقية
الـ variance ≈ [S(ω)]² — ثابت! مبيقلّش لما البيانات تزيد
الـ consistency inconsistent عمره ما بيتقارب للقيمة الحقيقية

فالـ periodogram estimator inconsistent (غير متسق) — يعني estimator مبيتقاربش للقيمة الحقيقية لما حجم العيّنة يزيد. ودي قيد أساسي. وعشان تاخد تقديرات PSD تعتمد عليها، محتاجين طرق بتقلّل الـ variance بإنها تاخد متوسط تقديرات طيفية مستقلة كتير.

ليه الـ variance بيفضل عالي؟

كل DFT bin هو X[k] محتاج مساهمات من كل الـ N sample — فهو مش "sample واحدة" بالمعنى البديهي. بس رياضيًا، كل |X[k]|² ماشي على توزيع chi-squared متكبّر بدرجتين حرية، بغض النظر عن N. وإنك تاخد متوسط متغيّرات chi-squared بيقلّل الـ variance — وده بالظبط اللي طريقتين Bartlett وWelch بيعملوه.

Var[الـ periodogram] ≈ S²(ω) — مستقل عن N

طريقة Bartlett — متوسط الـ segments المش متداخلة

مفتاح تقليل variance الـ periodogram هو الـ averaging (التوسيط). لو قدرت تحسب الـ periodogram بشكل مستقل على K سجل بيانات مختلفين وتاخد متوسط النتايج، الـ variance هيقل بمعامل K. وطريقة Bartlett (1948) بتحقق ده من سجل بيانات واحد طويل بإنها بتقسمه لـ segments مش متداخلة.

لو معاك N sample في الإجمالي وطول segment M، طريقة Bartlett بتعمل K = ⌊N/M⌋ segment مش متداخل. والـ periodogram بيتحسب لكل segment، وبعدين بناخد متوسط الـ K periodogram:

الـ Bartlett estimator
\hat{S}_B(\omega) = \frac{1}{K}\sum_{i=0}^{K-1} \frac{1}{M}\left|\sum_{n=0}^{M-1} x_i[n]\, e^{-j\omega n}\right|^2
x_i[n] هو الـ segment رقم i اللي طوله M. ومتوسط K periodogram بيقلّل الـ variance بمعامل K — بس الـ frequency resolution بتقل كمان (Δf = f_s/M مش f_s/N).

طريقة Bartlett بتكشف المقايضة الأساسية بين الـ variance والـ resolution في تقدير الـ PSD. segments أقصر ← segments أكتر ← variance أقل، بس frequency resolution أضعف. segments أطول ← segments أقل ← resolution أحسن، بس variance أعلى. ومتقدرش تاخد الاتنين مع بعض بكمية بيانات ثابتة.

طريقة Welch — segments متداخلة مع windows

بيتر Welch (1967) طوّر طريقة Bartlett بإضافتين أساسيتين: الـ segments المتداخلة والـ window functions. والـ overlap بيخلّيك تحسب periodograms أكتر من نفس البيانات، فبيزوّد K وبيقلّل الـ variance من غير ما تضيّع بيانات عند حواف الـ segments.

الـ Welch estimator
\hat{S}_W(\omega) = \frac{1}{KU}\sum_{i=0}^{K-1} \left|\sum_{n=0}^{M-1} x_i[n]\, w[n]\, e^{-j\omega n}\right|^2
w[n] هي الـ window function اللي بتتطبّق على كل segment. وU = (1/M)Σw²[n] معامل تطبيع لطاقة الـ window. والـ windowing بيقلّل الـ spectral leakage قصاد توسيع خفيف في القمم.

الـ window function اللي بتتطبّق على كل segment بتقلّل الـ spectral leakage — تسرّب الطاقة من مكوّن frequency قوي للـ bins اللي جنبه. من غير windowing (يعني rectangular window)، الحواف الحادة عند طرفين الـ segment بتطلّع side lobes ضخمة في الـ frequency domain. وإنك تطبّق window ناعمة (Hann، Hamming، Blackman) بينعّم الحواف وبيقلّص الـ leakage جامد.

Bartlett قصاد Welch — الفروق الأساسية

طريقة Bartlett
  • segments مش متداخلة بس
  • rectangular window (من غير windowing)
  • K = ⌊N/M⌋ segment
  • الـ variance بيقل بمعامل K
  • معرّضة للـ spectral leakage
  • أبسط في التنفيذ
طريقة Welch
  • segments متداخلة (عادةً 50٪)
  • تطبيق window function ناعمة
  • segments أكتر لنفس طول البيانات
  • تقليل أكبر للـ variance
  • تقليل الـ spectral leakage
  • المعيار في الصناعة (pwelch، scipy)

اختيار parameters الـ Welch عمليًا

تلات parameters بيتحكّموا في سلوك الـ Welch estimator. وإنك تختارهم صح حكم هندسي معتمد على التطبيق:

الـ parameter أثره على الـ resolution أثره على الـ variance القيمة المنتشرة
طول الـ segment M ↑M → Δf = f_s/M أدق ↑M → segments أقل → variance أعلى 256–2048 sample
نسبة الـ overlap مالوش أثر على الـ resolution ↑overlap → segments أكتر → variance أقل 50٪ (Hann) أو 75٪
نوع الـ window main lobe أعرض = resolution أضعف side lobes أوطى = leakage أقل Hann (للأغراض العامة)
قاعدة الـ overlap 50٪

مع Hann window وoverlap 50٪، الـ segments اللي ورا بعض بتشترك في نص بياناتها. والنسبة دي مثالية لأن الـ Hann window بتوصل لصفر عند الحواف — الـ samples اللي قريبة من طرفين الـ segment وزنها بيقل، والـ overlap بيخلّيها تساهم بالكامل في الـ segment اللي جنبها. وزيادة الـ overlap فوق 50–75٪ بتدّي مكاسب بتقل لأن الـ segments اللي ورا بعض بتبقى correlated جامد.

Hann window + overlap 50٪ = أشهر إعداد لطريقة Welch

التنفيذ — pwelch وscipy

طريقة Welch هي الأداة الافتراضية لتقدير الـ PSD في MATLAB (pwelch) وPython (scipy.signal.welch). والدالتين بينفّذوا نفس الخوارزمية بس شوية إعدادات افتراضية بتختلف:

الـ parameter MATLAB pwelch scipy.signal.welch
الـ window الافتراضية Hamming Hann
طول الـ segment الافتراضي ⌊N/8⌋ 256
الـ overlap الافتراضي 50% 50%
اصطلاح الخرج أحادي الجانب افتراضيًا أحادي الجانب افتراضيًا
التطبيع قدرة لكل هرتز (كثافة) قدرة لكل هرتز (كثافة)

تفصيلة مهمة: الدالتين بيطلّعوا PSD أحادية الجانب افتراضيًا بوحدات قدرة/هرتز (واسمها كمان spectral density). وعشان تحسب القدرة الكلية في نطاق frequency معيّن، كامل الـ PSD على النطاق ده: P_band = ∫ S(f) df ≈ Σ S[k] · Δf.

تفسير خرج الـ Welch

لما تقارن رسومات PSD من مصادر مختلفة، اتأكد دايمًا من: (1) أحادي ولا ثنائي الجانب، (2) مقياس خطي ولا ديسيبل، (3) قدرة/هرتز ولا قدرة/sample (متطبّعة). فرق الـ 3 dB غالبًا سببه الخلط بين الاصطلاحين؛ واختلاف محور الـ frequency بيشاور على خلط بين الـ frequency المتطبّعة والفيزيائية.

اتأكد دايمًا: أحادي ولا ثنائي الجانب؟ قدرة/هرتز ولا قدرة/sample؟
أهم النقط
  • الـ periodogram (|DFT|²/N) asymptotically unbiased بس الـ variance بتاعه ثابت ≈ S²(ω) — وهو estimator inconsistent.
  • طريقة Bartlett بتقسم البيانات لـ K segment مش متداخلين وبتاخد متوسط الـ periodograms بتاعتهم، فبتقلّل الـ variance بمعامل K قصاد إن الـ frequency resolution بتقل.
  • طريقة Welch بتضيف تحسينين: segments متداخلة (segments أكتر ← variance أقل) وwindow functions (بتقلّل الـ spectral leakage).
  • التلات parameters بتوع Welch — طول الـ segment M، ونسبة الـ overlap، ونوع الـ window — بيوازنوا بين الـ frequency resolution وتقليل الـ variance.
  • الـ Hann window مع overlap 50٪ هي أشهر إعداد؛ وهي الافتراضية في pwelch وscipy.signal.welch.
  • خرج الـ Welch أحادي الجانب افتراضيًا؛ كامل على نطاق عشان تحسب قدرة النطاق.
  • مفيش حاجة ببلاش: البيانات الثابتة بتحدّد حاصل ضرب الـ resolution × الـ variance.
اللي بعده الـ spectrogram (الطيف الزمني-الترددي) نظرة عامة على الموديول اللي فات الـ power spectral density (كثافة الطيف الطاقي)