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

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

คุณสมบัติ

รูปแบบข้อมูลเสียงแบ่งตามคุณสมบัติ:

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

การแสดงจุดคงที่

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

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

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

เราใช้ ส่วนเสริมสอง สำหรับการแสดงจุดคงที่ที่ลงนามทั้งหมด ดังนั้นค่าต่อไปนี้จะเก็บโดยที่ค่าทั้งหมดอยู่ในหน่วยของ LSB เดียว :

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

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

มี สัญลักษณ์ ต่างๆ สำหรับการแทนค่าจุดคงที่ในจำนวนเต็ม เราใช้ สัญกรณ์ Q : Q m n หมายถึง m บิตจำนวนเต็ม และ n บิตเศษส่วน "Q" นับเป็นหนึ่งบิต แม้ว่าค่าจะแสดงเป็นส่วนเสริมของสองก็ตาม จำนวนบิตทั้งหมดคือ m + n + 1

คุณ . n ใช้สำหรับตัวเลขที่ไม่ได้ลงชื่อ: m บิตจำนวนเต็ม และ n บิตเศษส่วน และ "U" นับเป็นศูนย์บิต จำนวนบิตทั้งหมดคือ m + n

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

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

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

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

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

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

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

สัญกรณ์
คุณสมบัติ Q0.15 Q0.7 1 Q0.23 Q0.31 ลอย
คอนเทนเนอร์
บิต
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 มีค่าลบมากกว่าค่าบวกหนึ่งค่า เนื่องจากการแทนค่าเสริมของทั้งสองค่า

เชิงอรรถ:

  1. ทุกรูปแบบด้านบนแสดงค่าตัวอย่างที่เซ็นชื่อแล้ว โดยทั่วไปรูปแบบ 8 บิตเรียกว่า "unsigned" แต่จริงๆ แล้วเป็นค่าที่ลงนามโดยมีอคติ 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 โปรดทราบว่าการใช้งานจุดลอยตัวเฉพาะสถาปัตยกรรมบางอย่าง เช่น NEON ไม่รองรับความผิดปกติ

การแปลง

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

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

ในการแปลงค่าจาก Q m n จัดรูปแบบเป็นจุดลอยตัว:

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

ตัวอย่างเช่น หากต้องการแปลงค่าภายใน Q4.27 เป็นจุดลอยตัว ให้ใช้:

float = integer * (2 ^ -27)

การแปลงจากจุดลอยตัวเป็นจุดคงที่เป็นไปตามกฎเหล่านี้:

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

การแปลงจุดคงที่

การแปลงระหว่าง Q m ที่แตกต่างกัน n รูปแบบเป็นไปตามกฎเหล่านี้:

  • เมื่อ m เพิ่มขึ้น ให้เครื่องหมายขยายส่วนที่เป็นจำนวนเต็มทางด้านซ้าย
  • เมื่อ m ลดลง ให้จับส่วนจำนวนเต็มไว้
  • เมื่อ n เพิ่มขึ้น ศูนย์จะขยายส่วนที่เป็นเศษส่วนทางด้านขวา
  • เมื่อ n ลดลง ให้ทำ dither, ปัดเศษ หรือตัดเศษเศษส่วนส่วนเกินทางด้านขวา

ตัวอย่างเช่น ในการแปลงค่า Q4.27 เป็น Q0.15 (โดยไม่มีดิเทอร์หรือการปัดเศษ) ให้เลื่อนค่า Q4.27 ไปทางขวา 12 บิต และยึดผลลัพธ์ใดๆ ที่เกินช่วงที่เซ็นชื่อ 16 บิต สิ่งนี้จะจัดจุดของการเป็นตัวแทน Q

ในการแปลง Q7.24 เป็น Q7.23 ให้ทำการหารแบบมีเครื่องหมายด้วย 2 หรือบวกบิตเครื่องหมายเข้ากับปริมาณจำนวนเต็ม Q7.24 อย่างเท่าเทียมกัน จากนั้นให้เซ็นกะขวาด้วย 1 โปรดทราบว่าการเลื่อนไปทางขวาแบบเซ็นชื่อ ไม่ เทียบเท่ากับ เครื่องหมายหารด้วย 2

การแปลงที่สูญเสียและไม่สูญเสีย

การแปลงจะ ไม่สูญเสีย หาก กลับด้านได้ : การแปลงจาก A ไป B เป็น C ส่งผลให้ A = C มิฉะนั้นการแปลงจะ สูญเสีย

การแปลงแบบไม่สูญเสียช่วยให้ สามารถแปลงรูปแบบไปกลับได้

การแปลงจากการแสดงจุดคงที่ด้วยบิตที่มีนัยสำคัญ 25 บิตหรือน้อยกว่าไปเป็นจุดลอยตัวจะไม่สูญเสีย การแปลงจากจุดลอยตัวไปเป็นการแสดงจุดคงที่ทั่วไปจะสูญเสียไป