Tôi đang làm việc trên một chương trình điều chỉnh piano và một phần của nó yêu cầu phát hiện cao độ theo thời gian thực. Đây là sơ đồ tôi có cho đến nay hoạt động ở một mức độ nào đó nhưng có thể có thể sử dụng một số tinh chỉnh.
Tôi đang thu âm thanh mono, 44,1kHz, PCM 16 bit trong các khối 2 ^ 14 mẫu. Tôi kết hợp 4 mẫu cuối cùng vào bộ đệm có chiều dài 2 ^ 16, áp dụng cửa sổ Hann cho bộ đệm và chạy FFT trên nó. Sau đó, tôi xô các kết quả của FFT theo hai độ phân giải. Đầu tiên, tôi xô thành 200 thùng và sau đó chạy thuật toán phát hiện bước HPS ở mức độ chi tiết này. Tôi không cần phải có tần suất chính xác ở đây, tôi chỉ muốn đến gần. Sau đó, tôi xô vào 12000 thùng, cho tôi độ phân giải 1 cent từ 10Hz đến 10kHz. Khi tôi biết tần số gần đúng từ thuật toán HPS 200 bin, tôi tìm kiếm phạm vi của trường hợp 12000 bin để tìm đỉnh để có tần số chính xác hơn.
Điều này có vẻ hoạt động tốt cho các ghi chú ở giữa bàn phím. Điều xảy ra với các ghi chú thấp là khoảng 1,5 giây nhận dạng sai của ghi chú vì thường là phần thứ 2 hoặc thứ 3 của ghi chú thực và sau đó là nhận dạng chính xác của ghi chú.
Trong tất cả các ô quang phổ tôi tạo ra để xem những gì đang diễn ra, có nhiều chiều rộng hơn đến các đỉnh mà tôi mong đợi. Chiều rộng này có phần nhất quán trực quan từ trường hợp 200 thùng đến 12000 thùng. Tôi đã dự kiến các đỉnh sẽ hẹp hơn trong trường hợp 200 bin.
Vì vậy, việc xử lý tín hiệu là mới đối với tôi vì vậy có thể có những vấn đề mà tôi không nghĩ sẽ hỏi nhưng về các câu hỏi cụ thể, liệu kích thước mẫu có đủ cho nhiệm vụ này không? Có phải Hann là lựa chọn đúng đắn của cửa sổ? Tôi có nên làm mịn dữ liệu trước FFT không? HPS nhạy cảm như thế nào với số lượng thùng? Tôi đã nghĩ rằng nếu tôi sử dụng nhiều thùng thì tính không điều hòa có thể không làm cho các phần chồng lấp các nguyên tắc cơ bản của chúng với cách tiếp cận đơn giản của thuật toán HPS chia cho 2, 3, 4, v.v.