هناك سلسلة من العينات
بالإضافة إلى ذلك ، كما سبق ذكره ، هناك معلمتان أوليتان
و
. تحتاج إلى الحصول على تسلسل عينة جديد
. كما يمكنك بالفعل تخمين ، فإن أول عينة إخراج معروفة بالفعل: تتزامن مع إحدى المعلمات الأولية
. هذا شيء آخر غير "النزوح الأولي". وتجدر الإشارة إلى أن عينات المدخلات (المصدر) مشفرة بأربع بتات. بالنسبة للأنواع الموقعة ، تقع الأعداد الصحيحة من -8 إلى 7 ، شاملة ، تحت التشفير. الشيء الأكثر أهمية ، في الواقع ، هو المسؤول عن علامة الرقم. عينات PCM الإخراج ، التي يتم الحصول عليها بعد فك التشفير ، لها تنسيق قياسي موقع 16 بت.
تحليل رمز الخوارزمية في C ، يمكنك رؤية جدولين. يتم سردها أدناه.
int ima_index_table[] = { -1, -1, -1, -1, 2, 4, 6, 8 };
int ima_step_table[] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 };
يمكن اعتبار هذين الصفيفين "السحريين" دالات جدولة ، في الحجج التي يتم فيها استبدال نفس المعلمتين الأوليتين. أثناء التكرار ، مع كل خطوة ، يتم إعادة حساب المعلمات واستبدالها في هذه الجداول مرة أخرى. أولاً ، دعنا نرى كيف يتم تنفيذ ذلك في التعليمات البرمجية.
نعلن ما يلزم ، بما في ذلك المتغيرات المساعدة.
int current1; int step; int stepindex1; int diff; int current; int stepindex; int value;
قبل بدء التكرار ، تحتاج إلى تعيين المعلمة الأولية للمتغير الحالي
و stepindex المتغير
. يتم ذلك خارج الخوارزمية المعنية ، لذلك لا أعكس هذا مع التعليمات البرمجية. فيما يلي التحولات التي يتم إجراؤها في دائرة (في حلقة).
value = read(input_sample);
في الخطوة المتغيرة المساعدة من المصفوفة ima_step_table ، تتم كتابة القيمة في الفهرس stepindex1. بالنسبة إلى التكرار الأول ، هذه هي المعلمة الأولية
، لمزيد من التكرار هذه معلمة معاد حسابها
. ثم يتم تقسيم القيمة من هذا المصفوفة على 8 (على ما يبدو ، بشكل كامل) بعملية تحويل صغيرة إلى اليمين ، ويتم تهيئة المتغير diff نتيجة لهذا التقسيم. بعد ذلك ، يتم تحليل البتات الثلاثة الأقل أهمية لقيمة عينة الإدخال ، ويمكن تعديل المتغير diff بثلاثة مصطلحات وفقًا لحالاتها. المصطلحات هي تقسيم صحيح مشابه لقيمة الفرق ب 4 (>> 2) ، 2 (>> 1) أو فرق بدون تغييرات (فليكن تقسيمًا على 1 للتعميم). ثم يتم تحليل البت الأكثر أهمية (الموقّع) من قيمة عينة الإدخال. بناءً على حالته ، يتم إضافة المتغير diff الذي تم إنشاؤه قبل ذلك أو طرحه إلى المتغير الحالي 1. ستكون هذه قيمة عينة الإخراج. للصحة ، تقتصر القيم على الأعلى والأسفل. ثم يتم ضبط stepindex1 عن طريق إضافة القيمة من الصفيف ima_index_table عن طريق فهرس قيمة عينة الإدخال مع إعادة تعيين بت الإشارة إلى الصفر. تخضع قيم Stepindex1 أيضًا للحد. في النهاية ، قبل تكرار هذه الخوارزمية ، يتم تعيين القيم الحالية وخطوات Stepindex للقيم المعاد حسابها فقط لـ current1 و stepindex1 ، ويتم تكرار الخوارزمية مرة أخرى.
يمكنك محاولة اكتشافها من أجل فهم كيفية تكوين المتغير diff تقريبًا. دع
. هذه هي قيم متغير الخطوة في كل خطوة من ط إلى التكرار ، كقيم دالة (صفيف) الوسيطة
أين
. للراحة ، نشير إلى المتغير diff على أنه
. بناءً على منطق الاستدلال الموضح أعلاه ، لدينا:
أين
- 3 بتات منخفضة من الرقم
. مما يؤدي إلى قاسم مشترك ، نحول هذا التعبير إلى شكل أكثر ملاءمة:
يعتمد التحويل الأخير على حقيقة أنه ، إلى حد ما ، ثلاث بتات على الأقل (0 أو 1) من الرقم
بالمعاملات المعروضة ، هناك شيء آخر غير كتابة القيمة المطلقة لهذا الرقم ، وأهم جزء من الرقم
ستطابق علامة التعبير بالكامل. كذلك وفقًا للصيغة
يتم حساب قيمة عينة جديدة بناءً على القديمة. بالإضافة إلى ذلك ، يتم حساب قيمة متغيرة جديدة.
:
تشير الوحدة في الصيغة إلى أن المتغير
يدخل في العمل
باستثناء بتة الإشارة الأكثر أهمية ، والتي تنعكس في التعليمات البرمجية. وظيفة
هي قيمة المصفوفة ima_index_table مع الفهرس المقابل للوسيطة.
في وصف الصيغ ، أهملت عمليات التقييد أعلاه وأدناه. يبدو المخطط التكراري الكلي شيئًا مثل هذا:
بعمق شديد في نظرية التشفير / فك التشفير ADPCM التي لم أخوض فيها. ومع ذلك ، فإن قيم الجدول للصفيف ima_step_table (المكون من 89 قطعة) ، إذا حكمنا من خلال انعكاسها على الرسم البياني (انظر الشكل أدناه) ، تصف التوزيع الاحتمالي للعينات بالنسبة لخط الصفر. من الناحية العملية ، عادة ما يكون هذا هو الحال: كلما كانت العينة أقرب إلى خط الصفر ، زاد حدوثها. لذلك ، يعتمد ADPCM على نموذج احتمالي ، ولا يمكن بأي حال من الأحوال تحويل أي مجموعة مصادر لعينات PCM 16 بت بشكل صحيح إلى عينات ADPCM 4 بت. بشكل عام ، ADPCM هي PCM مع خطوة تكمية متغيرة. على ما يبدو ، يعكس هذا الرسم البياني هذه الخطوة المتغيرة للغاية. يتم اختياره بشكل صحيح ، بناءً على قانون توزيع البيانات الصوتية في الممارسة.
