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