Định dạng lại dữ liệu âm thanh của công cụ âm thanh ở mức độ thấp - Tốc độ lấy mẫu và chuyển đổi độ sâu bit
Trước hết, có vẻ như có một số ít các hướng dẫn lập trình âm thanh cấp thấp trên mạng nên nếu có ai biết về một số tài nguyên tốt, tôi sẽ rất đánh giá cao. Bây giờ đến chủ đề trong tầm tay!
Tôi đang sử dụng WASAPI cho công cụ âm thanh mà tôi đang cố gắng phát triển và tôi đang gặp khó khăn khi định dạng lại dữ liệu tệp âm thanh đã đọc thành định dạng mà thiết bị âm thanh chuẩn bị nhận. Cụ thể là tôi đang tự hỏi làm cách nào để chuyển đổi tốc độ lấy mẫu và độ sâu bit của tệp âm thanh đã đọc thành định dạng được yêu cầu của thiết bị. Tôi đã thấy một ví dụ trong đó nội suy tuyến tính được sử dụng nhưng đọc ở nơi khác rằng một bộ lọc như vậy giới thiệu quá nhiều tạo tác chẳng hạn như răng cưa, vì vậy một lần nữa tôi tự hỏi những thuật toán thực tế nào sẽ dùng để định dạng lại dữ liệu âm thanh trong một ứng dụng thời gian thực.
Trả lời
Phép nội suy Sinc giới thiệu không có tạo tác răng cưa cho dữ liệu ban đầu được giới hạn băng tần thích hợp trước khi lấy mẫu. (Nhưng cần được sửa đổi một chút, vì nhân Sinc hoặc Dirichlet có thời hạn vô hạn.)
Một tài liệu tham khảo kinh điển về lý do tại sao việc tái tạo lại hoạt động và cách nội suy là ở đây: https://ccrma.stanford.edu/~jos/resample/
Tôi có một triển khai đơn giản trong Basic tại đây: http://www.nicholson.com/rhn/dsp.html#3
Phương pháp phổ biến khác là lấy mẫu theo tỷ lệ số nguyên được lọc thông qua thấp, theo sau là lấy mẫu xuống tỷ lệ số nguyên được lọc thông qua thấp theo hai tỷ lệ thích hợp. Một phương pháp phổ biến khác là tạo ngân hàng bộ lọc FIR đa pha (gồm nhiều pha của hạt nhân nội suy Sinc cửa sổ (hoặc các bộ lọc FIR được tối ưu hóa khác). Một phương pháp phổ biến khác là sử dụng các bộ nội suy đa thức của mỗi bướu của hạt nhân Sinc, dẫn đến một ngân hàng bộ lọc Farrow .
Bạn cần mang đủ các bit giá trị trung gian số học để giữ cho tầng nhiễu lượng tử hóa của bạn thấp hơn bất kỳ thông số nào của bạn.