פורמטים של נתונים

מערכת Android משתמשת במגוון רחב של קטעי אודיו פורמטים של נתונים באופן פנימי, וחושפת קבוצת משנה שלהם בממשקי API ציבוריים, פורמטים של קבצים, את הרצף Hardware Abstraction Layer (HAL).

מאפיינים

הפורמטים של נתוני האודיו מסווגים לפי המאפיינים שלהם:

דחיסה
לא דחוס, דחיסת נתונים ללא אובדן מידע, או דחיסת נתונים דחוסה. PCM הוא פורמט האודיו הלא דחוס הנפוץ ביותר. FLAC הוא קובץ דחוס ללא אובדן מידע MP3 ו-AAC הם פורמטים דחוסים עם איבוד נתונים.
עומק ביט
מספר הביטים המשמעותיים לכל דגימת אודיו.
גודל המאגר
מספר הביטים שמשמשים לאחסון או לשידור של דגימה. בדרך כלל זהה לעומק הביט, אבל לפעמים ביטים עם מרווח פנימי מוקצים ליישור. לדוגמה, דוגמה של 24 סיביות יכולה להיות בתוך מילה של 32 סיביות.
יישור
אם גודל המאגר זהה בדיוק לעומק הביט, נקרא packed. אחרת הייצוג unpacked. החלקים המשמעותיים של המדגם הם בדרך כלל מיושר לחלק השמאלי ביותר (המשמעותי ביותר) או הימני ביותר החלק (הכי פחות משמעותי) של המכל. מקובל להשתמש את המונחים ארוזים ולא ארוזים רק כשהביט העומק הוא לא חזקת שתיים.
חתימה
האם הדוגמאות חתומות או לא חתומות.
ייצוג
נקודה קבועה או נקודה צפה (floating-point). מידע נוסף מופיע בהמשך.

ייצוג נקודה קבוע

נקודה קבועה הוא הייצוג הנפוץ ביותר של נתוני אודיו PCM לא דחוסים, במיוחד בממשקי חומרה.

למספר עם נקודה קבועה יש מספר קבוע (קבוע) של ספרות לפני ואחרי נקודת השורש. כל הייצוגים שלנו משתמשים base 2, לכן אנחנו מחליפים את bit ב-ספרה, ו-נקודה בינארית או פשוט point בשביל radix point. הביטים שמשמאל לנקודה הם החלק השלם. והביטים שמימין לנקודה הם החלק החלקי.

אנחנו מדברים על PCM שלמים, כי ערכים של נקודות קבועות מאוחסנים בדרך כלל ועוברים שינויים כערכי מספרים שלמים. הפרשנות כנקודה קבועה היא מרומזת.

אנחנו משתמשים בתוספת משלימה לכל הייצוגים החתומים בנקודה קבועה, החזקות הבאות הן יחידות של LSB:

|largest negative value| = |largest positive value| + 1

סימון Q ו-U

יש מגוון סימונים לייצוג של נקודה קבועה במספר שלם. אנחנו משתמשים בסימון Q: Qm.n פירושו m ביטים שלמים ו-n ביטים חלקיים. Q נחשב ביט אחד, למרות שהערך שלו מבוטא כתוספת לשניים. מספר הביטים הכולל הוא m + n + 1.

אמ.n מיועד למספרים לא חתומים: m ביטים שלמים ו-n ביטים חלקיים, וה-U. נחשב כאפס ביטים. מספר הביטים הכולל הוא m + n.

בתוצאה הסופית אפשר להשתמש בחלק המספר השלם או שהוא זמני. במקרה השני, הביטים שמרכיבים את החלק השלם נקראים קטעי הגנה. ביטים השומרים מאפשרים לחישוב הביניים לגלוש, כל עוד הערך הסופי נמצא בטווח או שאפשר להצמיד אותו לטווח. חשוב לשים לב שביטי ההגנה בעלי נקודה קבועה נמצאים בצד שמאל, ואילו יחידת נקודה צפה (floating-point) ספרות הגנה משמשים לצמצום שגיאות העיגול ומופיעים בצד ימין.

ייצוג של נקודה צפה (floating-point)

נקודה צפה הוא חלופה לנקודה קבועה, שבה המיקום של הנקודה יכול להשתנות. היתרונות העיקריים של נקודה צפה (floating-point):

  • מרווח פנים גדול יותר וטווח דינמי. החישוב של נקודה צפה (floating-point) סובלני לחרוג מטווחים נומנליים גבוהים במהלך חישוב ביניים, וההצמדה של הערכים שבסוף
  • תמיכה בערכים מיוחדים כמו אינסוף ו-NaN
  • קל יותר לשימוש במקרים רבים

בעבר, החישוב של נקודה צפה (floating-point) היה איטי יותר ממספר שלם או מנקודה קבועה אבל עכשיו מקובל שהנקודה הצפה תהיה מהירה יותר, ההחלטות שתקבלו לגבי תהליכי השליטה שזמינות לכם לא מבוססות על הערך של החישוב.

פורמטים של Android לאודיו

הפורמטים העיקריים של Android לאודיו מפורטים בטבלה הבאה:

סימון
נכס רבעון 0.15 שאלה 0.7 1 רבעון 0.23 רבעון 0.31 float
ביטים
של קונטיינר
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 אחד. יש ערך שלילי אחד יותר מערך חיובי עקב הם ייצוג משלים של שתיים.

Footnotes:

  1. כל הפורמטים שלמעלה מבטאים ערכים לדוגמה חתומים. הפורמט של 8 ביט נקרא בדרך כלל 'לא חתום', אבל זהו למעשה ערך חתום עם הטיה של 0.10000000.
  2. Q0.23 עשוי להיות נדחס לתוך 24 סיביות (שלושה בייטים של 8 ביט, Little-endian) או לא ארוז ב-32 סיביות. אם לא ארוזים, הביטים המשמעותיים יש הצדקה ימין לכיוון ה-LSB עם המרווח הפנימי של תוספת הסימן לכיוון ה-MSB (Q8.23), או ישר שמאלה לכיוון ה-MSB עם אפס מילוי לכיוון ה-LSB (Q0.31). ב-Q0.31, תיאורטית מאפשר עד 32 ביטים משמעותיים. אבל ממשקי חומרה שמקבלים את Q0.31 משתמשים בדרך כלל בכל הביטים.
  3. לנקודה צפה בדיוק יחיד יש 23 ביטים מפורשים וגם ביט נסתר ומקדח שלט אחד, והתוצאה שהתקבלה היא 25 ביטים משמעותיים. מספרים לא-נורמליים הם כוללים פחות קטעים משמעותיים.
  4. נקודה צפה ברמת דיוק יחידה יכולה לבטא ערכים עד ±1.7e+38, שמסביר את השטח הגדול.
  5. הטווח הדינמי שמוצג מתייחס לחריגים עד לסכום המקסימלי הנינומי ערך ±1.0. שימו לב שבחלק מההטמעות של נקודה צפה (floating-point) שספציפיות לארכיטקטורה, נאון הם לא תומכים בחריגים.

המרות

הקטע הזה עוסק המרות מסוג נתונים בין ייצוגים שונים.

המרות של נקודות צפות

כדי להמיר ערך מפורמט Qm.n לנקודה צפה:

  1. ממירים את הערך לנקודה צפה כאילו היה מספר שלם (על ידי התעלמות מהנקודה).
  2. מכפילים ב-2-n.

לדוגמה, כדי להמיר ערך פנימי של רבעון 4.27 לנקודה צפה (floating-point), משתמשים בפקודה:

float = integer * (2 ^ -27)

המרות מנקודה צפה (floating-point) קבועה לפי הכללים הבאים:

  • לנקודה צפה ברמת דיוק יחידה יש טווח נומינלי של ±1.0, אבל הטווח המלא של ערכי הביניים הוא ±1.7e+38. המרה בין נקודה צפה (floating-point) לנקודה קבועה לייצוג חיצוני (כגון פלט להתקני אודיו) יש להביא בחשבון רק את הטווח הנומינלי, עם הצמדה לערכים שחורגים מהטווח הזה. באופן ספציפי, כאשר ממירים +1.0 לפורמט עם נקודה קבועה, הוא מוצמד ל- +1.0 פחות LSB אחד.
  • מותר להשתמש בייצוגים דו-נורמליים (תת-טבעיים) וגם בשיעורים +/- 0.0 אבל ייתכן שהוא יומר ל-0.0 במצב שקט במהלך העיבוד.
  • אינסוף אפשרויות לעבור דרך פעולות או יוגבלו ללא קול ל- +/- 1.0. בדרך כלל הפורמט השני הוא להמרה לפורמט עם נקודה קבועה.
  • ההתנהגות של NaN לא מוגדרת: ה-NaN עשוי להיות מופץ בתור NaN זהה, או שהוא הומר ל-NaN ברירת מחדל, עשוי להיות מוגבל באופן שקט ל-+/- 1.0, או מומרים ל-0.0 בצורה שקטה, או לגרום לשגיאה.

המרות מסוג נקודות קבועות

המרות בין פורמטים שונים של Qm.n פועלות לפי הכללים הבאים:

  • לאחר הגדלה של m, מסמנים את החלק של המספר השלם בצד שמאל.
  • כאשר מקטינים את הפרמטר m, מצמידים את החלק של המספר השלם.
  • כשמגדילים את n, אפסים מאריכים את החלק השבר מימין.
  • כשמורידים את הערך n, אפשר לטשטש את החלקים החלקיים העודפים, לעגל אותם או לחתוך אותם מצד ימין.

לדוגמה, כדי להמיר ערך של רבעון 4.27 לרבעון 0.15 (ללא הפרש או עיגול), שינוי הערך של רבעון 4.27 ב-12 ביטים, וצמצום התוצאות שחורג מהטווח החתום של 16 ביט. זה מיישר את הנקודה ייצוג Q.

כדי להמיר את רבעון 7.24 לרבעון 7.23, מבצעים חילוק חתום ב-2, או לחלופין, מוסיפים את הביט של הסימן לכמות השלמה של Q7.24, ואז חותמים על מקש Shift ימני ב-1. הערה: שינוי פשוט וחתום ימינה לא מקביל לחלוקה ב-2 עם סימן.

המרות שאבדו והמרות ללא אובדן נתונים

המרה לא אובדן, אם היא בלתי הפיכה: המרה מ-A ל-B ל- C תוצאות ב-A = C. אחרת, ההמרה תהיה איטית.

הרשאה להמרות ללא אובדן נתונים המרת פורמט הלוך ושוב.

המרות מייצוג של נקודה קבועה עם 25 ביטים משמעותיים או פחות לנקודה צפה (floating-point) אינן אבדות. המרות מנקודה צפה (floating-point) לכל ייצוג נפוץ של נקודה קבועה הופכות להפסדים.