NMF应用示例
对于一个混合语音,如鼓点和管乐器混合的单通道声音,可以利用非负矩阵进行分解,实现语音信号的分离。
思路:
语音的时频分析,得到的语谱图是一个二维数据矩阵,其中鼓点、管乐器的概率分布不同,利用NMF可以实现信号的分离。
对应代码(NMF调用上面任何一个都可以):
% Read in audio file
[x0 fs] = audioread('test_audio.wav');
x = x0(1:5*fs);%read 5s wav
nw = 1024;
ni = 256;
X = fft(enframe(x,nw,ni)');
V = abs(X);
% NMF
K = 2; % number of basis vectors
MAXITER = 200; % total number of iterations to run
[W, H] = nmf(V, K, MAXITER);
% get the mixture phase
phi = angle(X);
%Reconstruct
X1 = W(:,1)*H(1,:);
X2 = W(:,2)*H(2,:);
s1 = zeros(1,length(x));
s2 = zeros(1,length(x));
for i = 1:size(X1,2)
nic = (1+(i-1)*ni):(nw+(i-1)*ni);
s1(1,nic) = s1(1,nic)+real(ifft(X1(:,i).*exp(1j*phi(:,i))))';
s2(1,nic) = s2(1,nic)+real(ifft(X2(:,i).*exp(1j*phi(:,i))))';
end
s1 = s1/max(abs(s1));
s2 = s2/max(abs(s2));
可以看出这里K是给定的,即NMF实现分解需要给出先验的类别数。这里给出语谱图,图片可以更加直观地观察分离效果,结果图:
看看时域的分离效果: