2012-10-23 36 views
6

Tôi tự hỏi làm cách nào để có được thông tin về âm nhạc như biên độ từ tệp âm thanh?Lấy mẫu sóng của tệp âm thanh trong Java

Giả sử chúng tôi có tệp âm thanh thô, những gì tôi muốn trích xuất dữ liệu từ tệp cho phép tôi tạo đường cong chẳng hạn như http://www1.icsi.berkeley.edu/Speech/mr/nearfar.html. Một khi tôi đã thu được đường cong này, tôi sẽ thực hiện FFT vv

enter image description here

Tôi đã cố gắng để tìm kiếm các giải pháp trong Java Sound, nhưng những gì tôi chỉ biết cho đến nay là tôi có thể đổ dữ liệu vào byte[] sử dụng AudioInputStream. Nhưng làm thế nào để dịch rằng byte[] thành một double[] có chứa thông tin thực tế về âm thanh? Trong trường hợp này, các giá trị trong double[] thể hiện biên độ .

Có ai vui lòng cung cấp giải pháp để giải quyết vấn đề này trong Java không?

Trả lời

5

file wav điển hình là 16 bit little endian, vì vậy bạn có thể uống mỗi hai byte liên tiếp, b1 và b2, và nhận được biên độ như sau:

(double) (b2 << 8 | b1 & 0xFF)/32767.0; 

nếu đầu vào là âm thanh stereo, hai byte đầu tiên sẽ là kênh bên trái, sau đó là hai byte cho kênh phù hợp.

+0

tất nhiên, trước tiên bạn cần phải đọc qua tiêu đề. –

+2

@BjornRoche: OP nói về việc sử dụng 'AudioInputStream', nó bỏ qua tiêu đề và chỉ cung cấp các byte PCM hợp lệ. –

+0

Rất tiếc. Bạn đúng, xin lỗi. –

Các vấn đề liên quan