Android ใช้เสียงหลากหลาย รูปแบบข้อมูล ภายใน และแสดงส่วนย่อยของสิ่งเหล่านี้ใน API สาธารณะ รูปแบบไฟล์ และ ฮาร์ดแวร์ Abstraction Layer (HAL)
คุณสมบัติ
รูปแบบข้อมูลเสียงได้รับการจัดประเภทตามพร็อพเพอร์ตี้
- การบีบอัด
- ไม่บีบอัด บีบอัดแบบไม่สูญเสียรายละเอียด หรือ บีบอัดแบบสูญเสีย PCM เป็นรูปแบบเสียงที่ไม่มีการบีบอัดที่ใช้กันมากที่สุด FLAC เป็นการบีบอัดแบบไม่สูญเสียรายละเอียด ขณะที่ MP3 และ AAC จะอยู่ในรูปแบบบีบอัดแบบสูญเสียบางส่วน
- ความลึกของบิต
- จำนวนบิตที่สำคัญต่อตัวอย่างเสียง
- ขนาดคอนเทนเนอร์
- จำนวนบิตที่ใช้เพื่อจัดเก็บหรือส่งตัวอย่าง ราคาปกติ จะมีค่าเท่ากับความลึกของบิต แต่บางครั้งก็เพิ่ม จะมีการจัดสรรบิตระยะห่างจากขอบเพื่อการจัดข้อความ ตัวอย่างเช่น ตัวอย่าง 24 บิตอาจอยู่ในคำแบบ 32 บิต
- ความสอดคล้อง
- หากขนาดคอนเทนเนอร์เท่ากับความลึกของบิตพอดี จะเรียกหน้าว่าแพ็กเกจ มิฉะนั้น ตัวแทนจะเป็น คลายการแพคข้อมูล บิตสำคัญของตัวอย่างมักจะ อยู่ในแนวเดียวกับขอบซ้ายสุด (สำคัญที่สุด) หรือขวาสุด (สำคัญน้อยที่สุด) ของคอนเทนเนอร์ การใช้งานตามปกติ คำ pack และ unpack ที่เฉพาะเจาะจงนั่นเอง ความลึกไม่ใช่ ยกกำลัง 2
- การลงชื่อ
- ตัวอย่างมีลายเซ็นหรือไม่
- การแสดง
- จุดคงที่หรือจุดลอยตัว โปรดดูด้านล่าง
การแสดงจุดแบบคงที่
จุดคงที่ เป็นวิธีที่ใช้กันมากที่สุดสำหรับข้อมูลเสียง PCM ที่ไม่มีการบีบอัด โดยเฉพาะในส่วนติดต่อของฮาร์ดแวร์
ตัวเลขคงที่คือจำนวนหลักคงที่ ก่อนและหลัง radix Point ตัวแทนทั้งหมดของเราใช้ ฐาน 2 เราจึงใช้แทน bit แทน digit และ Binary Point หรือแค่ point สำหรับ radix Point บิตทางซ้ายของจุดคือส่วนที่เป็นจำนวนเต็ม ส่วนบิตทางด้านขวาของจุดคือ เศษส่วน
เราพูดถึง Integer PCM เพราะค่าจุดคงที่ มักจะจัดเก็บและแก้ไขเป็นค่าจำนวนเต็ม การตีความว่าเป็นจุดคงที่นั้นโดยนัย
เราใช้องค์ประกอบ 2 อย่าง สำหรับการนำเสนอแบบจุดคงที่ที่มีการลงชื่อทั้งหมด ดังนั้น จะมีการคงไว้ชั่วคราวต่อไปนี้เมื่อค่าทั้งหมดเป็นหน่วยของ 1 LSB:
|largest negative value| = |largest positive value| + 1
รูปแบบ Q และ U
แคมเปญนี้มีหลายประเภท เครื่องหมาย สำหรับการแสดงจุดคงที่ในจำนวนเต็ม เราใช้รูปแบบ Q ดังนี้ Qm.n หมายถึงบิตจำนวนเต็ม m และบิตเศษส่วน n "Q" นับเป็น 1 บิต แม้ว่าค่าจะแสดงเป็นส่วนเติมเต็มสอง จํานวนบิตทั้งหมดคือ m + n + 1
Um.n สำหรับหมายเลขที่ไม่มีลายเซ็น ได้แก่ บิตจำนวนเต็ม m และบิตเศษส่วน n บิต และ "U" จะนับเป็น 0 บิต จำนวนบิตทั้งหมดคือ m + n
ส่วนที่เป็นจำนวนเต็มอาจใช้ในผลลัพธ์สุดท้ายหรือแบบชั่วคราวก็ได้ ในกรณีหลัง บิตที่ประกอบขึ้นเป็นส่วนที่เป็นจำนวนเต็มจะเรียกว่า บิตป้องกัน บิตป้องกันจะทำให้การคำนวณข้อมูลระหว่างกลางเพิ่มขึ้นได้อย่างฉับพลัน ตราบใดที่ค่าสุดท้ายอยู่ภายในช่วงหรือสามารถบีบให้อยู่ภายในช่วง โปรดทราบว่าบิตป้องกันแบบจุดคงที่อยู่ทางด้านซ้าย ในขณะที่หน่วยของจุดลอยตัว หมายเลขป้องกัน ซึ่งใช้เพื่อลดข้อผิดพลาดในการปัดเศษและนำมาแสดงทางด้านขวา
การนำเสนอจุดทศนิยม
จุดทศนิยม เป็นทางเลือกหนึ่งแทนจุดคงที่ ซึ่งตำแหน่งของจุดนั้นอาจแตกต่างกันไป ข้อดีหลักๆ ของจุดลอยตัวได้แก่
- ช่องว่างขนาดใหญ่ และ dynamic range ความคลาดเคลื่อนทางคณิตศาสตร์แบบจุดลอยตัวอยู่เกินช่วงที่ระบุ ระหว่างการคำนวณระหว่างกลาง และจะบีบเฉพาะค่าตอนท้าย
- การรองรับค่าพิเศษ เช่น Infinities และ NaN
- ใช้งานง่ายขึ้นในหลายๆ กรณี
ในอดีต จำนวนเลขทศนิยมของจุดลอยตัวจะช้ากว่าจำนวนเต็มหรือจำนวนคงที่ เป็นเลขคณิต แต่ตอนนี้ การที่จุดลอยตัวจะเร็วกว่า การตัดสินใจเกี่ยวกับขั้นตอนการควบคุมที่มีอยู่ไม่ได้ขึ้นอยู่กับค่าในการคำนวณ
รูปแบบ 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 | |
ช่องว่าง ในหน่วย dB |
0 | 0 | 0 | 0 | 126 4 | |
ช่วงไดนามิก ในหน่วย dB |
90 | 42 | 138 | 138 ถึง 186 | 900 5 |
รูปแบบจุดคงที่ทั้งหมดข้างต้นมีช่วงค่ากลางที่ -1.0 ถึง +1.0 ลบด้วย LSB หนึ่ง มีค่าลบมากกว่าค่าบวกเนื่องจากค่า สองสิ่งที่ส่งเสริมกันและกัน
เชิงอรรถ:
-
รูปแบบทั้งหมดด้านบนค่าตัวอย่างที่ลงนามแบบชัดเจน
รูปแบบ 8 บิต โดยทั่วไปเรียกว่า "unsign" แต่
นี่เป็นค่าที่รับรองโดยให้น้ำหนักกับ
0.10000000
- Q0.23 อาจรวมอยู่ใน 24 บิต (ไบต์ 8 บิต 3 ไบต์, Little-endian) หรือคลายการแพคข้อมูล ใน 32 บิต หากคลายการแพคแล้ว บิตสำคัญจะอยู่ในแนวชิดขวา ไปยัง LSB ที่มีการขยายสัญญาณของ MSB (Q8.23) หรือชิดซ้ายตาม MSB โดยไม่มีการเติมสีให้กับ LSB (Q0.31) Q0.31 ในทางทฤษฎี อนุญาตไม่เกิน 32 บิตที่มีนัยสำคัญ แต่อินเทอร์เฟซของฮาร์ดแวร์ที่ยอมรับ Q0.31 แทบจะไม่ต้องใช้บิตทั้งหมด
- จุดลอยตัวความแม่นยําเดียวมี 23 บิตที่ชัดเจน + หนึ่งบิตที่ซ่อนอยู่และบิตเครื่องหมาย ทำให้ได้ผลลัพธ์ทั้งหมดเป็น 25 บิตที่สำคัญ ตัวเลขผิดปกติ มีจำนวนบิตที่สำคัญน้อยกว่า
- จุดลอยตัวแบบความแม่นยำเดียวสามารถแสดงค่าได้ถึง ±1.7e+38 ซึ่งอธิบายถึง ช่องว่างขนาดใหญ่
- ช่วงไดนามิกที่แสดงเป็นค่าสำหรับค่าผิดปกติซึ่งไม่เกินค่าสูงสุดน้อย ค่า ±1.0 โปรดทราบว่าการใช้งานจุดลอยตัวเฉพาะสถาปัตยกรรมบางรายการ เช่น นีออน ไม่สนับสนุนสิ่งที่ผิดปกติ
Conversion
ส่วนนี้พูดถึง Conversion ข้อมูล ระหว่างการนำเสนอที่หลากหลาย
การแปลงค่าทศนิยม
วิธีแปลงค่าจากรูปแบบ Qm.n เป็นจุดทศนิยม
- แปลงค่าเป็นจำนวนทศนิยมเสมือนว่าเป็นจำนวนเต็ม (โดยการละเว้นจุด)
- คูณด้วย 2-n
เช่น หากต้องการแปลงค่าภายในในไตรมาสที่ 4.27 เป็นจุดทศนิยม ให้ใช้
float = integer * (2 ^ -27)
Conversion จากจุดทศนิยมเป็นจุดคงที่เป็นไปตามกฎต่อไปนี้
- จุดลอยตัวความแม่นยําเดียวมีช่วงค่ากลางที่ ±1.0 แต่ช่วงเต็มของค่ากลางคือ ±1.7e+38 การแปลงระหว่างจุดทศนิยมและจุดคงที่สำหรับการนำเสนอภายนอก (เช่น เอาต์พุตไปยังอุปกรณ์เสียง) จะพิจารณาเฉพาะช่วงค่าน้อยด้วย เพื่อบีบหาค่าที่เกินช่วงนั้น โดยเฉพาะอย่างยิ่ง เมื่อแปลง +1.0 เป็นรูปแบบจุดคงที่ จะถูกบีบ +1.0 ลบด้วย LSB หนึ่ง
- ค่าผิดปกติ (ค่าต่ำกว่าปกติ) และค่า +/- 0.0 ในการนำเสนอ แต่อาจแปลงเป็น 0.0 โดยอัตโนมัติระหว่างการประมวลผล
- Infinity จะผ่านการดำเนินการหรือจะจำกัดแบบเงียบๆ ถึง +/- 1.0 โดยทั่วไปวิธีหลังมีไว้สำหรับการแปลงเป็นรูปแบบจุดคงที่
- ไม่มีการกำหนดลักษณะการทำงานของ NaN โดย NaN อาจเผยแพร่เป็น NaN ที่เหมือนกัน หรือเป็น แปลงเป็น NaN เริ่มต้น อาจทำได้ยากโดยไม่ส่งเสียงที่ +/- 1.0 หรือ แปลงเป็น 0.0 โดยไม่มีการแจ้งเตือน หรือทำให้เกิดข้อผิดพลาด
การแปลงคะแนนคงที่
Conversion ระหว่างรูปแบบ Qm.n ที่ต่างกันเป็นไปตามกฎต่อไปนี้
- เมื่อเพิ่ม m ให้ขยายส่วนที่เป็นจำนวนเต็มทางด้านซ้าย
- เมื่อลด m ให้บีบส่วนที่เป็นจำนวนเต็ม
- เมื่อ n เพิ่มขึ้น ศูนย์จะขยายส่วนที่เป็นเศษส่วนทางด้านขวา
- เมื่อ n ลดลง ให้ใช้การหาร ปัดเศษ หรือตัดบิตที่เป็นเศษส่วนส่วนเกินออกทางด้านขวา
ตัวอย่างเช่น เพื่อแปลงค่า Q4.27 เป็น Q0.15 (โดยไม่หารหรือ ปัดเศษ) เลื่อนค่า Q4.27 ไปทางขวา 12 บิต แล้วยึดผลลัพธ์ ซึ่งเกินช่วง 16 บิตแบบมีเครื่องหมาย ซึ่งจะปรับแนวจุดของ Q แทน
ถ้าจะแปลงไตรมาสที่ 7.24 เป็น Q7.23 ให้หาร 2 ด้วยเครื่องหมาย หรือเพิ่มบิตเครื่องหมายลงในจำนวนจำนวนเต็ม Q7.24 จากนั้นกดแป้น Shift ขวาด้วย 1 โปรดทราบว่า Shift ขวาแบบมีเครื่องหมายเรียบง่ายไม่เท่ากับเครื่องหมายหาร 2
Conversion แบบสูญเสียและไม่สูญเสียข้อมูล
Conversion จะเป็น Conversion ไม่สูญเสีย หากใช่
การสลับไม่ได้:
Conversion จาก A
เป็น B
เป็น
C
ผลลัพธ์ใน A = C
มิเช่นนั้น Conversion จะสูญเสียไป
อนุญาต Conversion แบบไม่สูญเสียรายละเอียด การแปลงรูปแบบไป-กลับ
การแปลงจากการแสดงจุดคงที่ซึ่งมีบิตสำคัญไม่เกิน 25 บิตไปเป็นจุดลอยตัวจะไม่สูญเสียข้อมูล Conversion จากจุดลอยตัวไปยังการแสดงจุดคงที่ทั่วไปจะสูญเสียไป