قالب‌های داده

Android از انواع مختلفی از قالب‌های داده صوتی به‌صورت داخلی استفاده می‌کند و زیرمجموعه‌ای از آن‌ها را در میاناهای برنامه‌سازی کاربردی عمومی، قالب‌های فایل، و لایه انتزاعی سخت‌افزار (HAL) نمایش می‌دهد.

مشخصات

قالب‌های داده صوتی براساس ویژگی‌هایشان طبقه‌بندی می‌شوند:

فشرده‌سازی
فشرده‌نشده، فشرده‌سازی بدون افت کیفیت، یا فشرده‌سازی با افت کیفیت. ‫PCM رایج‌ترین قالب صدای غیرفشرده است. FLAC یک قالب فشرده بدون اتلاف است، درحالی‌که MP3 و AAC قالب‌های فشرده با اتلاف هستند.
عمق بیت
تعداد بیت‌های قابل‌توجه در هر نمونه صوتی.
اندازه محتوی
تعداد بیت‌های مورداستفاده برای ذخیره یا انتقال نمونه. معمولاً این مقدار با عمق بیت یکسان است، اما گاهی اوقات بیت‌های تکمیلی برای تراز کردن اختصاص داده می‌شود. برای مثال، یک نمونه ۲۴ بیتی می‌تواند در یک کلمه ۳۲ بیتی قرار بگیرد.
تراز
اگر اندازه ظرف دقیقاً برابر با عمق بیت باشد، نمایش را فشرده می‌نامند. درغیراین‌صورت، نمایش بازشده است. بیت‌های مهم نمونه معمولاً با بیت سمت چپ (مهم‌ترین) یا بیت سمت راست (کم‌اهمیت‌ترین) ظرف تراز می‌شوند. استفاده از اصطلاحات فشرده و غیرفشرده تنها زمانی مرسوم است که عمق بیت توان دو نباشد.
علامت‌دار بودن
نمونه‌ها امضا شده یا بدون امضا باشند.
نمایندگی
یا نقطه ثابت یا نقطه شناور؛ به زیر مراجعه کنید.

نمایش ممیز ثابت

نقطه ثابت رایج‌ترین نمایش برای داده‌های صوتی PCM فشرده‌نشده است، به‌ویژه در واسط‌های سخت‌افزاری.

یک عدد ممیز ثابت دارای تعداد ثابتی از ارقام قبل و بعداز ممیز است. همه نمایش‌های ما از مبنای ۲ استفاده می‌کنند، بنابراین بیت را به‌جای رقم، و نقطه دودویی یا به‌سادگی نقطه را به‌جای نقطه مبنا جایگزین می‌کنیم. بیت‌های سمت چپ نقطه بخش عدد صحیح و بیت‌های سمت راست نقطه بخش کسری هستند.

ما از 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 برای صدا در جدول زیر فهرست شده است:

نوشتار
دارایی ۰.۱۵ کیو ۰٫۷ کیلوکالری ۱ ۰٫۲۳ ۰٫۳۱ شناور
محتوی
بیت
16 8 ‫۲۴ یا ۳۲ ۲ 32 32
بیت‌های مهم
شامل علامت
16 8 24 ‫۲۴ یا ۳۲ ۲ ‫۲۵ ۳
فضای سر
برحسب دسی‌بل
0 0 0 0 ‫۱۲۶ ۴
دامنه پویا
به دسی‌بل
۹۰ ۴۲ 138 ‫۱۳۸ تا ۱۸۶ ۹۰۰ ۵

همه قالب‌های ممیز ثابت بالا دارای محدوده اسمی ۱٫۰- تا ۱٫۰+ منهای یک LSB هستند. به‌دلیل نمایش مکمل دو، یک مقدار منفی بیشتر از مقدار مثبت وجود دارد.

پانویس‌ها:

  1. همه قالب‌های بالا مقادیر نمونه علامت‌دار را بیان می‌کنند. قالب ۸ بیتی معمولاً «بدون علامت» نامیده می‌شود، اما درواقع مقدار علامت‌دار با انحراف 0.10000000 است.
  2. ‫Q0.23 ممکن است در ۲۴ بیت (سه بایت ۸ بیتی، ترتیب کوچک) بسته‌بندی شود، یا در ۳۲ بیت باز شود. اگر ازهم باز شود، بیت‌های مهم یا به‌سمت بیت کم‌ارزش با صفرگذاری امتداد علامت به‌سمت بیت پرارزش (Q8.23) راست‌چین می‌شوند، یا به‌سمت بیت پرارزش با صفرگذاری به‌سمت بیت کم‌ارزش (Q0.31) چپ‌چین می‌شوند. ‫Q0.31 به‌طور نظری تا ۳۲ بیت قابل‌توجه را مجاز می‌کند، اما میاناهای سخت‌افزاری که Q0.31 را می‌پذیرند به‌ندرت از همه بیت‌ها استفاده می‌کنند.
  3. نقطه شناور تک‌دقت دارای ۲۳ بیت صریح به‌علاوه یک بیت پنهان و بیت علامت است که در مجموع ۲۵ بیت قابل‌توجه را نتیجه می‌دهد. اعداد غیرعادی بیت‌های قابل‌توجه کمتری دارند.
  4. نقطه شناور با دقت تکی می‌تواند مقادیر را تا ±۱٫۷e+۳۸ بیان کند، که فضای بالای زیاد را توضیح می‌دهد.
  5. محدوده پویای نشان‌داده‌شده برای اعداد غیرعادی تا حداکثر مقدار اسمی ±۱٫۰ است. توجه داشته باشید که برخی‌از پیاده‌سازی‌های ممیز شناور مختص معماری، مانند NEON، از اعداد غیرعادی پشتیبانی نمی‌کنند.

تبدیل‌ها

این بخش درباره تبدیل‌های داده بین نمایش‌های مختلف بحث می‌کند.

تبدیل‌های نقطه شناور

برای تبدیل مقدار از قالب Qm.n به نقطه شناور:

  1. مقدار را به عدد ممیز شناور تبدیل کنید، انگار عدد صحیح است (با نادیده گرفتن ممیز).
  2. در 2-n ضرب کنید.

برای مثال، برای تبدیل مقدار داخلی Q4.27 به نقطه شناور، از این استفاده کنید:

float = integer * (2 ^ -27)

تبدیل‌ها از نقطه شناور به نقطه ثابت از این قوانین پیروی می‌کنند:

  • نقطه شناور تک‌دقت دارای محدوده اسمی ±۱٫۰ است، اما محدوده کامل برای مقادیر میانی ±۱٫۷e+۳۸ است. تبدیل بین نقطه شناور و نقطه ثابت برای نمایش خارجی (مانند خروجی به دستگاه‌های صوتی) فقط محدوده اسمی را درنظر می‌گیرد و مقادیر خارج از این محدوده را محدود می‌کند. به‌طور خاص، وقتی +۱٫۰ به قالب نقطه ثابت تبدیل می‌شود، به +۱٫۰ منهای یک LSB محدود می‌شود.
  • اعداد غیرعادی (زیرعادی) و هر دو +/- 0.0 در نمایش مجاز هستند، اما ممکن است درطول پردازش بی‌صدا به 0.0 تبدیل شوند.
  • بی‌نهایت‌ها یا از عملیات عبور می‌کنند یا به‌طور بی‌صدا به +/- ۱٫۰ محدود می‌شوند. عموماً دومی برای تبدیل به قالب ممیز ثابت است.
  • رفتار NaN تعریف‌نشده است: NaN ممکن است به‌عنوان NaN یکسان منتشر شود، یا ممکن است به NaN پیش‌فرض تبدیل شود، ممکن است به‌طور بی‌صدا به +/- ۱٫۰ محدود شود، یا به‌طور بی‌صدا به ۰٫۰ تبدیل شود، یا منجر به خطا شود.

تبدیل‌های نقطه ثابت

تبدیل بین قالب‌های مختلف Qm.n از این قوانین پیروی می‌کند:

  • وقتی m افزایش می‌یابد، بخش عدد صحیح در سمت چپ با علامت گسترش می‌یابد.
  • وقتی m کاهش می‌یابد، بخش عدد صحیح را محکم کنید.
  • وقتی n افزایش می‌یابد، بخش کسری در سمت راست با صفر گسترش می‌یابد.
  • وقتی n کاهش می‌یابد، یا بیت‌های کسری اضافی در سمت راست را لرزش‌دار کنید، گرد کنید، یا برش دهید.

برای مثال، برای تبدیل مقدار Q4.27 به Q0.15 (بدون لرزش یا گرد کردن)، مقدار Q4.27 را ۱۲ بیت به راست انتقال دهید و هر نتیجه‌ای را که از محدوده علامت‌دار ۱۶ بیتی فراتر می‌رود محدود کنید. این کار نقطه نمایش Q را تراز می‌کند.

برای تبدیل Q7.24 به Q7.23، تقسیم با علامت بر ۲ انجام دهید، یا به‌طور معادل بیت علامت را به مقدار صحیح Q7.24 اضافه کنید، و سپس یک انتقال به راست با علامت انجام دهید. توجه داشته باشید که یک انتقال به راست ساده با علامت معادل تقسیم با علامت بر ۲ نیست.

تبدیل‌های با اتلاف و بدون اتلاف

تبدیل زمانی بدون اتلاف است که وارون‌پذیر باشد: تبدیل از A به B به C به A = C منجر می‌شود. درغیراین‌صورت، تبدیل پراتلاف است.

تبدیل‌های بدون افت کیفیت اجازه تبدیل قالب رفت‌وبرگشت را می‌دهند.

تبدیل از نمایش نقطه ثابت با ۲۵ بیت قابل‌توجه یا کمتر به نقطه شناور بدون افت است. تبدیل از ممیز شناور به هر نمایش ممیز ثابت رایج با اتلاف همراه است.