Định dạng dữ liệu

Android dùng nhiều loại âm thanh định dạng dữ liệu nội bộ và hiển thị một tập hợp con trong số này trong các API công khai, định dạng tệp, và Lớp trừu tượng phần cứng (HAL).

Thuộc tính

Các định dạng dữ liệu âm thanh được phân loại theo thuộc tính:

Nén
Đã giải nén, được nén không mất dữ liệu, hoặc được nén ở dạng mất. PCM là định dạng âm thanh không nén phổ biến nhất. FLAC là một định dạng nén không tổn hao trong khi MP3 và AAC là các định dạng nén có tổn hao.
Độ sâu bit
Số bit đáng kể trên mỗi mẫu âm thanh.
Kích thước vùng chứa
Số bit được sử dụng để lưu trữ hoặc truyền một mẫu. Giá thông thường điều này giống như độ sâu bit, nhưng đôi khi bit khoảng đệm được phân bổ để căn chỉnh. Ví dụ: một Mẫu 24 bit có thể được chứa trong từ 32 bit.
Căn chỉnh
Nếu kích thước vùng chứa chính xác bằng với độ sâu bit, thì được gọi là đã đóng gói. Nếu không, giá trị biểu diễn sẽ là đã giải nén. Các bit quan trọng của mẫu thường là căn chỉnh với ngoài cùng bên trái (quan trọng nhất) hoặc ngoài cùng bên phải một bit (ít nhất đáng kể) của vùng chứa. Thông thường nên sử dụng các cụm từ packedunpacked chỉ khi bit không phải là luỹ thừa hai.
Ký hiệu
Mẫu đã được ký hay chưa được ký.
Bản trình bày
Có thể là dấu phẩy động hoặc dấu phẩy động; xem bên dưới.

Biểu diễn điểm cố định

Điểm cố định là cách biểu diễn phổ biến nhất cho dữ liệu âm thanh PCM không nén, đặc biệt là ở giao diện phần cứng.

Số điểm cố định có số chữ số cố định (không đổi) trước và sau điểm Radix. Tất cả các đại diện của chúng tôi đều sử dụng cơ sở 2, nên chúng ta thế bit bằng chữ số, và điểm nhị phân hoặc đơn giản là điểm cho điểm rax. Các bit ở bên trái của điểm là phần nguyên, và các bit ở bên phải của điểm là phần phân số.

Chúng tôi nói đến số nguyên PCM, vì các giá trị điểm cố định thường được lưu trữ và thao tác dưới dạng giá trị số nguyên. Diễn giải điểm cố định là ngầm ẩn.

Chúng ta sử dụng phép bù hai đối với mọi biểu diễn theo điểm cố định có chữ ký, vì vậy, hàm sau đây chứa tất cả các giá trị theo đơn vị của một LSB:

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

Ký hiệu Q và U

Có nhiều lựa chọn chú thích để biểu diễn điểm cố định trong một số nguyên. Chúng tôi sử dụng ký hiệu Q: Qm.n nghĩa là m bit số nguyên và n bit phân số. Chữ "Q" được tính là một bit, mặc dù giá trị được biểu thị trong phần bù của hai. Tổng số bit là m + n + 1.

Um.n là dành cho các số chưa ký: m bit số nguyên và n bit phân số, và "U" sẽ được tính là 0 bit. Tổng số bit là m + n.

Phần số nguyên có thể được dùng trong kết quả cuối cùng hoặc chỉ là tạm thời. Trong trường hợp sau, các bit tạo nên phần số nguyên được gọi bit bảo vệ. Các bit bảo vệ cho phép tính toán trung gian bị tràn, miễn là giá trị cuối cùng nằm trong phạm vi hoặc có thể giới hạn trong phạm vi. Lưu ý là các bit bảo vệ điểm cố định nằm ở bên trái, còn đơn vị dấu phẩy động số bảo vệ được dùng để giảm lỗi vòng tròn và ở bên phải.

Biểu diễn dấu phẩy động

Dấu phẩy động là phương án thay thế cho điểm cố định, trong đó vị trí của điểm có thể thay đổi. Sau đây là những ưu điểm chính của dấu phẩy động:

  • Phạm vi tiếp cận lớn hơn và phạm vi động; dung sai số học dấu phẩy động vượt quá phạm vi danh nghĩa trong khi tính toán trung gian và chỉ giá trị kẹp ở cuối
  • Hỗ trợ các giá trị đặc biệt như vô cực và NaN
  • Dễ sử dụng hơn trong nhiều trường hợp

Trước đây, số học dấu phẩy động chậm hơn số nguyên hoặc điểm cố định số học, nhưng hiện nay dấu phẩy động thường sẽ nhanh hơn, được cung cấp quyết định luồng điều khiển không dựa trên giá trị của một phép tính.

Các định dạng âm thanh trên Android

Bảng dưới đây liệt kê các định dạng âm thanh chính trên Android:

Ký hiệu
Thuộc tính Câu hỏi 0.15 Câu hỏi 0.7 1 Câu hỏi 0.23 Câu hỏi 0.31 số thực dấu phẩy động
Vùng chứa
bit
16 8 24 hoặc 322 32 32
Các bit quan trọng
bao gồm cả dấu
16 8 24 24 hoặc 322 25 3
Khoảng trần
tính bằng dB
0 0 0 0 126 4
Dải động
tính bằng dB
90 42 138 138 đến 186 900 5

Tất cả các định dạng điểm cố định ở trên có phạm vi danh nghĩa từ -1,0 đến +1,0 trừ đi một LSB. Có 1 giá trị âm nhiều hơn giá trị dương do biểu diễn bổ sung của hai.

Chú thích cuối trang:

  1. Tất cả các định dạng ở trên giá trị mẫu đã ký thể hiện. Định dạng 8 bit thường được gọi là "unsigned", nhưng nó thực sự là một giá trị đã ký có độ lệch 0.10000000.
  2. Q0.23 có thể được đóng gói thành 24 bit (ba byte 8 bit, ít-endian) hoặc chưa được giải nén 32 bit. Nếu được giải nén, các bit quan trọng sẽ được căn phải về phía LSB với khoảng đệm mở rộng dấu về phía MSB (Q8.23), hoặc căn trái về phía MSB và lấp đầy khoảng trống bằng 0 về phía LSB (Q0.31). Về mặt lý thuyết, Q0.31 cho phép tối đa 32 bit có nghĩa, nhưng các giao diện phần cứng chấp nhận Q0.31 hiếm khi sử dụng tất cả các bit.
  3. Dấu phẩy động với độ chính xác đơn có 23 bit rõ ràng cộng với một bit ẩn và bit dấu, tạo ra tổng cộng 25 bit đáng kể. Số bất thường có ít bit quan trọng hơn.
  4. Dấu phẩy động có độ chính xác đơn có thể thể hiện các giá trị lên tới ± 1,7e + 38, điều này giải thích cho khoảng không quảng cáo lớn.
  5. Phạm vi động được hiển thị là dành cho các trạng thái bất thường lên đến mức tối đa danh nghĩa giá trị ±1,0. Lưu ý rằng một số cách triển khai dấu phẩy động dành riêng cho từng cấu trúc như Hàm NEON không hỗ trợ giá trị bất thường.

Lượt chuyển đổi

Phần này thảo luận lượt chuyển đổi dựa trên dữ liệu giữa các bản trình bày khác nhau.

Lượt chuyển đổi dấu phẩy động

Cách chuyển đổi một giá trị từ định dạng Qm.n sang dấu phẩy động:

  1. Chuyển đổi giá trị thành dấu phẩy động như thể đó là một số nguyên (bằng cách bỏ qua dấu phẩy).
  2. Nhân với 2-n.

Ví dụ: để chuyển đổi giá trị nội bộ Q4.27 sang dấu phẩy động, hãy sử dụng:

float = integer * (2 ^ -27)

Lượt chuyển đổi từ dấu phẩy động sang dấu phẩy động tuân theo các quy tắc sau:

  • Dấu phẩy động có độ chính xác đơn có phạm vi danh nghĩa là ± 1,0, nhưng toàn bộ phạm vi cho các giá trị trung gian là ± 1,7e + 38. Chuyển đổi giữa dấu phẩy động và dấu cố định để biểu diễn bên ngoài (chẳng hạn như đầu ra sang thiết bị âm thanh) sẽ chỉ xem xét phạm vi danh nghĩa, với giới hạn cho các giá trị vượt quá phạm vi đó. Đặc biệt, khi +1.0 được chuyển đổi ở định dạng điểm cố định, nó được giới hạn với +1,0 trừ đi một LSB.
  • Giá trị bất thường (dữ liệu phụ) và cả +/- 0.0 đều được phép biểu diễn, nhưng có thể được tự động chuyển đổi thành 0 trong quá trình xử lý.
  • Số vô hạn sẽ truyền qua các phép toán hoặc sẽ tự động được giới hạn cứng đến +/- 1,0. Nói chung, mục tiêu thứ hai là để chuyển đổi sang định dạng điểm cố định.
  • Hành vi NaN không xác định: một NaN có thể lan truyền dưới dạng một NaN giống hệt, hoặc có thể chuyển đổi thành mặc định NaN, có thể tự động bị giới hạn cứng ở +/- 1.0, hoặc tự động chuyển đổi về 0.0 hoặc dẫn đến lỗi.

Số lượt chuyển đổi điểm cố định

Chuyển đổi giữa các định dạng QTn khác nhau tuân theo các quy tắc sau:

  • Khi m tăng lên, dấu mở rộng phần số nguyên ở bên trái.
  • Khi giảm m, hãy kẹp phần số nguyên.
  • Khi n tăng lên, 0 mở rộng phần phân số ở bên phải.
  • Khi n được giảm, hãy chuyển màu, làm tròn hoặc cắt bớt các bit phân số thừa ở bên phải.

Ví dụ: để chuyển đổi giá trị Q4.27 sang Q0.15 (không có hòa sắc hoặc làm tròn), dịch chuyển sang phải giá trị Q4.27 12 bit và kẹp bất kỳ kết quả nào vượt quá phạm vi có dấu 16 bit. Điều này căn chỉnh điểm của Biểu thị Q.

Để chuyển đổi Q7.24 sang Q7.23, hãy thực hiện chia có dấu cho 2, hoặc tương đương thêm bit dấu vào số nguyên Q7.24, sau đó ký dịch chuyển sang phải 1. Lưu ý rằng phép chuyển dịch sang phải có dấu đơn giản không tương đương với dấu chia cho 2.

Lượt chuyển đổi có tổn hao và không tổn hao

Một lượt chuyển đổi không tổn hao nếu có thể đảo ngược: một lượt chuyển đổi từ A sang B thành C kết quả bằng A = C. Nếu không, lượt chuyển đổi sẽ bị mất.

Cho phép sử dụng lượt chuyển đổi không tổn hao chuyển đổi định dạng khứ hồi.

Chuyển đổi từ biểu diễn điểm cố định có 25 bit đáng kể trở xuống sang dấu phẩy động không tổn hao. Chuyển đổi từ dấu phẩy động sang bất kỳ cách biểu diễn điểm cố định phổ biến nào đều bị tổn hao.