الضغط بلا فقد (FLAC)
أحياناً نريد كل عيّنة بالضبط (أرشفة، إنتاج، صوت طبّي). كيف نصغّر الصوت دون حذف أي شيء؟ الجواب يعيدنا تماماً لانقسام نموذج × مرمّز: تنبّؤ يخفض الإنتروبي، ومرمّز يحصد — نفس فلسفة PNG في مسار الصور.
موجة صوتية ناعمة: كل عيّنة قريبة من جارتها. لو خزّنت القيم المطلقة (16-bit لكلٍّ)، لا توفير. لكنك تتذكّر من نظرية المعلومات: الفرق عن المتنبَّأ به إنتروبيه أقلّ.
سؤالان: (١) "تنبّأ بالعيّنة = العيّنة السابقة" يعطي فروقاً صغيرة. لكن هل يمكن تنبّؤ أذكى يستعمل عدّة عيّنات سابقة؟ (٢) الفروق صارت أعداداً صغيرة معظمها قرب الصفر، قليلها كبير. Huffman ممكن، لكن جدوله مكلف ويتغيّر. هل من ترميز يعطي تلقائياً أكواداً قصيرة للأعداد الصغيرة وأطول للكبيرة، بلا جدول؟
التنبّؤ الخطّي (Linear Prediction) — حلّ اللغز ١
بدل "العيّنة السابقة" فقط، تنبّأ بتركيبة خطّية من عدّة سابقات:
linear predictionx̂[n] = a₁·x[n−1] + a₂·x[n−2] + ... + aₚ·x[n−p] residual: e[n] = x[n] − x̂[n] # نخزّن e (صغير) + المعاملات a
المعاملات aₖ تُحلّ لتقليل طاقة الـresidual (معادلات Levinson-Durbin).
هذا نفس منطق مرشّحات PNG (تنبّؤ من الجيران) لكن في الزمن بدل المكان، وبمعاملات
محسوبة بدل خمسة ثابتة. الـresidual إنتروبيه منخفض → جاهز للمرمّز.
ترميز Rice — حلّ اللغز ٢
ترميز Rice/Golomb مثاليّ لأعداد معظمها صغير (توزيع هندسي، وهو
بالضبط شكل الـresidual). الفكرة: اقسم العدد على 2^k؛ خزّن الخارج
بترميز أحادي (unary: أصفار ثم واحد) والباقي بـk بِت. الأعداد الصغيرة
→ خارج صغير → أكواد قصيرة جداً، بلا جدول.
Huffman يحتاج جدولاً (تخزين + تكيّف). Rice معامله الوحيد هو
k (رقم واحد لكل كتلة)، ويطابق التوزيع الهندسي للـresidual رياضياً
(هو Huffman الأمثل لذلك التوزيع). أبسط وأسرع وبلا حمل جدول. لهذا تختاره FLAC و
Shorten و ALAC. مقايضة: يفترض شكل توزيع محدّداً — لو لم يطابقه، يخسر.
FLAC = [تنبّؤ خطّي/ثابت] (نموذج) → [Rice coding] (مرمّز). قارن:
PNG = [مرشّح تنبّؤ] → [Huffman]. نفس الهيكل عبر الوسائط. الفرق: FLAC
يحلّ معاملات تنبّؤ مثلى لكل كتلة، و Rice بدل Huffman. FLAC حرّ ومفتوح.
- نفّذ تنبّؤاً ثابتاً من الرتبة 0–3 (FLAC "fixed predictors": فروق متتالية). لكل كتلة، اختر الرتبة ذات أقلّ مجموع |residual|.
- نفّذ ترميز Rice: لكل كتلة، اختر
kالأمثل (≈log2(متوسّط |e|))، ورمّز الـresidual. - فكّ التشفير وتحقّق من التطابق بِتّياً (هذا lossless — أي اختلاف خطأ).
- قارن نسبة الضغط بـ(أ) تخزين خام، (ب) Huffman على القيم المطلقة، (ج) Huffman على الـresidual. رتّبها وفسّر لماذا.
الضغط بلا فقد = تنبّؤ خطّي (يخفض الإنتروبي) + ترميز Rice (يحصد، بلا جدول). نفس انقسام النموذج/المرمّز عبر كل الوسائط. أتممنا الآن ضغط الصوت كلاسيكياً. لكن الحدّ الأقصى للتنبّؤ التقليدي محدود. ماذا لو تعلّمت آلةٌ نموذج الصوت من ملايين الأمثلة؟ أولاً نحتاج أن نمثّل الصوت بطريقة تأكلها الشبكة.