يستخدم نظام التشغيل Android مجموعة كبيرة من تنسيقات البيانات الصوتية داخليًا، ويعرض مجموعة فرعية منها في واجهات برمجة التطبيقات المتاحة للجميع، تنسيقات الملفات، وHardware Abstraction Layer (HAL).
الخصائص
يتم تصنيف تنسيقات البيانات الصوتية حسب خصائصها:
- الضغط
- غير مضغوطة، مضغوطة بدون فقدان البيانات، أو مضغوطة بفقدان البيانات إنّ PCM هو تنسيق الصوت غير المضغوط الأكثر شيوعًا. FLAC هو تنسيق مضغوط بدون فقدان معلومات، في حين أنّ MP3 وAAC هما تنسيقان مضغوطان مع فقدان معلومات.
- عمق البت
- عدد وحدات البت ذات القيمة الفعّالة لكل عيّنة صوتية.
- حجم الحاوية
- عدد الوحدات المستخدَمة لتخزين عيّنة أو نقلها. وعادةً ما يكون هذا العدد مطابقًا لعدد بتات العمق، ولكن يتم أحيانًا تخصيص مزيد من بتات الحشو للمحاذاة. على سبيل المثال، يمكن أن يتم تضمين ملف صوتي بدقة 24 بت في كلمة بدقة 32 بت.
- المحاذاة
- إذا كان حجم الحاوية يساوي تمامًا عمق البت، يُطلق على التمثيل اسم مُجمَّع. بخلاف ذلك، يتم تفريغ التمثيل. عادةً ما تتم alignmentشدة البتات المهمة في العيّنة مع البت الأيمن (الأكثر أهمية) أو البت الأيسر (الأكثر أهمية) من الحاوية. من المعتاد استخدام المصطلحين مُجمَّع وغير مجمَّع فقط عندما لا يكون عمق البت عددًا من الأعداد المربّعة.
- التوقيع
- ما إذا كانت العيّنات موقَّعة أو غير موقَّعة
- التمثيل
- إما نقطة ثابتة أو نقطة عائمة، راجِع ما يلي.
تمثيل النقطة الثابتة
النقطة الثابتة هي الشكل الأكثر شيوعًا لبيانات الصوت غير المضغوطة بتنسيق PCM، خاصةً في واجهات الأجهزة.
يحتوي الرقم الثابت على عدد ثابت (ثابت) من الأرقام قبل نقطة الأساس وبعدها. تستخدم جميع طرق التمثيل الأساس 2، لذلك نستبدل البت بـ الرقم، والنقطة الثنائية أو النقطة ببساطة بـ نقطة الأساس. وحدات البت على يسار النقطة هي الجزء الصحيح، ووحدات البت على يمين النقطة هي الجزء الكسري.
نتحدث عن الترميز PCM الصحيح، لأنّ قيم النقطة الثابتة يتم تخزينها ومعالجتها عادةً كقيم صحيحة. يكون التفسير كنقطة ثابتة ضمنيًا.
نستخدم المكمّل الثنائي لجميع طرق التمثيل ذات النقطة الثابتة والموقَّعة، لذلك ينطبق ما يلي عندما تكون جميع القيم بوحدات LSB واحدة:
|largest negative value| = |largest positive value| + 1
ترميز Q وU
هناك عدة ترميزات لتمثيل النقطة الثابتة في عدد صحيح. نستخدم ترميز Q: Qm.n يشير إلى m بت صحيح وn بت كسري. يتم احتساب "Q" على أنّه بت واحد، على الرغم من أنّ القيمة يتم التعبير عنها باستخدام المكمل الثنائي. إجمالي عدد الوحدات هو m + n + 1.
يُستخدَم الرمز Um.n للأرقام غير الموقعة: m بتات صحيحة وn بتات كسور، ويُحتسَب الرمز "U" على أنّه بتات صفرية. إجمالي عدد البتات هو m + n.
قد يتم استخدام الجزء الصحيح في النتيجة النهائية، أو قد يكون مؤقتًا. في الحالة الأخيرة، تُعرف الوحدات التي تشكّل الجزء الصحيح باسم وحدات حماية. تسمح بتيارات الحماية بتجاوز عملية حسابية وسيطة، ما دامت القيمة النهائية ضمن النطاق أو يمكن تثبيتها لتصبح ضمن النطاق. يُرجى العلم أنّ وحدات البتات الاحتياطية للأرقام الثابتة تكون على يمين الشاشة، في حين أنّ الأرقام الاحتياطية لوحدة الأرقام العشرية الكافية تكون على يمين الشاشة أيضًا، وذلك لتقليل خطأ التقريب.
تمثيل النقطة العائمة
النقطة العائمة هي بديل للنقطة الثابتة، حيث يمكن أن يختلف موقع النقطة. تشمل المزايا الأساسية للأرقام العشرية العائمة ما يلي:
- مساحة أكبر للتحسين ونطاق ديناميكي: تتيح العمليات الحسابية ذات النقطة العائمة تجاوز النطاقات الاسمية أثناء العمليات الحسابية الوسيطة، ولا تضبط القيم إلا في النهاية
- إتاحة القيم الخاصة، مثل القيم اللانهائية وNaN
- سهولة الاستخدام في العديد من الحالات
في السابق، كانت العمليات الحسابية باستخدام الأرقام العشرية العائمة أبطأ من العمليات الحسابية باستخدام الأعداد الصحيحة أو الأرقام العشرية الثابتة، ولكن من الشائع الآن أن تكون العمليات الحسابية باستخدام الأرقام العشرية العائمة أسرع، شرط أن لا تستند قرارات تدفّق التحكّم إلى قيمة عملية حسابية.
تنسيقات Android للصوت
في الجدول أدناه، يمكنك الاطّلاع على تنسيقات Android الرئيسية للمحتوى الصوتي:
الخاصية | Q0.15 | 0.7 1 | 0.23 | Q0.31 | عائم | |
---|---|---|---|---|---|---|
حاوية الوحدات |
16 | 8 | 24 أو 32 2 | 32 | 32 | |
الأرقام المميّزة بما في ذلك العلامة |
16 | 8 | 24 | 24 أو 32 2 | 25 3 | |
هامش الطاقة بالديسيبل |
0 | 0 | 0 | 0 | 126 4 | |
النطاق الديناميكي بالديسيبل |
90 | 42 | 138 | من 138 إلى 186 | 900 5 |
جميع تنسيقات النقطة الثابتة أعلاه لها نطاق اسمي من -1.0 إلى +1.0 مطروحًا منه رمز LSB واحد. هناك قيمة سلبية واحدة أكثر من القيمة الموجبة بسبب استخدام تمثيل تكميلي العدد اثنين.
الحواشي السفلية:
-
تُعبِّر جميع التنسيقات أعلاه عن قيم عيّنات موقَّعة.
يُعرف تنسيق الـ 8 بت عادةً باسم "غير موقَّت"، ولكنه
في الواقع قيمة موقَّتة بقيمة
0.10000000
. - يمكن تجميع Q0.23 في 24 بت (ثلاثة بايتات بسعة 8 بت، بترتيب الأقل أهمية إلى الأكثر أهمية) أو فك تجميعه في 32 بت. في حال فك الحزمة، يتم إما تسويف البتات المعنوية يمينًا باتجاه البت الأقل أهمية مع إضافة مساحة تمديد علامة باتجاه البت الأكثر أهمية (Q8.23)، أو تسويفها يسارًا باتجاه البت الأكثر أهمية مع إضافة صفر باتجاه البت الأقل أهمية (Q0.31). يسمح معيار Q0.31 نظريًا باستخدام ما يصل إلى 32 بتًا مهمًا، ولكن نادرًا ما تستخدم واجهات الأجهزة التي تقبل معيار Q0.31 جميع البتات.
- تحتوي النقطة العائمة ذات الدقة الواحدة على 23 بتًا صريحًا بالإضافة إلى بت مخفي وبت إشارة، مما يؤدي إلى إجمالي 25 بتًا ذي أهمية. الأرقام غير العادية تحتوي على عدد أقل من البتات المعنوية.
- يمكن أن تعبّر النقطة العائمة ذات الدقة الواحدة عن قيم تصل إلى ±1.7e+38، وهو ما يفسّر المساحة الكبيرة المتاحة.
- النطاق الديناميكي المعروض مخصّص للقيم غير العادية التي تصل إلى الحد الأقصى الاسمي لقيمة ±1.0. يُرجى العِلم أنّ بعض عمليات تنفيذ النقطة العائمة الخاصة بالبنية، مثل NEON ، لا تتوافق مع الأعداد غير العادية.
الإحالات الناجحة
يتناول هذا القسم تحويلات البيانات بين التمثيلات المختلفة.
عمليات التحويل باستخدام النقطة العائمة
لتحويل قيمة من تنسيق Qm.n إلى قيمة بفاصل عائم:
- تحويل القيمة إلى عدد عشري كما لو كانت عددًا صحيحًا (من خلال تجاهل النقطة)
- اضرب في 2-n.
على سبيل المثال، لتحويل قيمة داخلية بالتنسيق Q4.27 إلى قيمة بفاصل عشري، استخدِم:
float = integer * (2 ^ -27)
تلتزم عمليات التحويل من النقطة العائمة إلى النقطة الثابتة بالقواعد التالية:
- تبلغ النطاق الاسمي للنقطة العائمة ذات الدقة الواحدة ±1.0، ولكن النطاق الكامل للقيم الوسيطة هو ±1.7e+38. عند التحويل بين النقطة العائمة والنقطة الثابتة للعرض الخارجي، (مثل الإخراج إلى أجهزة الصوت) سيتم أخذ النطاق الاسمي فقط في الاعتبار، مع تثبيت القيم التي تتجاوز هذا النطاق. على وجه الخصوص، عند تحويل القيمة +1.0 إلى تنسيق نقطي ثابت، يتم حصرها في القيمة +1.0 مطروحًا منها وحدة بت واحدة منخفضة الترتيب.
- يُسمح بعرض القيم غير العادية (القيم الفرعية) و+/- 0.0، ولكن قد يتم تحويلها بصمت إلى 0.0 أثناء المعالجة.
- سيتمّ إما تمرير القيم اللانهائية خلال العمليات أو سيتمّ فرض حدود صارمة عليها بدون إشعار بقيمة ± 1.0. ويكون الخيار الأخير بشكل عام مخصّصًا للتحويل إلى تنسيق نقطي ثابت.
- لا يمكن تحديد سلوك NaN: قد يتم نشر NaN كقيمة NaN متطابقة، أو قد يتم تحويلها إلى قيمة NaN تلقائية، أو قد يتم حصرها بشكل صارم في حدود +/- 1.0 بدون إشعار، أو تحويلها إلى 0.0 بدون إشعار، أو قد تؤدي إلى حدوث خطأ.
الإحالات الناجحة ذات النقطة الثابتة
تلتزم عمليات التحويل بين تنسيقات Qm.n المختلفة بالقواعد التالية:
- عند زيادة m، يتم تمديد العلامة إلى الجزء الصحيح على يمين القيمة.
- عند خفض m، يجب تقييد الجزء الصحيح.
- عند زيادة n، يمدّ الصفر الجزء الكسري على اليمين.
- عند خفض n، يتم إما تشويش أو تقريب أو اقتطاع الأجزاء الكسور الزائدة على اليمين.
على سبيل المثال، لتحويل قيمة Q4.27 إلى Q0.15 (بدون التمويه أو التقريب)، حرِّك قيمة Q4.27 12 بت إلى اليمين، واضبط أي نتائج تتجاوز النطاق الموقَّت الذي يتألف من 16 بت. يؤدي ذلك إلى محاذاة نقطة تمثيل Q.
لتحويل Q7.24 إلى Q7.23، عليك إجراء عملية قسمة على 2 باستخدام علامة، أو إضافة العلامة إلى الكمية الصحيحة Q7.24، ثم تحويلها إلى اليمين باستخدام علامة بمقدار 1. يُرجى العلم أنّ عملية التقديم البسيطة ذات العلامة اليمنى ليست مساوية لعملية القسمة ذات العلامة على 2.
الإحالات الناجحة بفقدان البيانات وغير ذلك
تكون الإحالة الناجحة بلا فقدان إذا كان بإمكانك
عكسها:
تؤدي الإحالة الناجحة من A
إلى B
ثم إلى
C
إلى A = C
.
وإلا تكون عملية التحويل غير فعّالة.
تسمح عمليات التحويل بدون فقدان بالاستبدالبتحويل التنسيق ذهابًا وإيابًا.
إنّ عمليات التحويل من التمثيل بنقطة ثابتة باستخدام 25 بتًا معنويًا أو أقل إلى النقطة العائمة لا تؤدي إلى فقدان البيانات. إنّ عمليات التحويل من النقطة العائمة إلى أي تمثيل شائع للنقطة الثابتة تؤدي إلى فقدان البيانات.