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

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 หนึ่ง มีค่าลบมากกว่าค่าบวกเนื่องจากค่า สองสิ่งที่ส่งเสริมกันและกัน

เชิงอรรถ:

  1. รูปแบบทั้งหมดด้านบนค่าตัวอย่างที่ลงนามแบบชัดเจน รูปแบบ 8 บิต โดยทั่วไปเรียกว่า "unsign" แต่ นี่เป็นค่าที่รับรองโดยให้น้ำหนักกับ 0.10000000
  2. Q0.23 อาจรวมอยู่ใน 24 บิต (ไบต์ 8 บิต 3 ไบต์, 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 โปรดทราบว่าการใช้งานจุดลอยตัวเฉพาะสถาปัตยกรรมบางรายการ เช่น นีออน ไม่สนับสนุนสิ่งที่ผิดปกติ

Conversion

ส่วนนี้พูดถึง Conversion ข้อมูล ระหว่างการนำเสนอที่หลากหลาย

การแปลงค่าทศนิยม

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

  1. แปลงค่าเป็นจำนวนทศนิยมเสมือนว่าเป็นจำนวนเต็ม (โดยการละเว้นจุด)
  2. คูณด้วย 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 จากจุดลอยตัวไปยังการแสดงจุดคงที่ทั่วไปจะสูญเสียไป