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