Tìm nhạc tương tự bằng FFT Spectrums


16

Tôi đã thử nghiệm vài tuần để tìm cách khớp / tìm các bài hát tương tự trong Thư viện chứa các Thể loại Âm nhạc khác nhau.

Thử nghiệm đầu tiên của tôi là Phát hiện các Tính năng như Tempo hoặc có bao nhiêu Bass trong các Bài hát để tạo thành các nhóm, nhưng tôi đã không đi xa được với cách tiếp cận này (Phát hiện nhịp thay đổi dựa trên âm lượng) vì khoảng 20% ​​các bài hát Beat không cần phải tính luôn luôn, đôi khi 1/2 hoặc 1/3 trong số họ và tôi không thể thực hiện điều đó.

Sau vài tuần thử thất bại, tôi đã có một ý tưởng mới được mô tả sau trong Bài viết này. Đơn giản chỉ cần đặt nó hoạt động bằng cách lấy Spectrum Samples of Files, tạo một cái gì đó giống như "Phổ trung bình" của Tệp để so sánh chúng. Ý tưởng đằng sau là ví dụ Hardstyle có nhiều Bass hơn so với Rock Music trung bình, tôi cũng đã xác minh điều này bằng cách xem xét một số Spectrum trong Audacity.

  • Tệp 1: Lấy toàn bộ phổ FFT tệp (2048 Cỡ mẫu atm, Nhật ký biên độ. Thu nhỏ)
  • Tính tổng tất cả các mảng phổ, lấy trung bình của mỗi thùng
  • Thực hiện tương tự một số Tệp khác, lưu trữ tất cả Kết quả
  • Lập danh sách các giá trị FFT khác biệt giữa tệp 1 và các tệp khác
  • Tạo trung bình chênh lệch giữa tệp 1 và tệp X
  • Sắp xếp tăng dần theo các mức trung bình này
  • Các bài hát có "Giá trị khác biệt" thấp nhất được coi là Tương tự.

Một số bạn có kiến ​​thức tốt có thể cho tôi biết nếu đây sẽ là cách đúng / tốt để thực hiện Ý tưởng của tôi không?


1
Nếu bạn đang cố gắng phát hiện nhịp độ, bạn có thể muốn thử bình phương tín hiệu và sau đó thực hiện chuyển đổi Fourier. Các tần số theo thứ tự 1 Hz sẽ không xuất hiện trong phổ FFT thông thường (không yêu cầu), vì chúng được lọc ra. Một ý tưởng liên quan, được sử dụng để phát hiện cao độ, được gọi là "cepstrum;" bạn có thể tìm hiểu về nó bằng cách googling. Để phân biệt nhạc pop và jazz với nhạc cổ điển, bạn có thể thử phát hiện âm thanh của bộ trống không bị tách rời. Máy rung nên được phát hiện bằng máy. Có các biện pháp bất hòa có thể được tính toán bằng máy.

1
Có lẽ bạn nên yêu cầu người điều hành chuyển cái này sang dsp.SE
Dilip Sarwate

Tôi đánh dấu câu hỏi của mình với yêu cầu chuyển nó sang DSP của SE. Ý bạn là tôi có thể phát hiện nếu có Drumkit Present hay Not để phân loại Input? Bạn có thể giải thích làm thế nào tín hiệu bình phương dẫn đến Tempo?

3
Âm nhạc được ghi lại và làm chủ theo những cách như vậy để tối đa hóa sự phổ biến của chúng, đặc biệt là những ngày này. Tôi không nghĩ rằng quang phổ đầy đủ sẽ cung cấp cho bạn một tiêu chí tốt để phân loại nhạc.
Phonon

2
Thay vì phổ, bạn nên nhìn vào phổ. Phổ chỉ hiển thị cho bạn nội dung tần số của toàn bộ bài hát cùng một lúc. Các biểu đồ phổ cho thấy nội dung tần số thay đổi theo thời gian như thế nào.
endolith

Câu trả lời:


17

Những gì bạn đang cố gắng làm đã được cố gắng lặp đi lặp lại bởi hàng trăm nhà nghiên cứu và có khá nhiều công việc lớn về việc này. Kiểm tra các thủ tục tố tụng của hội nghị ISMIR. Ngay cả khi nó không cập nhật, hãy đọc luận án của Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Để nhanh chóng định hướng bạn đi đúng hướng:

Âm nhạc có thể giống nhau theo nhiều chiều: a) âm sắc / kết cấu / thể loại; b) mẫu nhịp điệu; c) giai điệu / tiến trình hợp âm ... và hơn thế nữa! Từ tin nhắn của bạn, không rõ bạn muốn đo lường điều gì!

  • Nếu bạn quan tâm đến a) các tính năng bạn có thể muốn xem là MFCC (Hệ số cepstrum Mel Tần số), vì chúng bằng cách nào đó nắm bắt cách thức hoạt động của thính giác của con người (cong vênh tần số, thang đo log), vì chúng bị phân rã (làm cho việc mô hình hóa dễ dàng hơn) và vì chúng có kích thước thấp hơn (13 hệ số so với 2048).
  • Nếu bạn quan tâm đến b), hãy xem một tính năng gọi là "Mô hình biến động" (Pampalk, trong tự động tương quan ngắn của tín hiệu trong dải 0,1 .. 10 Hz trên một vài dải); hoặc các tính năng "Penny" của Whitman (FFT của MFCC dọc theo trục thời gian).
  • Nếu bạn quan tâm đến c), hãy nhìn vào chromagram. Bắt đầu với mã chromagram của Ellis (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) sau đó chuyển sang triển khai Mauch nếu bạn cần thứ gì đó mạnh mẽ hơn (http://isophonics.net/nnls-chroma ).

Đó là cho các tính năng. Bây giờ bạn sẽ phải nghĩ ra một cách tốt hơn để so sánh các bài hát của mình một khi chúng được thể hiện dưới dạng một chuỗi các tính năng đó. Tính toán sự khác biệt theo cặp giữa các chuỗi không phải là rất thông minh - ví dụ: so sánh một bài hát và cùng một bài hát được bù đắp bằng một khoảng im lặng sẽ mang lại sự khác biệt trong khi nó hoàn toàn giống nhau! Bạn muốn so sánh việc phân phối các tính năng đó; ví dụ: tính độ lệch trung bình / độ lệch chuẩn của các tính năng so với bài hát A và độ lệch trung bình / độ lệch chuẩn của các tính năng so với bài hát B và sau đó lấy khoảng cách xác suất (KL, Bhattacharyya so với các tính năng đó).

Điểm cuối cùng, nhưng sẽ có vấn đề sau: tính toán khoảng cách giữa một bài hát và phần còn lại để tìm các trận đấu gần nhất là không hiệu quả. Khi xử lý các bộ sưu tập lớn, các kỹ thuật như cây LSH hoặc Ball cho phép các truy vấn lân cận gần nhất được thực hiện mà không cần so sánh rõ ràng với toàn bộ kho văn bản.

Bên cạnh đó, phát hiện tiến độ là một vấn đề hoàn toàn khác. Nếu bạn muốn xem xét nó, bài viết về khả năng truy cập / hiệu suất tốt nhất về chủ đề này là Theo dõi nhịp đập của Ellis bằng lập trình động. http://www.ee.columbia.edu/~dpwe/pub/Ellis07-beattrack.pdf . Nó cực kỳ đơn giản nhưng gần với các thuật toán nghệ thuật.


Cảm ơn câu trả lời chi tiết của bạn, tôi đã nghe nói về MFCC nhiều lần trong bối cảnh này và có vẻ hợp lý khi không sử dụng Kết quả FFT trần. Có vẻ khá phức tạp khi thực hiện với "trạng thái kiến ​​thức" và môi trường phát triển hiện tại của tôi (C #, Kết quả FFT của Thư viện Bass) nhưng tôi sẽ thử.
gfg
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.