รูปแบบข้อมูล

Android ใช้รูปแบบข้อมูลเสียงที่หลากหลายภายใน และแสดงชุดย่อยของรูปแบบเหล่านี้ใน API สาธารณะ, รูปแบบไฟล์ และ Hardware Abstraction Layer (HAL)

คุณสมบัติ

รูปแบบข้อมูลเสียงจะจัดประเภทตามพร็อพเพอร์ตี้ ดังนี้

การบีบอัด
ไม่มีการบีบอัด บีบอัดแบบไม่สูญเสียคุณภาพ หรือ บีบอัดแบบสูญเสียคุณภาพ PCM เป็นรูปแบบเสียงที่ไม่มีการบีบอัดที่ใช้กันมากที่สุด FLAC เป็นรูปแบบที่ไม่มีการบีบอัด ส่วน MP3 และ AAC เป็นรูปแบบที่บีบอัดแบบสูญเสียข้อมูล
ความลึกของบิต
จำนวนบิตที่มีนัยสำคัญต่อตัวอย่างเสียง 1 รายการ
ขนาดคอนเทนเนอร์
จำนวนบิตที่ใช้จัดเก็บหรือส่งตัวอย่าง โดยปกติแล้วค่านี้จะเป็นค่าเดียวกับความลึกของบิต แต่บางครั้งระบบอาจจัดสรรบิตการเติมเพิ่มเติมเพื่อการจัดแนว เช่น ตัวอย่าง 24 บิตอาจอยู่ในคำ 32 บิต
การจัดแนว
หากขนาดคอนเทนเนอร์เท่ากับความลึกของบิตทุกประการ การแสดงผลจะเรียกว่าแพ็ก มิฉะนั้น ระบบจะแยกการนําเสนอ โดยปกติแล้ว บิตที่มีนัยสำคัญของตัวอย่างจะสอดคล้องกับบิตด้านซ้ายสุด (มีนัยสำคัญที่สุด) หรือด้านขวาสุด (มีนัยสำคัญน้อยที่สุด) ของคอนเทนเนอร์ โดยทั่วไปแล้วจะใช้คำว่าแพ็กและไม่ได้แพ็กเฉพาะในกรณีที่ความลึกของบิตไม่ใช่จำนวนที่หารด้วย 2 ลงตัว
Signedness
มีการเซ็นสัญญากับตัวอย่างเพลงหรือไม่
การแสดง
จุดทศนิยมคงที่หรือจุดทศนิยมลอยตัว โปรดดูด้านล่าง

การนําเสนอจุดคงที่

จุดคงที่เป็นรูปแบบที่พบบ่อยที่สุดสำหรับข้อมูลเสียง PCM ที่ไม่ได้บีบอัด โดยเฉพาะที่อินเทอร์เฟซฮาร์ดแวร์

ตัวเลขทศนิยมคงที่จะมีจำนวนตัวเลขก่อนและหลังจุดฐานเป็นจำนวนคงที่ การนำเสนอทั้งหมดของเราใช้ฐาน 2 เราจึงใช้คำว่าบิตแทนตัวเลข และจุดทศนิยมฐาน 2หรือเพียงแค่จุดแทนจุดทศนิยมฐาน บิตทางด้านซ้ายของจุดคือส่วนที่เป็นจำนวนเต็ม ส่วนบิตทางด้านขวาของจุดคือส่วนที่เป็นทศนิยม

เราพูดถึง PCM แบบจำนวนเต็ม เนื่องจากค่าจุดคงที่มักจะจัดเก็บและจัดการเป็นค่าจำนวนเต็ม การตีความเป็นจุดคงที่นั้นเป็นการตีความโดยนัย

เราใช้การเติมเต็มด้วย 2 สำหรับการนําเสนอจุดคงที่ที่มีเครื่องหมายทั้งหมด ดังนั้นค่าทั้งหมดจะอยู่ในหน่วย 1 LSB ดังต่อไปนี้

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

สัญกรณ์ Q และ U

การเขียนการนําเสนอจุดทศนิยมในจํานวนเต็มมีหลายรูปแบบ เราใช้รูปแบบ Q ดังนี้ Qm.n หมายถึง m บิตจำนวนเต็มและ n บิตทศนิยม "Q" จะนับเป็น 1 บิต แม้ว่าค่าจะแสดงเป็น 2's complement จํานวนบิตทั้งหมดคือ m + n + 1

Um.n สำหรับตัวเลขที่ไม่มีเครื่องหมาย: บิตจำนวนเต็ม m และบิตทศนิยม n โดยที่ "U" จะนับเป็นบิต 0 จํานวนบิตทั้งหมดคือ m + n

ระบบอาจใช้ส่วนที่เป็นจำนวนเต็มในผลลัพธ์สุดท้ายหรือใช้เป็นการชั่วคราว ในกรณีหลัง บิตที่ประกอบขึ้นเป็นจำนวนเต็มจะเรียกว่าบิตป้องกัน บิตป้องกันอนุญาตให้การคำนวณระหว่างกลางเกิดการสตรีมออกได้ ตราบใดที่ค่าสุดท้ายอยู่ในช่วงหรือสามารถจำกัดให้อยู่ในช่วง โปรดทราบว่าบิตส่วนเกินของจุดคงที่จะอยู่ทางด้านซ้าย ส่วนตัวเลขส่วนเกินของหน่วยจุดลอยตัวจะใช้เพื่อลดข้อผิดพลาดในการปัดเศษและจะอยู่ทางด้านขวา

การนําเสนอแบบจุดลอยตัว

จุดลอยตัวเป็นทางเลือกแทนจุดคงที่ ซึ่งตําแหน่งของจุดอาจแตกต่างกันไป ข้อดีหลักๆ ของเลขทศนิยม ได้แก่

  • Headroom และช่วงไดนามิกมากขึ้น การดำเนินการทางคณิตศาสตร์แบบทศนิยมลอยตัวยอมรับช่วงเกินค่าที่ระบุในระหว่างการคํานวณขั้นกลาง และจะจำกัดค่าไว้เฉพาะเมื่อสิ้นสุด
  • รองรับค่าพิเศษ เช่น อนันต์และ NaN
  • ใช้งานได้ง่ายขึ้นในหลายกรณี

ที่ผ่านมา การดำเนินการเกี่ยวกับเลขทศนิยมจะช้ากว่าการดำเนินการเกี่ยวกับจำนวนเต็มหรือเลขทศนิยมคงที่ แต่ปัจจุบันการดำเนินการเกี่ยวกับเลขทศนิยมมักจะเร็วกว่า ตราบใดที่การตัดสินใจเกี่ยวกับการควบคุมการไหลไม่ได้อิงตามค่าของการคํานวณ

รูปแบบของ Android สำหรับเสียง

รูปแบบหลักของเสียงสำหรับ Android มีอยู่ในตารางด้านล่าง

การเขียนโน้ต
พร็อพเพอร์ตี้ Q0.15 Q0.7 1 Q0.23 Q0.31 float
คอนเทนเนอร์
บิต
16 8 24 หรือ 32 2 32 32
บิตที่มีนัยสำคัญ
รวมถึงเครื่องหมาย
16 8 24 24 หรือ 32 2 25 3
Headroom
เป็น dB
0 0 0 0 126 4
ช่วงไดนามิก
เป็น dB
90 42 138 138 ถึง 186 900 5

รูปแบบจุดคงที่ทั้งหมดข้างต้นมีช่วงเป็นค่าประมาณ -1.0 ถึง +1.0 ลบ LSB 1 รายการ ค่าลบมีมากกว่าค่าบวก 1 ค่าเนื่องจากการนําเสนอการเติมเต็ม 2 บิต

เชิงอรรถ

  1. รูปแบบทั้งหมดข้างต้นแสดงค่าตัวอย่างที่มีเครื่องหมายบวก รูปแบบ 8 บิตมักเรียกว่า "unsigned" แต่จริงๆ แล้วคือค่าที่มีเครื่องหมายซึ่งมีค่าเบี่ยงเบน 0.10000000
  2. Q0.23 อาจมีการแพ็กเป็น 24 บิต (ไบต์ 8 บิต 3 ตัว แบบ Little-endian) หรือจะถอดแพ็กเป็น 32 บิตก็ได้ หากถอดแพ็กเก็ต บิตที่มีนัยสำคัญจะได้รับการถอดเสียงทางด้านขวาไปทาง LSB โดยมีการเติมค่าขยายสัญญาณทางด้านซ้ายไปทาง MSB (Q8.23) หรือถอดเสียงทางด้านซ้ายไปทาง MSB โดยมีการเติมค่า 0 ทางด้านขวาไปทาง LSB (Q0.31) ในทางทฤษฎีแล้ว Q0.31 อนุญาตให้ใช้บิตที่มีนัยสำคัญได้สูงสุด 32 บิต แต่อินเทอร์เฟซฮาร์ดแวร์ที่ยอมรับ Q0.31 แทบจะไม่ได้ใช้บิตทั้งหมด
  3. จํานวนลอยตัวที่มีความละเอียดระดับเดียวมีบิตที่แสดงอย่างชัดเจน 23 บิต บวกบิตที่ซ่อนอยู่ 1 บิตและบิตแสดงเครื่องหมาย 1 บิต รวมเป็นบิตที่มีนัยสำคัญทั้งหมด 25 บิต จำนวนที่ไม่ใช่ปกติจะมีบิตนัยสำคัญน้อยกว่า
  4. จํานวนทศนิยมแบบความแม่นยําเดี่ยวแสดงค่าได้สูงสุดถึง ±1.7e+38 ซึ่งอธิบายถึง Headroom ที่มาก
  5. ช่วงไดนามิกที่แสดงมีไว้สําหรับค่าที่ไม่ใช่ปกติสูงสุดถึงค่าสูงสุดตามชื่อ ±1.0 โปรดทราบว่าการใช้งานเลขทศนิยมเฉพาะสถาปัตยกรรมบางรายการ เช่น NEON ไม่รองรับการทำให้ค่าเป็นปกติ

Conversion

ส่วนนี้จะกล่าวถึงการเปลี่ยนรูปแบบข้อมูลระหว่างการนำเสนอต่างๆ

การแปลงจุดลอยตัว

วิธีแปลงค่าจากรูปแบบ Qm.n เป็นทศนิยม

  1. แปลงค่าเป็นทศนิยมเสมือนว่าเป็นจำนวนเต็ม (โดยไม่สนใจจุดทศนิยม)
  2. คูณด้วย 2-n

ตัวอย่างเช่น หากต้องการแปลงค่าภายใน Q4.27 เป็นทศนิยม ให้ใช้

float = integer * (2 ^ -27)

การแปลงจากทศนิยมไปเป็นทศนิยมคงที่เป็นไปตามกฎต่อไปนี้

  • ตัวเลขทศนิยมแบบความแม่นยำเดี่ยวมีช่วงเป็น ±1.0 แต่ช่วงเต็มสำหรับค่ากลางคือ ±1.7e+38 การแปลงระหว่างจุดลอยและจุดคงที่สำหรับการนำเสนอภายนอก (เช่น เอาต์พุตไปยังอุปกรณ์เสียง) จะพิจารณาเฉพาะช่วงที่กำหนด โดยมีการจำกัดค่าที่เกินช่วงดังกล่าว โดยเฉพาะอย่างยิ่ง เมื่อแปลง +1.0 เป็นรูปแบบจุดคงที่ ระบบจะจำกัดค่าไว้ที่ +1.0 ลบ LSB 1 รายการ
  • ระบบอนุญาตให้แสดงค่าที่ไม่ใช่ค่าปกติ (ค่าย่อย) และทั้ง +/- 0.0 แต่อาจแปลงเป็น 0.0 โดยอัตโนมัติระหว่างการประมวลผล
  • ระบบจะส่งค่าอนันต์ผ่านการดำเนินการหรือจะจำกัดค่าให้อยู่ในช่วง +/- 1.0 โดยอัตโนมัติ โดยทั่วไปแล้ว รูปแบบหลังมีไว้สําหรับแปลงเป็นรูปแบบจุดทศนิยม
  • ลักษณะการทํางานของ NaN นั้นไม่ชัดเจน: NaN อาจแพร่กระจายเป็น NaN ที่เหมือนกัน หรืออาจแปลงเป็น NaN เริ่มต้น อาจมีการจํากัดแบบฮาร์ดเป็น +/- 1.0 โดยอัตโนมัติ หรือแปลงเป็น 0.0 โดยอัตโนมัติ หรือทําให้เกิดข้อผิดพลาด

Conversion แบบจุดทศนิยมคงที่

การแปลงระหว่างรูปแบบ Qm.n ต่างๆ เป็นไปตามกฎต่อไปนี้

  • เมื่อ m เพิ่มขึ้น ให้ขยายเครื่องหมายของส่วนจำนวนเต็มทางด้านซ้าย
  • เมื่อ m ลดลง ให้จำกัดส่วนที่เป็นตัวเลขที่สมบูรณ์
  • เมื่อ n เพิ่มขึ้น ระบบจะเพิ่ม 0 ต่อส่วนทศนิยมทางด้านขวา
  • เมื่อ 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 บิตเป็นทศนิยมแบบลอยตัวจะไม่สูญเสียข้อมูล การแปลงจากทศนิยมไปเป็นการแสดงผลจุดคงที่ทั่วไปจะสูญเสียข้อมูล