最近在看有关阵列信号处理的知识,无意中看到吴恩达的机器学习课上有这样一行代码:[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x’);
看到的时候并没有什么感觉,有一天想自己实现一下的时候发现原来跟MIMO还有点关系。但是由于没有两个麦克风,而且比较懒不想仿真,所有网上搜了下代码,如下(链接https://stackoverflow.com/questions/20414667/cocktail-party-algorithm-svd-implementation-in-one-line-of-code):
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[x1, Fs1] = audioread('mix1.wav');%两个麦克风分别收到的混叠信号 [x2, Fs2] = audioread('mix2.wav'); xx = [x1, x2]'; yy = sqrtm(inv(cov(xx')))*(xx-repmat(mean(xx,2),1,size(xx,2)));%个人认为是一个归一化的过程 [W,s,v] = svd((repmat(sum(yy.*yy,1),size(yy,1),1).*yy)*yy');%奇异值分解,找到特征向量 a = W*xx; %将两个混叠信号跟特征向量相乘,得到投影后的两个音频向量 subplot(2,2,1); plot(x1); title('mixed audio - mic 1'); subplot(2,2,2); plot(x2); title('mixed audio - mic 2'); subplot(2,2,3); plot(a(1,:), 'g'); title('unmixed wave 1'); subplot(2,2,4); plot(a(2,:),'r'); title('unmixed wave 2'); audiowrite('unmixed1.wav', a(1,:), Fs1); audiowrite('unmixed2.wav', a(2,:), Fs1);
图可以到链接上看到,这个算法需要有两个距离不同的接收器对信号进行接收(本人一开始还傻傻的只用一个音频做)。本质上是算出两个音频的相关性,然后得到分离的信号。
最后
以上就是体贴小猫咪最近收集整理的关于关于在吴恩达的课上看到的奇异值分解实现音频分离的全部内容,更多相关关于在吴恩达内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复