لما الـ FFT يقابل الزمن
في الدروس اللي فاتت من الوحدة 6، اتعاملنا مع الـ FFT (تحويل فورييه السريع) كأداة بتحوّل block signal كامل للمحتوى الترددي بتاعه. وده بيشتغل كويس مع الـ signals الـ stationary — اللي محتواها الترددي مبيتغيّرش مع الزمن. بس أغلب الـ signals الحقيقية non-stationary: الكلام بيعلى وبيوطى في الطبقة، ونغمة الجيتار بتخفت، ورجوع الرادار بيعدّي على نطاقات frequency، واهتزاز الموتور بيتغيّر لما سرعة اللف تتغيّر.
عشان تتابع المحتوى الترددي بيتطوّر إزاي مع الزمن، محتاج تطبّق الـ FFT كذا مرة على حتت قصيرة ومتداخلة من الـ signal. التقنية دي اسمها الـ short-time Fourier transform (تحويل فورييه قصير المدى) أو STFT، وهي المحرك الأساسي لكل spectrum analyzer، وكل spectrogram، وكل شاشة صوت live قابلتها في حياتك.
الـ short-time Fourier transform
الفكرة ورا الـ STFT بسيطة: بنزحلق window طولها N على الـ signal، وبنضرب كل حتة متقطّعة في window function (عشان نقلّل الـ spectral leakage)، وبعدين نحسب FFT، ونخزّن النتيجة. ولما نرصّ الـ spectrums دي على الزمن بيطلع تمثيل ثنائي الأبعاد: الـ frequency على محور، والزمن على التاني.
مربّع القيمة المطلقة |X[m, k]|² هو الـ spectrogram (الطيف الزمني) — خريطة قدرة بتوري الـ frequencies الشغّالة في كل لحظة. والمقياس اللوغاريتمي (بالديسيبل) بيتستخدم تقريبًا دايمًا عشان يضغط الـ dynamic range الواسع للـ signals الحقيقية.
تلات parameters بيتحكّموا في كل حاجة
أي STFT ليه تلات اختيارات تصميم، وفهم المقايضات بينهم هو جوهر الـ spectral analysis في الـ real time:
| الـ parameter | الرمز | بيتحكّم في | المدى المعتاد |
|---|---|---|---|
| حجم الـ frame | N | الـ frequency resolution: Δf = f_s / N | 256 – 8192 |
| الـ hop size | R | الـ time resolution: Δt = R / f_s | N/4 – N/2 |
| الـ window function | w[n] | مقايضة الـ leakage قصاد الـ resolution | Hann، Hamming، Blackman |
متقدرش تاخد time resolution مثالية وfrequency resolution مثالية في نفس الوقت — ده مبدأ عدم اليقين بين الزمن والـ frequency. الـ frame القصير (N صغير) بيدّيك time resolution كويسة بس frequency bins خشنة. والـ frame الطويل (N كبير) بيدّي frequency resolution عالية بس time resolution ضعيفة. والـ hop size R بيتحكّم في معدّل تحديث العرض — ممكن يتظبط لوحده بعيد عن N، بس طول الـ frame هو اللي في الآخر بيحدّد محاور الـ resolution.
frame قصير ← time resolution كويسة، frequency resolution خشنة. frame طويل ← frequency resolution عالية، time resolution ضعيفة.الـ overlap والـ Hann window
عمليًا، الـ frames عادةً بتتداخل بنسبة 50–75%. ومع hop size R = N/2، الـ frames اللي ورا بعض بتشترك في نص الـ samples بتاعتها. والـ overlap بيخدم غرضين: بيزوّد الـ time resolution بتاعة الـ spectrogram، وبيسمح — مع windows معيّنة — بإعادة بناء الـ signal الأصلية بالظبط (مفيد لمعالجة الصوت مش للتحليل بس).
الـ Hann window (الـ raised cosine) هي أشهر اختيار للـ spectral analysis في الـ real time. بتنزل بنعومة للصفر عند الطرفين، فبتشيل الحافة المفاجئة اللي بتعمل leakage حاد مع الـ rectangular window. ومع overlap 50%، الـ frames المتعمل لها Hann ورا بعض بتتجمع لثابت — وده شرط الـ constant overlap-add (COLA) اللي بيضمن إعادة البناء بالظبط.
بناء spectrum analyzer في الـ real time
الـ spectrum analyzer اللي شغّال real time بيعالج stream صوت أو RF مستمر وبيحدّث عرض الـ frequencies بسرعة كفاية إنه يبان live. والبنية المعيارية في الـ software هي:
في الـ browser، الـ Web Audio API بتنفّذ الأربع خطوات دول جوّاها عن طريق AnalyserNode — بتحتفظ بـ ring buffer، وبتطبّق Blackman window، وبتحسب FFT، وبتدّي getByteFrequencyData() اللي بترجّع bins لوغاريتمية جاهزة ترسمها على canvas.
الـ averaging والـ peak hold
خرج الـ FFT الخام متلخبط — الـ frames لوحدها بتتهز حتى مع sinusoid ثابتة، بسبب الـ noise وطول الـ frame المحدود. فيه تقنيتين للعرض بيعالجوا ده:
عروض الـ waterfall
عرض الـ waterfall (شلال الماء) (أو الـ spectrogram) بيمشّي الزمن على محور والـ frequency على المحور التاني، والقدرة متشفّرة باللون أو الشدّة. وكل frame STFT جديد بيضيف صف (أو عمود) للعرض. والنتيجة "فيلم" ثنائي الأبعاد للـ spectrum بيكشف بنى مش باينة في عرض frame واحد: الـ chirps بتظهر كخطوط مايلة، والـ harmonics كشرايط أفقية متوازية، والتداخل كخطوط رأسية.
عروض الـ waterfall معيارية في:
- الـ software-defined radio (SDR) — مراقبة RF spectrum واسع للـ signals والتداخلات والإشغال
- هندسة الصوت — تحديد الـ room modes، وذيول الـ reverb، والمحتوى الـ harmonic في التسجيلات
- تحليل الاهتزاز — تتبّع الـ resonant frequencies في الماكينات اللي بتلف لما الحمل يتغيّر
- الصوتيات الطبية — تصوير أنماط الكلام، وأصوات التنفس، وبيانات Doppler بتاعة السونار
الكلام: N = 512–1024، hop = N/2، Hann window. الأصوات الكلامية بتطوّل ~50–100 ملّي ثانية فـ time resolution ~10 ملّي ثانية (N=512 عند 48 كيلوهرتز) بتلقط الانتقالات كويس.
المزيكا/التحليل النغمي: N = 2048–4096، hop = N/4. الـ frequency resolution العالية بتكشف الـ partials؛ والـ overlap 75% بيدّي حركة ناعمة في العرض.
مسح الـ SDR العريض: N = 1024–4096، hop = N (من غير overlap). الـ throughput أهم من إعادة البناء؛ ومعدّل التحديث = f_s / N.
مراقبة الاهتزاز: N = 4096–8192، hop = N/2. الـ frames الطويلة بتفرّق بين الـ harmonics الميكانيكية القريبة (اللي ساعات بينها كام هرتز بس).
الميزانية الحسابية
الـ analyzer الـ real time لازم يخلّص frame FFT واحد قبل ما الـ hop اللي بعده يوصل. والميزانية الحسابية لكل frame (بالثواني) هي ببساطة R / f_s. ولصوت عند 48 كيلوهرتز مع N = 1024 وR = 512، الميزانية 512 / 48000 ≈ 10.7 ملّي ثانية. والـ real FFT اللي فيه 1024 نقطة بياخد أقل من 0.1 ملّي ثانية على الـ processor الحديث — فيه هامش ضخم للـ averaging والعرض ومنطق الـ peak hold.
في تطبيقات الـ SDR العريضة اللي بتعالج عشرات أو مئات الميجاهرتز، الميزانية بتصغر جامد والـ FFT المتسرّع على الـ GPU (cuFFT) بيبقى ضروري. الـ GPU يقدر يشغّل آلاف الـ FFTs اللي فيها 1024 نقطة بالتوازي، وده بيخلّي spectrograms الـ real time ممكنة لـ signals كانت هتهدّ أي CPU.
- الـ short-time Fourier transform (STFT) بيطبّق الـ FFT على frames متداخلة بعد الـ windowing، وبيطلّع خريطة زمن-frequency لتطوّر المحتوى الطيفي.
- حجم الـ frame N بيتحكّم في الـ frequency resolution (Δf = f_s / N)؛ والـ hop size R بيتحكّم في الـ time resolution (Δt = R / f_s). وتحسين واحد فيهم بيضعّف التاني — مبدأ عدم اليقين بين الزمن والـ frequency.
- الـ Hann window هي الاختيار المعياري للتحليل الـ real time: side lobes واطية، ونزول ناعم، وبتحقق شرط COLA عند overlap 50% لإعادة البناء بالظبط.
- الـ spectrum analyzer الـ live بيلقط الـ samples في ring buffer، وبيطبّق الـ window كل R sample، وبيحسب FFT، وبيعرض الـ power spectrum بالديسيبل — وبيتكرّر بمعدّل الـ hop.
- الـ exponential smoothing بيقلّل noise العرض؛ والـ peak hold بيكشف القمم العابرة. والاتنين بيتطبّقوا بعد الـ FFT مش قبله.
- عروض الـ waterfall بتمشّي الزمن على محور والـ frequency على التاني، وبتكشف البنية اللي بتتغيّر مع الزمن (chirps، harmonics، تداخل) اللي الـ spectrum بتاع frame واحد ميقدرش يبيّنها.
- الـ processors الحديثة عندها هامش حسابي ضخم للـ STFT بمعدّلات الصوت؛ والـ FFT المتسرّع على الـ GPU (cuFFT) ضروري لتطبيقات الـ SDR العريضة اللي بتعالج مئات الميجاهرتز.