Android از طیف گستردهای از فرمتهای دادههای صوتی به صورت داخلی استفاده میکند و زیرمجموعهای از آنها را در APIهای عمومی، فرمتهای فایل و لایه انتزاعی سختافزار (HAL) در معرض نمایش میگذارد.
خواص
فرمت های داده های صوتی بر اساس ویژگی هایشان طبقه بندی می شوند:
- فشرده سازی
- فشرده نشده ، فشرده بدون تلفات ، یا فشرده شده با اتلاف . PCM رایج ترین فرمت صوتی غیرفشرده است. FLAC یک فرمت فشرده بدون اتلاف است، در حالی که MP3 و AAC فرمت های فشرده شده با اتلاف هستند.
- عمق بیت
- تعداد بیت های قابل توجه در هر نمونه صوتی.
- اندازه ظرف
- تعداد بیت های مورد استفاده برای ذخیره یا انتقال نمونه. معمولاً این همان عمق بیت است، اما گاهی اوقات بیت های بالشتکی اضافی برای تراز کردن اختصاص داده می شود. به عنوان مثال، یک نمونه 24 بیتی می تواند در یک کلمه 32 بیتی باشد.
- تراز
- اگر اندازه ظرف دقیقاً برابر با عمق بیت باشد، نمایش بسته بندی شده نامیده می شود. در غیر این صورت نمایندگی باز می شود. بیتهای مهم نمونه معمولاً با یا چپترین (مهمترین) یا راستترین (کمترین میزان اهمیت) بیت ظرف همتراز میشوند. مرسوم است که از اصطلاحات بسته بندی شده و بدون بسته بندی تنها زمانی استفاده شود که عمق بیت توان دو نباشد.
- امضاء
- نمونه ها امضا شده باشند یا بدون امضا.
- نمایندگی
- نقطه ثابت یا ممیز شناور. زیر را ببینید.
نمایش نقطه ثابت
نقطه ثابت رایج ترین نمایش برای داده های صوتی PCM فشرده نشده، به ویژه در رابط های سخت افزاری است.
یک عدد نقطه ثابت دارای تعداد ثابت (ثابت) ارقام قبل و بعد از نقطه ریشه است. همه نمایشهای ما از پایه 2 استفاده میکنند، بنابراین بیت را جایگزین رقم میکنیم و نقطه باینری یا به سادگی نقطه را جایگزین نقطه ریشه میکنیم. بیتهای سمت چپ نقطه، قسمت صحیح و بیتهای سمت راست نقطه، قسمت کسری هستند.
ما از PCM عدد صحیح صحبت می کنیم، زیرا مقادیر نقطه ثابت معمولاً به عنوان مقادیر صحیح ذخیره و دستکاری می شوند. تعبیر به نقطه ثابت ضمنی است.
ما از مکمل دو برای تمام نمایش های نقطه ثابت امضا شده استفاده می کنیم، بنابراین در جایی که همه مقادیر در واحدهای یک LSB هستند، موارد زیر صادق است:
|largest negative value| = |largest positive value| + 1
نماد Q و U
نمادهای مختلفی برای نمایش نقطه ثابت در یک عدد صحیح وجود دارد. ما از نماد Q استفاده می کنیم: Q m . n یعنی m بیت عدد صحیح و n بیت کسری. "Q" به عنوان یک بیت به حساب می آید، اگرچه مقدار در مکمل دو بیان می شود. تعداد کل بیت ها m + n + 1 است.
U m n برای اعداد بدون علامت است: m بیت عدد صحیح و n بیت کسری، و "U" به عنوان بیت صفر محاسبه می شود. تعداد کل بیت ها m + n است.
بخش عدد صحیح ممکن است در نتیجه نهایی استفاده شود یا موقت باشد. در مورد دوم، بیت هایی که قسمت صحیح را تشکیل می دهند، بیت های نگهبان نامیده می شوند. بیتهای محافظ اجازه میدهند تا یک محاسبه میانی سرریز شود، تا زمانی که مقدار نهایی در محدوده باشد یا بتوان آن را در محدوده قرار داد. توجه داشته باشید که بیتهای گارد نقطه ثابت در سمت چپ قرار دارند، در حالی که ارقام نگهبان واحد ممیز شناور برای کاهش خطای دور زدن استفاده میشوند و در سمت راست قرار دارند.
نمایش نقطه شناور
نقطه شناور جایگزینی برای نقطه ثابت است که در آن مکان نقطه می تواند متفاوت باشد. مزایای اصلی ممیز شناور عبارتند از:
- فضای سر و محدوده دینامیکی بیشتر؛ محاسبات ممیز شناور بیش از دامنه های اسمی را در طول محاسبات میانی تحمل می کند و فقط مقادیر را در انتها گیر می دهد.
- پشتیبانی از مقادیر ویژه مانند بی نهایت و NaN
- در بسیاری از موارد استفاده آسان تر است
از لحاظ تاریخی، محاسبات ممیز شناور کندتر از محاسبات اعداد صحیح یا ثابت بوده است، اما در حال حاضر معمول است که ممیز شناور سریعتر باشد، مشروط بر اینکه تصمیمات جریان کنترلی بر اساس مقدار یک محاسبه نباشد.
فرمت های اندروید برای صدا
فرمت های اصلی اندروید برای صدا در جدول زیر آمده است:
اموال | Q0.15 | Q0.7 1 | Q0.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 بیتی معمولاً "unsigned" نامیده می شود، اما در واقع یک مقدار امضا شده با بایاس
0.10000000
است. - Q0.23 ممکن است در 24 بیت (سه بایت 8 بیتی، کمی اندین) بسته بندی شود یا در 32 بیت باز شود. اگر بسته بندی نشده باشد، بیت های مهم یا به سمت راست به سمت LSB با بالشتک پسوند علامت به سمت MSB (Q8.23)، یا به سمت چپ به سمت MSB با پر شدن صفر به سمت LSB توجیه می شوند (Q0.31). Q0.31 از نظر تئوری تا 32 بیت قابل توجه را مجاز می کند، اما رابط های سخت افزاری که Q0.31 را می پذیرند به ندرت از همه بیت ها استفاده می کنند.
- ممیز شناور تک دقیق دارای 23 بیت صریح به اضافه یک بیت پنهان و بیت علامت است که در مجموع 25 بیت مهم به دست می آید. اعداد غیرعادی بیت های مهم کمتری دارند.
- نقطه شناور تک دقیق می تواند مقادیر تا ± 1.7e+38 را بیان کند که فضای سر بزرگ را توضیح می دهد.
- محدوده دینامیکی نشان داده شده برای مقادیر غیرعادی تا حداکثر مقدار اسمی ± 1.0 است. توجه داشته باشید که برخی از پیادهسازیهای ممیز شناور خاص معماری مانند NEON از غیرعادیها پشتیبانی نمیکنند.
تبدیل ها
این بخش در مورد تبدیل داده ها بین نمایش های مختلف بحث می کند.
تبدیل نقطه شناور
برای تبدیل یک مقدار از Q m . فرمت n به ممیز شناور:
- مقدار را مانند یک عدد صحیح (با نادیده گرفتن نقطه) به ممیز شناور تبدیل کنید.
- ضرب در 2 - n .
به عنوان مثال، برای تبدیل یک مقدار داخلی Q4.27 به ممیز شناور، از:
float = integer * (2 ^ -27)
تبدیل از ممیز شناور به نقطه ثابت از این قوانین پیروی می کند:
- ممیز شناور تک دقیق دارای محدوده اسمی 1.0 ± است، اما محدوده کامل برای مقادیر میانی ± 1.7e+38 است. تبدیل بین نقطه شناور و نقطه ثابت برای نمایش خارجی (مانند خروجی به دستگاههای صوتی) فقط محدوده اسمی را در نظر میگیرد و برای مقادیری که بیشتر از آن محدوده هستند، گیره میشود. به طور خاص، زمانی که +1.0 به یک فرمت نقطه ثابت تبدیل می شود، به +1.0 منهای یک LSB بسته می شود.
- غیرعادیها (غیرعادیها) و هر دو +/- 0.0 در نمایش مجاز هستند، اما ممکن است در حین پردازش بیصدا به 0.0 تبدیل شوند.
- بینهایتها یا از عملیات عبور میکنند یا به سختی به +/- 1.0 محدود میشوند. به طور کلی دومی برای تبدیل به یک فرمت نقطه ثابت است.
- رفتار NaN تعریف نشده است: یک NaN ممکن است به عنوان یک NaN یکسان منتشر شود، یا ممکن است به یک NaN پیش فرض تبدیل شود، ممکن است به سختی به +/- 1.0 محدود شود، یا در سکوت به 0.0 تبدیل شود، یا منجر به خطا شود.
تبدیل نقطه ثابت
تبدیل بین Q m مختلف. 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 بیت مهم یا کمتر به ممیز شناور بدون تلفات است. تبدیل از ممیز شناور به هر نمایش نقطه ثابت متداول زیان آور است.