Hãy xem nào. Tôi không biết về các lớp Java hoặc loại hỗ trợ nào để xử lý tín hiệu, nhưng tôi sẽ cung cấp cho bạn một số hướng dẫn. Các chi tiết cụ thể của việc thực hiện trong ngôn ngữ, bạn phải tìm ra.
Để thực hiện bất kỳ loại xử lý nào trên tệp âm thanh, bạn cần dữ liệu "thô", nghĩa là tệp âm thanh có các mẫu âm thanh không nén. Đối với exmaple, định dạng WAV, thường có các mẫu trong phần bổ sung 2 bit có chữ ký 16 bit.
Nếu bạn định sử dụng máy tính và xử lý ngoại tuyến, có thể là một ý tưởng tốt để tăng giá trị đó lên gấp đôi (trong hầu hết các bộ xử lý ngày nay có nghĩa là số dấu phẩy động 64 bit).
Do đó, bạn sẽ có một luồng liên tục gồm hai số đến từ tệp. Sau đó, bạn cần xác định một cách để xử lý dữ liệu liên tục. Một cách tiêu chuẩn, được sử dụng rất rộng rãi là sử dụng bộ đệm tròn (ngay cả khi ngoại tuyến, tôi giả sử bạn muốn mã của mình hoạt động hiệu quả và tải toàn bộ tệp vào bộ nhớ vì một mảng không phải là giải pháp tốt nhất). Hoặc đó hoặc chỉ là một bộ đệm bình thường, là sự lựa chọn của bạn. Độ dài bộ đệm phải là lũy thừa bằng 2 (Do hiệu quả của thuật toán Cooley-Tukey radix-2).
Bây giờ bạn cần phải làm FFT thực tế. Đây chỉ đơn thuần là một bội số của bộ đệm (mà về mặt toán học là một vectơ) theo ma trận FFT. Làm thế nào hoạt động này thực sự được thực hiện trong Java, không có ý tưởng. Trong C, chỉ cần truyền con trỏ tới mảng và độ dài cho một thường trình FFT, sẽ trả về một con trỏ tới bộ nhớ được phân bổ theo phương thức, hoặc để lại kết quả trong một mảng mà bạn truyền cho nó.
cuối cùng, bạn đến một mảng gồm các số phức M (Giả sử độ dài của mảng / bộ đệm / vectơ với tín hiệu là M). Và sau đó bạn làm bất cứ điều gì bạn muốn với nó.
Chẳng hạn, bạn có thể lấy độ lớn của từng số phức và tìm mức tối đa, để phát hiện nơi có tần số cơ bản (mặc dù rất gần đúng).
Ngoài ra: Các kỹ thuật nâng cao hơn để xử lý sẽ bao gồm một cửa sổ trước để tránh rò rỉ, thực hiện đệm không để có được độ phân giải cao hơn trên phổ cửa sổ, v.v.
Hy vọng nó giúp.