Nhớ lại rằng các cột của W có thể được coi là các vectơ "cơ sở" (hoặc các phần tử của từ điển - các khối xây dựng của bất kỳ tín hiệu nào) và các phần tử trong mỗi cột trong Hcho các trọng số tương ứng (thay đổi theo thời gian). Điều này cho phép chúng tôi phân tách phổ dựa trên không chỉ các thành phần tần số mà cả thông tin khởi phát theo thời gian; vì vậy nó làm được nhiều hơn những gì bộ lọc thông dải hoặc bộ lọc lược đơn giản sẽ làm.
Hệ số ma trận không âm của một quang phổ sẽ không tách biệt một cách kỳ diệu một cây đàn piano và một ca sĩ hát trong cùng một cao độ. Tuy nhiên, nó mang lại một xấp xỉ hữu ích về tổng các vectơ cơ sở có trọng số mà (hy vọng) có thể được chia thành các đóng góp từ các nguồn khác nhau vì mỗi nguồn không thể chiếm chính xác cùng một tần số cùng một lúc.
Cụ thể hơn, hãy để V là M× N, W là M× K và H là K× N. Vì vậy chúng tôi cóM thùng tần số, N mẫu thời gian và Kthành phần bị phân hủy. NếuwTôi là các cột của W và hTôi là những hàng của H chúng tôi có thể viết:
V ≈Σi = 1KwTôihTTôi.
Nếu chúng ta biết chỉ có hai nguồn trong bản ghi âm (piano và ca sĩ), chúng ta có thể cố gắng phân chia các đóng góp của họ bằng cách chọn các tập hợp con của các cột
W và tập hợp con tương ứng của các hàng
H. Vì vậy nếu
S⊂ { 1 , ... , K} sau đó phần đóng góp của piano có thể được ký hiệu là:
Vđàn piano= =Σi ∈ SwTôihTTôi
và phần đóng góp của ca sĩ là:
Vca sĩ= =Σi ∈ { 1 , ... , K} ∖ SwTôihTTôi
Trong thực tế, chúng ta có thể sẽ kết thúc bằng một sự phân tách không bao giờ đạt được sự phân tách này một cách chính xác. Đó là, sẽ cówTôiĐó là sự đóng góp của cả ca sĩ và piano khiến việc tách hai người trở nên khó khăn.
Đây là một sổ ghi chép Python hiển thị quy trình này cho hỗn hợp trống và guitar: http://nbviewer.jupyter.org/gist/ingle/93de575aac6a4c7fe9ee5f3d5adab98f (Hoặc nếu nó không hoạt động, tại đây: https://gist.github.com / ingle / 93de575aac6a4c7fe9ee5f3d5adab98f )
Lưu ý rằng thuật toán NMF chỉ tạo ra một phép phân tách. Nó không thể chọn tập hợp con của{wTôi}tương ứng với từng nguồn. Trong ví dụ Python, có một bước thủ công để tìm rawTôiÂm thanh giống như trống v / s guitar. Có lẽ người ta có thể tự động hóa bước này bằng cách lưu ý rằng trốngwTôi vectơ có nhiều thứ ở tần số thấp hơn.
Phân tích từng cột (khung) của biểu đồ phổ bằng cách sử dụng bộ lọc băng thông là một cách khác để phân tách phổ. Tuy nhiên, lưu ý rằng sự phân rã được tạo ra bởi NMF là thứ hạng thấp tức là phân tích kỹ lưỡng. Trong ví dụ Python, việc chọn thủ công các tập hợp con của 16 cột là dễ dàng hơn nhiềuWtương ứng với hai nguồn. Với một bộ lọc băng thông, chúng tôi sẽ phải xoay nhiều nút hơn (# bộ lọc, vị trí của các dải thông cho mỗi khung hình) và số lượng kết hợp tham số có thể tăng rất nhanh.
Người giới thiệu:
https://ccrma.stanford.edu/~njb/teaching/sstutorial/part2.pdf
http://musicin informationretriny.com/nmf.html