معادلة الـ DFT
الـ Discrete Fourier Transform (تحويل فورييه المتقطع) أو DFT هو الأداة الحسابية الأساسية في تحليل الـ spectrum. لو معاك sequence من N sample x[n]، الـ DFT بيطلّع N قيمة مركّبة X[k]، كل واحدة شايلة الـ amplitude والـ phase بتوع مكوّن frequency معيّن. وتعريف الـ DFT هو:
الـ inverse DFT (IDFT) بيرجّع x[n] بالظبط من X[k]:
X[k] رقم مركّب. مقداره |X[k]| بيدّي الـ amplitude بتاع المكوّن الـ sinusoidal عند الـ frequency k·f_s/N، وزاويته ∠X[k] بتدّي الـ phase بتاعه. وللـ x[n] اللي قيمها حقيقية، الـ DFT عنده conjugate symmetry: X[N−k] = X*[k]، فالـ bins من 0 لـ N/2 بس هي اللي شايلة معلومات مستقلة.
|X[k]| = الـ amplitude عند f = k·f_s/N — ∠X[k] = الـ phase عند الـ frequency ديتفسير الـ frequency bins
كل bin k في الـ DFT بيقابل frequency فيزيائية معيّنة. لو الـ signal اتاخد منها samples بمعدّل fs وحجم الـ DFT هو N، يبقى الـ bin k بيقابل الـ frequency fk = k·fs/N. والمسافة في الـ frequency بين binين جنب بعض اسمها الـ bin spacing (تباعد الخانات) — وناس كتير بيسمّوه بالتجاوز frequency resolution — وقيمته:
الـ DFT كعملية matrix
الـ DFT linear transformation. وممكن يتكتب باختصار كضرب matrix في vector: X = WN x، حيث WN هي الـ DFT matrix اللي مقاسها N×N. والعنصر (k, n) في WN هو الـ twiddle factor (عامل التدوير) WNkn:
الـ DFT matrix symmetric وunitary (لحد معامل التطبيع 1/√N). ومعنى كده إن معكوسها هو ببساطة الـ conjugate transpose بتاعها: WN−1 = (1/N)WN*. والمنظور الـ matrix ده بيوضّح إن الـ DFT مجرد تغيير basis — من basis الـ samples الزمنية لـ basis الـ complex exponentials (الـ frequencies).
إنك تحسب X = WN x على طول محتاج N عملية ضرب لكل bin خرج وفيه N bin — يعني N² عملية ضرب مركّبة. ولـ N = 1024 ده بيعدّي مليون عملية. والـ FFT بينزّل ده لـ O(N log N) بإنه يستغل التماثلات في الـ twiddle factors.
الطبيعة الدورية للـ DFT
خاصية دقيقة بس مهمة جدًا: الـ DFT بيعامل x[n] من غير ما يقول كأنها signal دورية لانهائية بفترة N. ومن وجهة نظر الـ DFT، الـ sample اللي بعد x[N−1] بتلف وترجع لـ x[0]. والحسابات على indices الـ DFT دايمًا بتتعمل modulo N.
والـ periodicity دي ليها انعكاسات مباشرة على الـ convolution. لو ضربت spectrumين الـ DFT X[k] وH[k] وبعدين عملت IDFT مش هياخدك للـ linear convolution x[n] ∗ h[n] — هياخدك للـ circular convolution (الالتواء الدائري) x[n] ⊛ h[n]، محسوب modulo N. وعشان تستخدم الـ DFT في الـ linear convolution زي الـ filtering، لازم تطوّل الـ sequence بأصفار عشان تتجنّب الـ time aliasing.
لو x[n] طولها Lx وh[n] طولها Lh، اختار حجم DFT بحيث N ≥ Lx + Lh − 1. ضيف أصفار للاتنين لحد الطول N، احسب الـ DFT لكل واحد، اضربهم نقطة بنقطة، وبعدين اعمل IDFT. والنتيجة هي الـ linear convolution بالظبط.
الـ frequency resolution والـ zero-padding
الـ bin spacing في الـ DFT هو Δf = fs/N، وفيه طريقتين تصغّره بيهم — بس واحدة بس فيهم بتحسّن الـ frequency resolution الحقيقية. إنك تجمع samples أكتر بيحسّنها: الـ window الزمنية الأطول بتزوّد فعلًا الـ time-bandwidth product. أما إنك تلزق أصفار في آخر الـ sequence اللي معاك فمبيحسّنهاش. الـ zero-padding (إضافة الأصفار) بيعمل interpolation للـ spectrum — يعني بيحسب الـ DTFT عند نقط أكتر فبيطلّع منحنى أنعم — بس مبيضيفش أي معلومات طيفية جديدة. وsinusoidين قريبين من بعض ميتفرّقوش بـ L sample ميتفصلوش بالـ zero-padding؛ عشان تفصلهم لازم تسجّل بيانات أكتر.
قاعدة عملية: عشان تفرّق بين sinusoidين بينهم Δf هرتز، محتاج على الأقل T = 1/Δf ثانية من البيانات (L ≥ fs/Δf sample). والـ zero-padding بعد كده بيخلّي الـ spectrum أنعم بس مبيكشفش قمم جديدة.
- الـ DFT بيحوّل sequence x[n] فيها N نقطة لـ N قيمة طيفية مركّبة X[k] = Σ x[n] e−j2πkn/N؛ والـ IDFT بيعكسه بمعامل 1/N.
- الـ bin k بيقابل الـ frequency f_k = k·f_s/N هرتز؛ والـ bin spacing Δf = f_s/N.
- |X[k]| amplitude و∠X[k]| phase عند الـ frequency k·f_s/N؛ وفي الـ signals الحقيقية النص اللي فوق بيعكس اللي تحت بالـ conjugate symmetry.
- الـ DFT ضرب matrix X = W_N x، حيث W_N عناصرها W_N^{kn} = e^{−j2πkn/N}؛ والحساب المباشر O(N²).
- الـ DFT بيفترض من غير ما يقول إن x[n] دورية بفترة N — الحسابات على الـ indices كلها modulo N.
- ضرب spectrumين الـ DFT وبعدين العكس بيدّي circular convolution؛ ضيف أصفار لحد N ≥ L_x + L_h − 1 عشان تاخد linear convolution.
- الـ zero-padding بينعّم الـ spectrum بس مبيحسّنش الـ resolution الفعلية — ده محتاج samples زيادة.