我是靠谱客的博主 体贴小猫咪,最近开发中收集的这篇文章主要介绍关于在吴恩达的课上看到的奇异值分解实现音频分离,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近在看有关阵列信号处理的知识,无意中看到吴恩达的机器学习课上有这样一行代码:[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):

[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);

图可以到链接上看到,这个算法需要有两个距离不同的接收器对信号进行接收(本人一开始还傻傻的只用一个音频做)。本质上是算出两个音频的相关性,然后得到分离的信号。

最后

以上就是体贴小猫咪为你收集整理的关于在吴恩达的课上看到的奇异值分解实现音频分离的全部内容,希望文章能够帮你解决关于在吴恩达的课上看到的奇异值分解实现音频分离所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部