Lấy mẫu âm thanh

Kể từ Android 5.0 (Lollipop), bộ lấy mẫu lại âm thanh hiện hoàn toàn dựa trên bộ lọc FIR lấy từ hàm cửa sổ sinc Kaiser. Hàm cửa sổ sinc Kaiser có các thuộc tính sau:

  • Các tham số thiết kế của hàm (dải dừng gợn sóng, băng thông chuyển tiếp, tần số giới hạn, chiều dài bộ lọc) rất dễ tính toán.
  • Đây là hàm gần như tối ưu để giảm năng lượng dải dừng so với năng lượng tổng thể.

Xem Hệ thống đa tốc độ và ngân hàng bộ lọc của PP Vaidyanathan, trang 50, để biết nội dung thảo luận về Kaiser Window và khả năng tối ưu hoá cũng như mối quan hệ với Prolate Spheroidal Window.

Các tham số thiết kế được tự động tính toán dựa trên việc xác định chất lượng nội bộ và tỷ lệ lấy mẫu mong muốn. Dựa trên tham số thiết kế, bộ lọc cửa sổ sinc được tạo. Để sử dụng nhạc, bộ lấy mẫu lại cho khoảng từ 44,1 đến 48 kHz và ngược lại được tạo ở chất lượng cao hơn so với chuyển đổi tần số tuỳ ý.

Bộ lấy mẫu lại âm thanh cung cấp chất lượng cao hơn, cũng như tốc độ để đạt được chất lượng đó. Tuy nhiên, bộ lấy mẫu lại có thể gây ra hiệu ứng gợn sóng dải thông nhỏ và tiếng ồn hoà âm chồng phổ, đồng thời có thể gây ra mức mất tần số cao trong dải chuyển tiếp nên bạn cần tránh sử dụng khi không cần thiết.

Phương pháp hay nhất để lấy mẫu và lấy mẫu lại

Phần này mô tả một số phương pháp hay nhất giúp bạn tránh các vấn đề về tốc độ lấy mẫu.

Chọn tốc độ lấy mẫu cho phù hợp với thiết bị

Nhìn chung, tốt nhất là bạn nên chọn tốc độ lấy mẫu cho phù hợp với thiết bị, thường là 44,1 kHz hoặc 48 kHz. Việc sử dụng tốc độ lấy mẫu lớn hơn 48 kHz thường dẫn đến chất lượng giảm sút vì bạn phải sử dụng bộ lấy mẫu lại để phát lại tệp.

Sử dụng tỷ lệ lấy mẫu lại đơn giản (nhiều pha cố định so với nhiều pha nội suy)

Bộ lấy mẫu lại hoạt động ở một trong các chế độ sau:

  • Chế độ nhiều pha cố định. Hệ số bộ lọc cho mỗi chế độ nhiều pha được tính trước.
  • Chế độ nhiều pha nội suy. Hệ số bộ lọc cho mỗi chế độ nhiều pha phải được nội suy từ 2 pha tính trước gần nhất.

Bộ lấy mẫu lại hoạt động nhanh nhất ở chế độ nhiều pha cố định, khi tỷ lệ tốc độ đầu vào so với tốc độ đầu ra L/M (lấy ước số chung lớn nhất) có M nhỏ hơn 256. Ví dụ: Đối với khoảng chuyển đổi từ 44.100 đến 48.000, L = 147, M = 160.

Ở chế độ nhiều pha cố định, tốc độ lấy mẫu bị khoá và không thay đổi. Ở chế độ nhiều pha nội suy, tốc độ lấy mẫu là gần đúng. Khi phát trên thiết bị 48 kHz, độ trôi của tốc độ lấy mẫu thường sẽ là một mẫu trong vài giờ. Đây thường không phải là vấn đề cần lo lắng vì sai số xấp xỉ nhỏ hơn nhiều so với lỗi tần số do máy dao động tinh thể thạch anh bên trong, độ trôi nhiệt hoặc dao động (thường là hàng chục ppm).

Chọn tốc độ lấy mẫu có tỷ lệ đơn giản như 24 kHz (1:2) và 32 kHz (2:3) khi phát trên thiết bị 48 kHz, mặc dù các tốc độ và tỷ lệ lấy mẫu khác có thể được phép thông qua AudioTrack.

Dùng phương pháp tăng tần số lấy mẫu thay vì giảm tần số lấy mẫu để thay đổi tốc độ lấy mẫu

Bạn có thể nhanh chóng thay đổi tốc độ lấy mẫu. Độ chi tiết của thay đổi đó dựa trên việc lưu vào bộ đệm nội bộ (thường là vài trăm mẫu), không phải trên cơ sở từng mẫu. Bạn có thể sử dụng khả năng này để tạo hiệu ứng.

Đừng tự động thay đổi tốc độ lấy mẫu khi giảm tần số lấy mẫu. Khi thay đổi tốc độ lấy mẫu sau khi tạo bản âm thanh, mức chênh lệch khoảng 5 đến 10% so với tốc độ ban đầu có thể kích hoạt việc tính toán lại bộ lọc lúc giảm tần số lấy mẫu (để ngăn chặn tình trạng chồng phổ đúng cách). Hậu quả có thể là tốn nhiều tài nguyên tính toán và tạo ra tiếng lách cách có thể nghe thấy nếu bộ lọc được thay thế theo thời gian thực.

Giới hạn việc giảm tần số lấy mẫu ở mức không quá 6:1

Việc giảm tần số lấy mẫu thường bắt nguồn từ yêu cầu về thiết bị phần cứng. Khi dùng công cụ chuyển đổi Tốc độ lấy mẫu để giảm tần số lấy mẫu, hãy cố gắng giới hạn tỷ lệ giảm tần số lấy mẫu ở mức không quá 6:1 để giảm tình trạng chồng phổ hiệu quả (ví dụ: không giảm tần số lấy mẫu lớn hơn 48.000 đến 8.000). Độ dài bộ lọc điều chỉnh cho phù hợp với tỷ lệ giảm tần số lấy mẫu, nhưng bạn phải chấp nhận mất nhiều băng thông chuyển đổi hơn ở tỷ lệ giảm tần số lấy mẫu cao hơn để tránh tăng quá mức độ dài bộ lọc. Việc tăng tần số lấy mẫu không có mối lo ngại tương tự liên quan đến tình trạng chồng phổ. Lưu ý: Một số phần của quy trình âm thanh có thể ngăn tỷ lệ giảm tần số lấy mẫu lớn hơn 2:1.

Nếu lo ngại về độ trễ, bạn không nên lấy lại mẫu

Phương pháp lấy mẫu lại ngăn bản nhạc bị đưa vào đường dẫn FastMixer, nghĩa là độ trễ cao hơn đáng kể do có thêm khoảng đệm lớn hơn trong đường dẫn Mixer thông thường. Hơn nữa, độ dài bộ lọc của bộ lấy mẫu lại có độ trễ ngầm, mặc dù tình trạng này thường xuất hiện theo thứ tự 1 mili giây trở xuống, tức là không lớn như bộ đệm bổ sung cho đường dẫn Mixer thông thường (thường là 20 mili giây).

Sử dụng âm thanh dấu phẩy động

Việc sử dụng số dấu phẩy động để biểu thị dữ liệu âm thanh có thể cải thiện đáng kể chất lượng âm thanh trong các ứng dụng âm thanh hiệu suất cao. Dấu phẩy động mang lại những lợi thế sau:

  • Dải động rộng hơn.
  • Độ chính xác nhất quán trên dải động.
  • Mức trần cao hơn giúp tránh tình trạng vỡ âm thanh (clipping) trong quá trình tính toán trung gian và chuyển tiếp.

Mặc dù dấu phẩy động có thể nâng cao chất lượng âm thanh, nhưng cũng có một số nhược điểm nhất định:

  • Số dấu phẩy động sử dụng nhiều bộ nhớ hơn.
  • Ví dụ: Hoạt động dấu phẩy động sử dụng các thuộc tính không mong muốn, chẳng hạn như phần thêm vào không liên kết.
  • Các phép tính dấu phẩy động đôi khi có thể làm mất độ chính xác về mặt số học do các thuật toán làm tròn hoặc không ổn định về mặt số học.
  • Để sử dụng dấu phẩy động hiệu quả, bạn cần hiểu rõ hơn nhằm đạt được kết quả chính xác và có thể tái lập.

Trước đây, mọi người biết đến dấu phẩy động vì hai đặc điểm: không hoạt động hoặc hoạt động chậm. Điều này vẫn đúng đối với các bộ xử lý cấp thấp và dạng nhúng. Tuy nhiên, các bộ xử lý trên thiết bị di động hiện đại có dấu phẩy động phần cứng với hiệu suất tương tự (hoặc thậm chí nhanh hơn trong một số trường hợp) so với số nguyên. CPU hiện đại cũng hỗ trợ SIMD (Một hướng dẫn, nhiều dữ liệu), giúp cải thiện hiệu suất hơn nữa.

Các phương pháp hay nhất cho âm thanh dấu phẩy động

Các phương pháp hay nhất sau đây sẽ giúp bạn tránh được vấn đề trong phép tính dấu phẩy động:

  • Sử dụng dấu phẩy động có độ chính xác gấp đôi cho các phép tính không thường xuyên, chẳng hạn như hệ số bộ lọc tính toán.
  • Chú ý đến thứ tự của các phép toán.
  • Khai báo biến rõ ràng cho các giá trị trung gian.
  • Thoải mái sử dụng dấu ngoặc đơn.
  • Nếu bạn nhận được kết quả NaN hoặc vô cực, hãy sử dụng tính năng tìm kiếm nhị phân để tìm vị trí kết quả được đưa ra.

Đối với âm thanh dấu phẩy động, phương thức mã hoá định dạng âm thanh AudioFormat.ENCODING_PCM_FLOAT được sử dụng tương tự như ENCODING_PCM_16_BIT hoặc ENCODING_PCM_8_BIT để chỉ định định dạng dữ liệu AudioTrack. Phương thức nạp chồng tương ứng AudioTrack.write() sử dụng một mảng dấu phẩy động để phân phối dữ liệu.

Kotlin

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

Java

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

Thông tin khác

Phần này liệt kê một số tài nguyên khác về lấy mẫu và dấu phẩy động.

Lấy mẫu

Tốc độ lấy mẫu

Lấy mẫu lại

Tranh cãi về độ sâu bit cao và kHz cao

Dấu phẩy động

Các trang Wikipedia sau đây giúp bạn hiểu về âm thanh dấu phẩy động:

Bài viết sau đây cung cấp thông tin về các khía cạnh của dấu phẩy động có tác động trực tiếp đến nhà thiết kế hệ thống máy tính: