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

الـ spectral analysis في الـ real time

~14 دقيقة قراءة الدرس 4 من الوحدة 6

لما الـ 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 على محور، والزمن على التاني.

تعريف الـ STFT
X[m,k] = \sum_{n=0}^{N-1} x[n + mR]\, w[n]\, e^{-j2\pi kn/N}
X[m, k] هو الـ DFT للـ frame رقم m بعد الـ windowing. w[n] هي الـ window function، وR هو الـ hop size (عدد الـ samples بين الـ frames)، وN هو حجم الـ FFT.

مربّع القيمة المطلقة |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) اللي بيضمن إعادة البناء بالظبط.

الـ Hann window
w[n] = 0.5\left(1 - \cos\!\left(\frac{2\pi n}{N-1}\right)\right), \quad 0 \le n \le N{-}1
الـ Hann window بتنزل للصفر عند الطرفين. الـ main lobe بتاعها عرضه ضعف الـ rectangular بس أعلى side lobe عند −31.5 ديسيبل — أوطى بحوالي 18 ديسيبل من الـ −13 ديسيبل بتوع الـ rectangular — وده بيقلّل الـ spectral leakage بشكل واضح.

بناء spectrum analyzer في الـ real time

الـ spectrum analyzer اللي شغّال real time بيعالج stream صوت أو RF مستمر وبيحدّث عرض الـ frequencies بسرعة كفاية إنه يبان live. والبنية المعيارية في الـ software هي:

الخطوة 1
الالتقاط
اقرا الـ samples من الـ audio interface أو الـ SDR في حتت صغيرة (مثلًا 256 sample كل مرة). وضيفها على ring buffer حجمه N.
الخطوة 2
الـ windowing
لما يتجمّع R sample جديدة في الـ ring buffer (الـ hop)، طلّع آخر N sample واضربهم عنصر بعنصر في الـ Hann window.
الخطوة 3
FFT
احسب real FFT حجمه N للـ frame بعد الـ windowing. بيطلّع N/2 + 1 frequency bin مركّب. وخد مربّع القيمة المطلقة عشان القدرة.
الخطوة 4
العرض
حوّل لديسيبل (10 log₁₀ |X[k]|²)، وطبّق peak hold أو smoothing، وارسم كـ bar graph أو spectrum خطي. وحدّث الـ waterfall بإنك تزحلقه صف واحد.

في الـ browser، الـ Web Audio API بتنفّذ الأربع خطوات دول جوّاها عن طريق AnalyserNode — بتحتفظ بـ ring buffer، وبتطبّق Blackman window، وبتحسب FFT، وبتدّي getByteFrequencyData() اللي بترجّع bins لوغاريتمية جاهزة ترسمها على canvas.

الـ averaging والـ peak hold

خرج الـ FFT الخام متلخبط — الـ frames لوحدها بتتهز حتى مع sinusoid ثابتة، بسبب الـ noise وطول الـ frame المحدود. فيه تقنيتين للعرض بيعالجوا ده:

التقنية أ
الـ exponential smoothing
S[k] = α·|X[k]|² + (1−α)·S_prev[k]. مع α ≈ 0.1–0.3، العرض بيوري moving average بيتابع التغيّرات البطيئة وبيكتم noise الـ frames. α أعلى = استجابة أسرع، noise أكتر.
التقنية ب
الـ peak hold
احتفظ بـ peak buffer منفصل P[k] = max(|X[k]|², P_prev[k]). ثبّت الـ peak لمدة N_hold frame، وبعدين خلّيه ينزل بالتدريج بمعدّل δ ديسيبل/frame. بيكشف القمم العابرة اللي الـ smoothing بيخبّيها.

عروض الـ waterfall

عرض الـ waterfall (شلال الماء) (أو الـ spectrogram) بيمشّي الزمن على محور والـ frequency على المحور التاني، والقدرة متشفّرة باللون أو الشدّة. وكل frame STFT جديد بيضيف صف (أو عمود) للعرض. والنتيجة "فيلم" ثنائي الأبعاد للـ spectrum بيكشف بنى مش باينة في عرض frame واحد: الـ chirps بتظهر كخطوط مايلة، والـ harmonics كشرايط أفقية متوازية، والتداخل كخطوط رأسية.

عروض الـ waterfall معيارية في:

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

الكلام: 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 العريضة اللي بتعالج مئات الميجاهرتز.
الوحدة التالية يعني إيه FIR filter؟ نظرة عامة على الموديول اللي فات الـ FFT عمليًا