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 của những định dạng 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).
Đặc tính
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 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 không mất dữ liệu, trong khi MP3 và AAC là định dạng nén mất dữ liệu.
- Độ 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ột mẫu. Thông thường điều 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ột mẫu 24 bit có thể được chứa trong một 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, biểu diễn được gọi là đóng gói . Nếu không, 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 ngoài cùng bên phải (ít quan trọng nhất) của vùng chứa. Thông thường chỉ sử dụng các thuật ngữ được đóng gói và giải nén khi độ sâu bit không phải là lũy thừa của hai .
- Ký
- Cho dù các mẫu có chữ ký hay không dấu.
- Đại diện
- Dấu chấm cố định 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à đại diện phổ biến nhất cho dữ liệu âm thanh PCM không nén, đặc biệt là tại các giao diện phần cứng.
Một số điểm cố định có một số chữ số cố định (không đổi) trước và sau điểm cơ số . Tất cả các biểu diễn của chúng tôi sử dụng cơ số 2 , vì vậy chúng tôi thay thế bit cho chữ số và điểm nhị phân hoặc chỉ đơn giản là trỏ cho điểm 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 tôi nói về PCM số nguyên , 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 như điểm cố định là ngầm định.
Chúng tôi sử dụng phần bổ sung của hai cho tất cả các biểu diễn điểm cố định đã ký, do đó, các giá trị sau đây giữ nguyên trong đó tất cả các giá trị đều theo đơ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 tôi sử dụng ký hiệu Q: Q m . n có nghĩa là m bit 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ù của hai. Tổng số bit là m + n + 1.
U m . n dành cho các số không có dấu: m bit nguyên và n bit phân số, và chữ "U" được tính là bit 0. Tổng số bit là m + n .
Phần số 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 tính toán trung gian tràn, miễn là giá trị cuối cùng nằm trong phạm vi hoặc có thể được kẹp 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 chấm động
Dấu chấm động 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 và phạm vi động lớn hơn ; số học dấu phẩy động dung sai vượt quá phạm vi danh định 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ư số nguyên 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, miễn là các quyết định về luồng điều khiển không dựa trên giá trị của một phép tính.
Định dạng Android cho âm thanh
Các định dạng âm thanh chính của Android được liệt kê trong bảng dưới đây:
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 | |
Phòng đầu 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ó một giá trị âm hơn giá trị dương do biểu diễn phần bù của hai giá trị đó.
Chú thích:
- Tất cả các định dạng ở trên giá trị mẫu có chữ ký rõ ràng. Định dạng 8-bit thường được gọi là "không dấu", nhưng nó thực sự là một giá trị có dấu với độ lệch là
0.10000000
. - Q0.23 có thể được đóng gói thành 24 bit (ba byte 8 bit, little-endian) hoặc được giải nén thành 32 bit. Nếu được giải nén, các bit quan trọng được căn phải về phía LSB với phần đệm mở rộng dấu hiệu về phía MSB (Q8.23), hoặc căn trái về phía MSB với không điền về phía LSB (Q0.31). Về mặt lý thuyết, Q0.31 cho phép tối đa 32 bit quan trọng, 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.
- Dấu phẩy động 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ố bất thường có ít bit quan trọng hơn.
- Dấu chấm động chính xác đơn có thể thể hiện giá trị lên đến ± 1,7e + 38, điều này giải thích cho khoảng không lớn.
- Phạm vi động được hiển thị dành cho các giá trị lên đến giá trị lớn nhất danh nghĩa ± 1,0. Lưu ý rằng một số triển khai dấu phẩy động theo kiến trúc cụ thể như NEON không hỗ trợ giá trị ký hiệu.
Chuyển đổi
Phần này thảo luận về chuyển đổi dữ liệu giữa các đại diện khác nhau.
Chuyển đổi dấu chấm động
Để chuyển đổi một giá trị từ Q m . định dạng n thành dấu phẩy động:
- Chuyển đổi giá trị thành dấu phẩy động như thể nó là một số nguyên (bằng cách bỏ qua dấu chấm).
- Nhân với 2 - n .
Ví dụ: để chuyển đổi giá trị nội bộ 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 chấm cố định tuân theo các quy tắc sau:
- Dấu phẩy động chính xác đơn có phạm vi danh định là ± 1.0, nhưng phạm vi đầy đủ cho các giá trị trung gian là ± 1.7e + 38. Việc chuyển đổi giữa dấu phẩy động và điểm cố định cho 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 định, với 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ó sẽ được gắn vào +1.0 trừ đi một LSB.
- Denormals (subnormals) và cả +/- 0.0 đều được phép trong 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 số vô hạn sẽ chuyển qua các phép toán hoặc sẽ được giới hạn âm thầm ở mức +/- 1.0. Nói chung, cái sau là để chuyển đổi sang định dạng điểm cố định.
- Hành vi của NaN là không xác định: một NaN có thể lan truyền như một NaN giống hệt nhau hoặc có thể được chuyển đổi thành NaN mặc định, có thể bị giới hạn âm thầm ở mức +/- 1,0 hoặc được chuyển đổi âm thầm thành 0,0 hoặc dẫn đến 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 tăng m , dấu mở rộng phần nguyên ở bên trái.
- Khi m giảm, kẹp phần nguyên.
- Khi n được tăng lên, không mở rộng phần phân số ở bên phải.
- Khi giảm n , hòa sắc, 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 thành Q0.15 (không hòa sắc hoặc làm tròn), hãy dịch sang phải giá trị Q4.27 bằng 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 sắp xếp điểm của biểu diễn Q.
Để chuyển 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 đó chuyển sang phải có dấu cho 1. Lưu ý rằng một phép chuyển phải có dấu đơn giản không tương đương với một phép chia có dấu cho 2.
Chuyển đổi mất dữ liệu và không mất dữ liệu
Một chuyển đổi là không mất mát nếu nó có thể đảo ngược : chuyển đổi từ A
sang B
thành C
dẫn đến A = C
Nếu không, quá trình chuyển đổi bị mất mát .
Chuyển đổi không mất phí cho phép chuyển đổi định dạng khứ hồi .
Các chuyển đổi từ biểu diễn điểm cố định có 25 bit quan trọng trở xuống thành dấu phẩy động là không mất dữ liệu. Các chuyển đổi từ dấu phẩy động sang bất kỳ biểu diễn điểm cố định chung nào đều bị mất.