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

الـ sample rate conversion

~13 دقيقة قراءة الدرس 3 من الوحدة 11

التحويل بين أي sample rateين

الدرسين اللي فاتوا اتكلّموا عن الـ upsampling والـ decimation كعمليتين منفصلتين بمعاملات صحيحة. بس الأنظمة الحقيقية كتير محتاجة تحوّل بين sample rateين مش مضاعفات صحيحة لبعض. فمحطة شغل الصوت الاحترافية بتسجّل بـ 48 كيلوهرتز ومحتاجة تسلّم ملفات بـ 44.1 كيلوهرتز للـ CD mastering. والـ software-defined radio اللي شغّال بـ 30.72 ميجاهرتز لازم يتعامل مع baseband processor شغّال بـ 1.92 ميجاهرتز. وفي الحالتين، نسبة التحويل عدد كسري L/M مش عدد صحيح.

الـ sample rate conversion (SRC) بنسبة L/M بيتحقق بإنك تحط interpolator (upsampling بـ L) ورا decimator (downsampling بـ M)، مع filter واحد مشترك بينهم. والهيكل الأنيق ده بيتجنّب الشغل بالمعدل الوسيط العالي وبيطلّع sampling rate خرج بيساوي بالظبط (L/M) × fs من دخل عند fs.

الفكرة الأساسية

اعمل upsampling بـ L، وبعدين رشّح بـ low-pass filter واحد بـ cutoff min(π/L, π/M)، وبعدين decimation بـ M. والـ filter بيعمل دورين في نفس الوقت: anti-aliasing (لخطوة الـ decimation) وanti-imaging (من الـ upsampling).

fخرج = (L / M) × fدخل

هيكل الـ cascade

من حيث المبدأ، نظام الـ SRC ممكن يستخدم filterين منفصلين: واحد anti-imaging بعد الـ upsampler، والتاني anti-aliasing قبل الـ decimator. بس بما إن الاتنين low-pass filters، ممكن تدمجهم في وحدة واحدة. ومواصفات الـ filter المدمج هي:

الـ SRC filter المدمج
H\!\left(e^{j\omega}\right) = \begin{cases} L & |\omega| \le \min\!\left(\dfrac{\pi}{L},\, \dfrac{\pi}{M}\right) \\ 0 & \text{otherwise} \end{cases}
الـ cutoff بتاع الـ SRC filter هو الأصغر بين cutoff الـ anti-imaging (π/L) وcutoff الـ anti-aliasing (π/M)، محسوب بالمعدل الوسيط العالي Lfs. والـ gain في الـ passband = L عشان يعوّض إدخال الأصفار.

مخطط النظام هو: x[n] → upsampling بـ L → low-pass filter H → downsampling بـ M → y[m]. وعند المعدل الوسيط Lfs، الـ signal اللي اتعملها upsampling بتعدّي على الـ filter H قبل ما تختار كل sample رقم M للخرج. والنتيجة سلسلة بالمعدل المطلوب (L/M)fs.

مثال كلاسيكي: 44.1 كيلوهرتز ↔ 48 كيلوهرتز

التحويل بين 44.1 كيلوهرتز و48 كيلوهرتز بيتكرّر كتير في الصوت الاحترافي — بيظهر كل مرة محتوى معمول للبث الرقمي (48 كيلوهرتز) لازم يتوزّع على CDs (44.1 كيلوهرتز) أو العكس. والنسبة هي:

نسبة 44.1 ↔ 48 كيلوهرتز
\frac{f_{\text{out}}}{f_{\text{in}}} = \frac{48{,}000}{44{,}100} = \frac{160}{147}
عشان تحوّل من 44.1 لـ 48 كيلوهرتز: اعمل upsampling بـ L = 160، رشّح، وبعدين decimation بـ M = 147. والمعدل الوسيط = 160 × 44.1 كيلوهرتز = 7.056 ميجاهرتز. وللتحويل في الاتجاه العكسي، بدّل L بـ M.
160
معامل الـ upsampling L (44.1→48 كيلوهرتز)
147
معامل الـ decimation M (44.1→48 كيلوهرتز)
7.056
المعدل الوسيط (ميجاهرتز)

تشغيل الـ filter بمعدل 7.056 ميجاهرتز بالطريقة الساذجة هيبقى مكلّف حسابيًا جدًا. والهيكل الـ polyphase بيحل المشكلة دي: بيتجنّب إنه يوصل للمعدل الوسيط خالص، وبينزّل الحساب لحتة صغيرة من التكلفة الساذجة.

تصميم الـ filter المدمج

الـ SRC filter المدمج لازم يحقق قيدين في نفس الوقت. لما L > M (الـ upsampling هو المسيطر)، cutoff الـ anti-imaging π/L بيبقى أشد من π/M وبيتحكّم في التصميم. ولما M > L (الـ decimation هو المسيطر)، cutoff الـ anti-aliasing π/M هو القيد الحاكم. وفي الحالتين الـ cutoff بيتظبط على min(π/L, π/M) والـ gain في الـ passband بيساوي L.

قايمة تصميم الـ filter

عشان تصمّم الـ SRC low-pass filter: (1) ظبّط الـ cutoff على π/max(L, M) راديان/sample بالمعدل الوسيط Lfs؛ (2) ظبّط gain الـ passband على L؛ (3) اختار درجة الـ filter عشان تحقق الـ stopband attenuation المطلوب — ≥ 80 ديسيبل للصوت العادي. والـ equiripple FIR filter بطريقة Parks-McClellan هو الاختيار المعياري.

عرض الـ transition band بتاع الـ filter بيتحدّد بحافة النطاق في أسوأ حالة: الـ signal اللي واخدة الـ bandwidth الكامل للدخل (لحد π عند fs) لازم تفضل تحت π/max(L, M) في الخرج. وفي الصوت، فيه transition band ينفع يتستخدم في [20 كيلوهرتز، ½fmin]، بيستوعب بسهولة حتى تصميمات FIR الحادة من غير ringing مسموع.

التنفيذ الكفء: الـ polyphase SRC

إنك توصل للمعدل الوسيط Lfs وتشغّل FIR filter طويل عنده مش عملي. وطريقة الـ polyphase بتتجنّب ده لما تاخد بالها إن سلسلة الـ upsampling-الـ filtering-الـ decimation ممكن تتعاد ترتيبها بحيث كل الـ filtering يحصل يا عند fs يا عند (L/M)fs — أيهم أقل.

الـ FIR filter المدمج اللي طوله N بيتحلّل لـ L فرع polyphase. والخرج المطلوب فعلًا هو sample واحدة كل M من الخرج الكلي للـ filter (بسبب الـ decimation اللي بعده). ولما تختار الفرع الصح اللي تحسبه وترتّبه، الـ polyphase SRC بيحسب الخرج ده بالظبط — ومفيش غيره. والنتيجة خوارزمية بتعالج sample خرج واحدة بإنها تحسب فرع polyphase واحد فيه N/L معامل، وبتلف على الـ L فرع بشكل دوري بخطوة M.

خرج الـ polyphase SRC
y[m] = \sum_{k=0}^{N/L - 1} E_{k(m)}[k]\, x[n(m) - k], \quad k(m) = (mM \bmod L)
كل sample خرج y[m] بتتحسب من الفرع الـ polyphase k(m) = (mM mod L)، متقيّم عند index دخل n(m) = ⌊mM/L⌋. والخوارزمية بتتقدّم على الفروع بخطوة M، وبتلف حوالين L، وبتقدّم index الدخل لما تعدّي حدود L.

التكلفة الحسابية للـ polyphase SRC تقريبًا N/L ضربة لكل sample خرج، بغض النظر عن المعدل الوسيط. ولمحوّل 44.1↔48 كيلوهرتز بـ L = 160 وfilter فيه 320 معامل، ده ضربتين بس لكل sample خرج — أقل بكتير من الـ 320 بتوع الطريقة الساذجة.

التحويل بنسبة arbitrary والـ asynchronous

الـ SRC الكسري اللي L وM فيه ثابتين بيعالج أي تحويل ممكن تعبّر عن نسبته ككسر بسطه ومقامه معقولين. بس فيه حالات محتاجة asynchronous SRC: الـ clock بتاع الدخل والخرج مستقلين والنسبة بتتغيّر مع الوقت (زي جهازين متوصّلين على شبكة فيها jitter في التوقيت). وفي الحالة دي، مينفعش تحسب L/M ثابتة من الأول.

الـ asynchronous SRC بيستخدم fractional delay بيتغيّر باستمرار. والفكرة إنك تتعامل مع سلسلة الدخل على إنها signal مستمرة band-limited عن طريق صيغة الـ sinc interpolation، وبعدين تاخد منها samples عند لحظات الخرج المطلوبة. وعمليًا ده بيتنفّذ بإنك تحتفظ بـ phase accumulator عالي الدقة وتحسب الفرع الـ polyphase المناسب (أو interpolation بين فرعين جنب بعض) عند كل لحظة خرج.

الـ interfaces الصوتية الاحترافية، وأنظمة الصوت المتزامنة على الشبكة (زي AES67 وDante)، والـ front-ends بتاعة الـ SDR كلها بتعتمد على الـ asynchronous SRC عشان تتعامل مع الـ clock drift الحقيقي من غير ما تسيب أثر مسموع أو محسوس.

التطبيقات العملية

الصوت الاحترافي: كل محطة شغل صوت رقمية فيها محرّك SRC عالي الجودة. والتحويل بين 44.1 و48 و88.2 و96 كيلوهرتز حاجة روتينية، والـ SRC filter لازم يحقق attenuation ≥ 120 ديسيبل في الـ stopband عشان يتجنّب aliasing أو images مسموعة في الصوت العالي الدقة.

الـ software-defined radio: الـ receiver بتاع SDR بيعمل digitizing لنطاق RF واسع بمعدل عالي (مثلًا 61.44 ميجاهرتز) ولازم يسلّم قناة ضيقة بمعدل أقل بكتير (مثلًا 200 كيلوهرتز لقناة GSM). وسلسلة SRC ورا بعض — كتير بتستخدم decimations صحيحة متتالية وبعدها مرحلة SRC كسرية أخيرة — بتعمل ده وهي بتكبت الـ adjacent channel interference في كل خطوة.

الفيديو والملتيميديا: الـ video codecs بتشتغل بـ frame rates زي 23.976 و25 و29.97 و30 و60 frame/ثانية. والتحويل بين المعدلات دي محتاج SRC زمني؛ ونفس إطار الـ polyphase بينطبق في الزمن (الـ frames) بدل الـ samples.

الدرس الجاي: الـ filter banks — تقسيم الـ signal العريضة النطاق لـ subbands باستخدام analysis وsynthesis filter banks، أساس الـ audio codecs وأنظمة الـ OFDM.

أهم النقط
  • الـ sample rate conversion بنسبة كسرية L/M بيتحقق بالـ upsampling بـ L، والـ filtering بـ low-pass filter مدمج بـ cutoff min(π/L, π/M) وgain L، وبعدين الـ decimation بـ M.
  • الـ filter المدمج الواحد بيحل محل الـ anti-imaging filter (من الـ upsampling) والـ anti-aliasing filter (من الـ decimation)، وبيستخدم الـ cutoff الأشد.
  • التحويل الكلاسيكي 44.1 ↔ 48 كيلوهرتز بيستخدم L = 160 وM = 147، وده بيطلّع معدل وسيط 7.056 ميجاهرتز مبيتحققش فيزيائيًا لما تستخدم التنفيذ الـ polyphase.
  • الـ polyphase SRC بيحلّل الـ filter لـ L فرع وبيحسب الفرع المطلوب لكل sample خرج بس، فبينزّل التكلفة لـ N/L ضربة لكل sample بغض النظر عن المعدل الوسيط.
  • الـ asynchronous SRC بيعالج المصادر اللي الـ clocks بتاعتها مستقلة بإنه بيحدّث الـ fractional phase accumulator باستمرار ويختار الفرع الـ polyphase المناسب عند كل لحظة خرج.
  • الـ SRC أساسي في الصوت الاحترافي والـ software-defined radio وترميز الملتيميديا في كل حتة الـ signals بتعدّي فيها حدود sample rates.
اللي فات الـ interpolation (الـ upsampling) نظرة عامة على الموديول الدرس اللي بعده الـ filter banks والهياكل الـ polyphase