Định dạng dữ liệu

Android sử dụng nhiều định dạng dữ liệu âm thanh trong 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ệpLớp trừu tượng phần cứng (HAL).

Của cải

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

Nén
Không nén , nén không mất dữ liệu , hoặc nén có mất dữ liệu . PCM là định dạng âm thanh không nén phổ biến nhất. FLAC là định dạng nén lossless, trong khi MP3 và AAC là định dạng nén lossless.
Độ sâu bit
Số lượng bit đáng kể trên mỗi mẫu âm thanh.
Kích cỡ thùng
Số bit được sử dụng để lưu trữ hoặc truyền mẫu. Thông thường, giá trị này giống với độ sâu bit, nhưng đôi khi các bit đệm bổ sung được phân bổ để căn chỉnh. Ví dụ: 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 độ sâu bit thì biểu diễn được gọi là đóng gói . Nếu không thì biểu diễn sẽ được giải nén . Các bit quan trọng của mẫu thường được căn chỉnh với bit ngoài cùng bên trái (quan trọng nhất) hoặc bit ngoài cùng bên phải (ít quan trọng nhất) của vùng chứa. Thông thường, người ta chỉ sử dụng thuật ngữ đóng góigiải nén khi độ sâu bit không phải là lũy thừa của hai .
Đã ký
Mẫu có chữ ký hay không chữ ký.
đại diện
Điểm cố định hoặc điểm nổi; 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à ở các giao diện phần cứng.

Một số có điểm cố định có số chữ số cố định (không đổi) ở trước và sau dấu cơ số . Tất cả các cách biểu diễn của chúng tôi đều sử dụng cơ số 2 , vì vậy chúng tôi thay thế bit cho chữ sốdấu nhị phân hoặc đơn giản là điểm cho dấu cơ số . 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 ta nói về số nguyên PCM , bởi 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. Việc giải thích điểm cố định là ngầm định.

Chúng tôi sử dụng phần bù hai cho tất cả các biểu diễn điểm cố định có dấu, do đó, các giá trị sau giữ trong đó tất cả các giá trị đều tính bằng đơn vị của một LSB :

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

Ký hiệu Q và U

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

ừm . n dành cho các số không dấu: m bit nguyên và n bit phân số và "U" được tính là bit 0. Tổng số bit là m + n .

Phần nguyên có thể được sử 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 nguyên được gọi là các bit bảo vệ . Các bit bảo vệ cho phép một phép tính trung gian bị tràn, miễn là giá trị cuối cùng nằm trong phạm vi hoặc có thể được giữ trong phạm vi. Lưu ý rằng các bit bảo vệ điểm cố định nằm ở bên trái, trong khi các chữ số bảo vệ đơn vị dấu phẩy động được sử dụng để giảm lỗi làm tròn và ở bên phải.

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

Điểm nổi là một sự thay thế cho điểm cố định, trong đó vị trí của điểm có thể thay đổi. Những ưu điểm chính của dấu phẩy động bao gồm:

  • Khoảng không gian rộng hơn và dải động rộng hơn; số học dấu phẩy động cho phép vượt quá phạm vi danh nghĩa trong quá trình tính toán trung gian và chỉ kẹp các giá trị ở 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ố học số nguyên hoặc dấu phẩy cố định, nhưng hiện nay, dấu phẩy động thường nhanh hơn, với điều kiện là các quyết định về luồng điều khiển không dựa trên giá trị của phép tính.

Các định dạng âm thanh của Android

Các định dạng âm thanh chính của Android được liệt kê trong bảng bên dưới:

Ký hiệu
Tài sản Q0.15 Q0.7 1 Q0.23 Q0.31 trôi nổi
Thùng đựng hàng
chút ít
16 số 8 24 hoặc 32 2 32 32
Bit quan trọng
bao gồm cả dấu hiệu
16 số 8 24 24 hoặc 32 2 25 3
khoảng không
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ừ một LSB. Có nhiều hơn một giá trị âm so với giá trị dương do biểu diễn phần bù của hai giá trị này.

Chú thích cuối trang:

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

Chuyển đổi

Phần này thảo luận về chuyển đổi dữ liệu giữa các biểu diễn khác nhau.

Chuyển đổi dấu phẩy động

Để chuyển đổi một giá trị từ Q m . định dạng n thành dấu phẩy động:

  1. Chuyển đổi giá trị thành dấu phẩy động như thể nó là 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ị bên trong Q4.27 thành dấu phẩy động, hãy sử dụng:

float = integer * (2 ^ -27)

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

Chuyển đổi điểm cố định

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

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

Ví dụ: để chuyển đổi giá trị Q4.27 thành Q0.15 (không hoà 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 diễn Q.

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

Chuyển đổi mất mát và không mất mát

Một chuyển đổi không mất mát nếu nó có thể đảo ngược : chuyển đổi từ A sang B sang C dẫn đến A = C Nếu không thì việc chuyển đổi bị mất .

Chuyển đổi không mất dữ liệu cho phép chuyển đổi định dạng khứ hồi .

Chuyển đổi từ biểu diễn điểm cố định có 25 bit quan trọng trở xuống sang dấu phẩy động không bị mất dữ liệu. Chuyển đổi từ dấu phẩy động sang bất kỳ biểu diễn điểm cố định thông thường nào đều bị mất mát.