Cách phân tích đầu vào / phổ âm thanh chính xác


9

Tôi còn khá mới với Java và Xử lý tín hiệu, nhưng tôi được giao một dự án xử lý âm thanh. Chủ đề của tôi được trao cho tôi là một trò chơi có thành phần phân tích một bài hát (bất kỳ bài hát nào) và xuất dữ liệu tùy thuộc vào tần suất hiện đang được phát (thời gian thực). tức là: khi bài hát phát, nó phát ra tần số hiện tại (mỗi giây nó phát ra tần số hiện tại).

Tôi đã được thông báo trên stackoverflow để sử dụng FFT. họ nói "chỉ cần làm một FFT" nhưng điều đó có nghĩa gì với tôi? Làm thế nào để bạn làm một FFT? Tôi đã đọc hướng dẫn và về cơ bản hiểu nó là gì, nhưng không có manh mối về cách thực hiện nó như trong:

  • loại dữ liệu của tệp âm thanh phù hợp nhất để xử lý như vậy là gì?
  • chính xác đầu vào của FFT là gì
  • làm thế nào để tôi giải thích kết quả

Bất cứ ai cũng có thể đề nghị một cách đơn giản để làm theo hướng dẫn / hướng dẫn về cách xử lý tín hiệu âm thanh? Ngoài ra, nếu bất cứ ai biết triển khai tốt FFT cho Java, tôi sẽ đánh giá cao các đề xuất.


2
Câu hỏi này dường như lạc đề vì nó là về các mảng Java cơ bản, các kiểu dữ liệu và đọc các tệp.
hotpaw2

1
Họ nói tôi phải hỏi ở đây vì nó phải làm với Xử lý tín hiệu
user3241507

Chỉ phần cuối của câu hỏi của bạn dường như là về DSP. Hãy thử loại bỏ 2 hoặc 3 phần đầu tiên để có chủ đề ở đây.
hotpaw2

Câu trả lời:


8

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.


5

Nếu bạn đủ tốt với JAVAbạn, bạn có thể sử dụng JTRANSFORMS một thư viện java FFTcó thể giúp bạn

và bởi nhu cầu của bạn, nó có vẻ như một

nhập mô tả hình ảnh ở đây

Trực quan hóa âm nhạc bằng API âm thanh Java

Trực quan hóa âm nhạc bằng cách sử dụng FFT trong Ruby trong 7Steps

bạn có thể làm theo các bước đơn giản theo yêu cầu của bạn:

* Làm quen với một số thuật ngữ âm thanh

1.Đọc Khung chơi (Giả sử 20-30ms), kích thước khung hình của bạn phụ thuộc vào giả sử bạn sampling ratecho biết bạn đang sử dụng tốc độ lấy mẫu 8000 và mỗi mẫu là 16bit signed little endian, sau đó khung hình 20ms của bạn sẽ là 160 mẫu

Lưu ý: cố gắng phát một rawtệp không phải là mp3tệp nén .

2. Thực hiện Khung dữ liệu thô và thực hiện FFT

3. Định dạng đúng Windowing

Kết quả FFT đầu ra của bạn sẽ có hai thành phần thực và phức tạp cố gắng lấy một biểu đồ cường độ từ nó, chỉ là absolutegiá trị của thành phần phức tạp, đỉnh của bạn mang lại cho bạndominant frequency

5. có một cái nhìn vào các hướng dẫn đơn giản như dưới đây

Hướng dẫn tốt về FFT

Hướng dẫn kỹ sư về FFT

Hướng dẫn FFT

Xem qua FFT

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.