基于FastICA的声源分离实例(matlab代码)

    科技2023-09-17  97

    基于FastICA的声源分离实例

    1 独立成分分析(ICA)的形象化理解1.1 盲源分离(BlindSource Separation,BSS)的认识1.2 独立成分分析(ICA)的基础概念1.3 FastICA算法简述 2 声源分离实例(matlab)3 总结         文章的叙述将从三个部分展开,一:对独立成分分析(ICA)部分基础概念的论述,以及形象化理解;二:以两段独立声源为素材,先对其随机混合,得到观测信号(X)–(模拟自然混合声源),采用基于FastICA的估计方法,对观测信号进行解混,得到相应的独立成分,并将之与原素材对比,判断解混效果;三:学习ICA算法的部分心得体会。

    1 独立成分分析(ICA)的形象化理解

            在进行正式的实例化代码演示前,先对独立成分分析(ICA)进行部分阐述,以便对后续代码的处理过程,有更为形象的认识。本部分的论述,分为盲源分离的认识;独立成分分析的基础概念;FastICA算法的理解。

    1.1 盲源分离(BlindSource Separation,BSS)的认识

    盲源分离与ICA的关系

           ICA 与盲源分离的方法具有非常密切的关系。ICA是实现盲源分离的其中一种,也是被最广泛使用的方法,故而,有必要在介绍ICA前,对盲源分离进行简要的介绍。

    盲源分离的基础概念:

           盲源分离是由“鸡尾酒会问题”引出,该问题描述的是一场鸡尾酒会中有N个人一起说话,同时有N个录音设备,问怎样根据这N个录音文件恢复出N个人的原始语音,示意图如下[1]。(ICA就是针对该问题所提出的一个算法。)

           盲源分离:根据源信号的统计特性,是指仅由观测的混合信号恢复(分离)出未知原始源信号的过程。通常观测到的混合信号来自多个传感器的输出,并且传感器的输出信号独立性(线性不相关)。

           盲信号的“盲”字强调了两点:1)原始信号并不知道;2)对于信号混合的方法也不知道。        盲源分离的目的:求得源信号的最佳估计。(当盲源分离的各分量相互独立时,就成为独立分量分析)[2]

    盲源问题的原理性分析:

           寻找一个类似于【公式1】中矩阵B确定线性变换,使得随机变量Yi,i=1,2,..n尽可能独立,流程示意如下图所示:        因此,BSS的主要工作是寻找一个线性滤波器或者是一个权重矩阵B。理想的条件下,B矩阵是A矩阵的逆矩阵。由于参数空间不是欧几里得度量,在大多的情况下都是黎曼度量,因此对于B(或W)矩阵的求解选用自然梯度解法。

    自然梯度求解法:

    1.2 独立成分分析(ICA)的基础概念

    ICA模型:

           其中随机向量X=(x1,x2,…,xn)表示观测数据或观测信号(observed data),随机向量S=(s1,s2,…,sn)表示源信号,称为独立成分(independent components),A称为nxn的混合矩阵(mixing matrix),在该模型中,X表示的是一个随机向量,x(t)表示随机向量X的一个样本;Y=BX=BAS;Y是我们求解后的成分信号,S是源信号,若要使Y最大程度上逼近S,这实际上就是个优化过程,只需要满足解混合矩阵B是最佳估计A的逆矩阵就好。        上图所示是标准的独立成分分析模型,可以看作成一个生成模型(generativemodel),它的意思是说观测信号是通过源信号混合而生成的,在这个意义下,独立成分也称为隐含或潜在交量(hidden/latent , nariable ),也就是说这些独立成分是无法直接观测到的,另一方面,混合系数矩阵A也是未知的。

    ICA模型的直观理解[3]

           为了进一步理解ICA的统计模型,我们假设两个独立分量服从下面的均匀分布:        选择均匀分布的取值范围,使得均值为0,方差为1。S1和S2的联合密度在正方形内是均匀的,这源于联合密度的基础定义:两个独立变量的联合密度是他们边密度的乘积。联合密度如下图4所示,数据点是从分布中随机抽取。        现在混合这两个独立成分,我们取下面的混合矩阵:        这得出了两个混合变量,X1和X2,很容易得出混合数据在一个平行四边形上的均匀分布,如下图5所示:        我们可以看到,随机变量X1和X2不再独立,换一种说法是,是否有可能从一个值去预测另一个值。假设X1的值为最大或最小值,那么X2的值就可以确定了。如上图中红框圈起来的数据点所示。由此可知,X1和X2已经不再独立了。但是对于图4中的随机变量S1和S2情况就不同了,如果我们知道S1的值,那么无论通过什么方式都无法确定S2的值。        估计ICA数据模型的问题现在成为仅利用混合X1和X2的信息来估计混合矩阵A0,实际上,我们可以通过观察上图来直观的估计矩阵A:平行四边形的边的方向就是混合矩阵A的列所指的方向。这样独立成分分析的解可以通过确定混合方向来得到,但在标准的ICA中这样的计算是较为复杂的,我们可以寻找更为方便,计算简单,且适用于独 立成分的任何分布的算法,这里只给出ICA的直观解释。

    ICA的任务:

           独立成分分析的任务:在只知道观测信号X的T个样本x(1),…,x(T),且在源信号S和混合矩阵A未知的条件下,假设源信号si(0=1,…,n)之间是相互统计独立的,来求解混合矩阵A和源信号s。

    ICA的约束:

           为了确保ICA模型能被估计,我们必须做出一定的假设和约束(即应用ICA的前提条件): 1)独立成分被假定是统计独立的(前提条件); 2)独立成分具有非高斯的分布(高斯分布时,ICA本质上是不可实现的); 3)为了简单起见,假定混合矩阵是方阵(独立成分的个数与观测到的混合量个数相同)。

    ICA的含混因素:

           在定义的ICA模型中,很容易发现存在下面一些必然的含混因素或者不确定性,具体而言: 1)我们无法确定独立成分的方差/能量;(原因是混合矩阵A和独立成分S都是未知的,不过在绝大多数的应用中,这种含混因素是无关紧要的) 2)我们无法确定独立成分的次序。(原因是混合矩阵A和独立成分S都是未知的,另外ICA所求得的解是波形保持解,在某些特殊的应用中,需要确定输出成分的顺序,为此,可以通过某些统计量的大小来规定输出独立成分的顺序)

    ICA的处理流程:

           前面的五小章节主要介绍了ICA的一些基础概念,接下来,将叙述ICA的实际应用,下图为应用ICA算法的简化处理流程。

    ICA预处理操作:

           在ICA的实际应用中,为了简化算法,亦或者应用过程中可能出现的问题,如过学习和数据中的噪声,我们常常会对数据进行预处理操作,具体操作方法有如下几种类型: 1)变量的中心化处理;(实现混合变量和独立成分的零均值); 2)白化;(实现变量的去相关) 3)主成分分析(PCA)降维;(简化算法) 4)时间滤波(降低数据中的噪声)

    ICA估计方法:

    I C A 估 计 方 法 = 目 标 函 数 + 优 化 算 法 ICA估计方法=目标函数+优化算法 ICA=+

           在目标函数明确的情况下,我们可以使用任何经典的优化算法,如(随机)梯度算法和牛顿方法,然而在某些情况下,算法和估计原理可能难以区分。

    ICA算法的性质依赖于目标函数和优化算法。特别是:

    ICA方法的统计性质(如一致性,渐进方差,鲁棒性)取决于目标函数的选择算法的性质(如收敛速度,存储需求,数值稳定性)取决于优化算法

           理想情况下,这两类性质是独立的,即不同的优化方法可以用来优化同一个目标函数,一个优化方法可以用来优化不同的目标函数[4]

           ICA算法的研究主要可分为基于信息论准则的迭代估计方法和基于统计学的代数方法两大类,从原理上来说,它们都是利用了源信号的独立性和非高斯性。基于信息论的方法研究中,各国学者从最大熵、最小互信息、最大似然和负熵最大化等角度提出了一系列估计算法。如FastICA算法, Infomax算法,最大似然估计算法等。基于统计学的方法主要有二阶累积量、四阶累积量等高阶累积量方法。

    ICA的应用方向:

            独立成分分析(ICA)己经成功地应用在图像处理、语音信号处理、生物医学信号处理、模式识别、数据挖掘、通讯和金融等领域。

    信号处理及多元统计领域:基本问题是寻找信号,比如语音和图像数据的一个恰当的线性表示、数据压缩和数据的去噪声等,独立成分分析已经成功的用于解决这些问题,与传统的方法比如傅利叶基表示、小波基表示等相比较有许多优点。脑成像:大脑内部不同的信号源发出的信号在头部以外的传感器中混合起来,该过程符合基本盲源分离模型。计量经济学:我们可以获得并行的时间序列,ICA可以将它们分解成独立成分,从这些成分可以分析和洞察数据集的内在结构。图像特征提取:找到尽可能独立的特征。生物医学信号处理领域:独立成分分析发挥了巨大的作用,它比传统的方法更优越,比如相关性分析和主成分分析。ICA己经成功地用于EEG、MEG、EPR等医学信号的处理。具体以在功能磁共振成像fMRI数据分析中的应用为例来说明它的作用。人脑受到外界的任务刺激后,它的激活区域是各种可能存在的信号在脑内的综合反应,比如这些信号可能包括任务信号、心脏的跳动、肌肉的收缩、呼吸和机器噪声等,把这些信号看作是相互统计独立的,则独立成分分析对fMRI数据分析的目的就是找出真正与脑激活有关的独立成分,去除与其它干扰噪声相应的独立成分。众所周知,对fMRI信号的研究大多是在假定己知事件相关时间过程曲线的情况下,利用相关性分析得到脑的激活区域,就像上面所提到的,将fMRI信号分析看作是一种盲源分离问题,在不清楚有哪几种因素对fMRI信号有贡献、也不清楚其时间过程曲线的情况下,用空间独立成分分析方法对fMRI信号进行盲源分离,提取不同独立成分得到任务相关成分、头动成分、瞬时任务相关成分、噪声干扰、以及其它产生fMRI信号的多种源信号。与主成分分析相比较发现,独立成分分析能得到更多的脑内激活信号,并且在相同的阈值情况下,独立成分分析的激活区域更大,可见独立成分分析是一个比较优越的数据处理方法,能够广泛的应用于数据分析,因此研究独立成分分析具有重要的现实意义。

    1.3 FastICA算法简述

    基础概念:

           FastICA算法,又称不动点(Fixed-Point)算法,是由芬兰赫尔辛基大学Hyvärinen等人提出来的。是一种快速寻优迭代算法,与普通的神经网络算法不同的是这种算法采用了批处理的方式,即在每一步迭代中有大量的样本数据参与运算。但是从分布式并行处理的观点看该算法仍可称之为是一种神经网络算法。        FastICA算法有基于峭度、基于似然最大、基于负熵最大等形式,这里,我们介绍基于负熵最大的FastICA算法(可以有效地把不动点迭代所带来的优良算法特性与负熵所带来的更好统计特性结合起来)。它以负熵最大作为一个搜寻方向,可以实现顺序地提取独立源,充分体现了投影追踪(Projection Pursuit)这种传统线性变换的思想。此外,该算法采用了定点迭代的优化算法,使得收敛更加快速、稳健。        因为FastICA算法以负熵最大作为一个搜寻方向,因此先讨论一下负熵判决准则。由信息论理论可知:在所有等方差的随机变量中,高斯变量的熵最大,因而我们可以利用熵来度量非高斯性,常用熵的修正形式,即负熵。根据中心极限定理,若一随机变量由许多相互独立的随机变量之和组成,只要具有有限的均值和方差,则不论其为何种分布,随机变量较更接近高斯分布。换言之,较的非高斯性更强。因此,在分离过程中,可通过对分离结果的非高斯性度量来表示分离结果间的相互独立性,当非高斯性度量达到最大时,则表明已完成对各独立分量的分离[1]。

           负熵的定义:

    算法原理[5]

           这里不做赘述,详情请见: 独立成分分析FastICA算法原理

    算法步骤:

    2 声源分离实例(matlab)

    前期准备:

           准备两段原始的清晰语音文件:sound1,sound2。(提取码:muda)

    MATLAB源码: %MATLAB代码: [S1,fs1] = audioread('C:\Users\非黑不即白\Desktop\ICA\ICA\sound1.wav'); % 读取原始语音信号 [S2,fs2] = audioread('C:\Users\非黑不即白\Desktop\ICA\ICA\sound2.wav'); subplot(3,2,1),plot(S1),title('输入信号1'); subplot(3,2,2),plot(S2),title('输入信号2'); % 将其组成矩阵 s1 = S1'; s2 = S2'; S=[s1;s2]; Sweight = rand(size(S,1)); MixedS=Sweight*S; % 将混合矩阵重新排列并输出 subplot(3,2,3),plot(MixedS(1,:)),title('混合信号1'); subplot(3,2,4),plot(MixedS(2,:)),title('混合信号2'); % wavwrite(MixedS(1,:),8000,8,'mixed_wav1.wav');%保存wav数据 % wavwrite(MixedS(1,:),8000,8,'mixed_wav2.wav'); MixedS_bak=MixedS; %%%%%%%%%%%%%%%%%%%%%%%%%% 标准化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MixedS_mean=zeros(2,1); for i=1:2 MixedS_mean(i)=mean(MixedS(i,:)); end % 计算MixedS的均值 for i=1:2 for j=1:size(MixedS,1) MixedS(i,j)=MixedS(i,j)-MixedS_mean(i); end end %%%%%%%%%%%%%%%%%%%%%%%%%%% 白化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MixedS_cov=cov(MixedS'); % cov为求协方差的函数 [E,D]=eig(MixedS_cov); % 对信号矩阵的协方差函数进行特征值分解 Q=inv(sqrt(D))*(E)'; % Q为白化矩阵 MixedS_white=Q*MixedS; % MixedS_white为白化后的信号矩阵 IsI=cov(MixedS_white'); % IsI应为单位阵 %%%%%%%%%%%%%%%%%%%%%%%% FASTICA算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X=MixedS_white; % 以下算法将对X进行操作 [VariableNum,SampleNum]=size(X); numofIC=VariableNum; % 在此应用中,独立元个数等于变量个数 B=zeros(numofIC,VariableNum); % 初始化列向量w的寄存矩阵,B=[b1 b2 ... bd] for r=1:numofIC i=1;maxIterationsNum=1000; % 设置最大迭代次数(即对于每个独立分量而言迭代均不超过此次数) IterationsNum=0; b=rand(numofIC,1)-.5; % 随机设置b初值 b=b/norm(b); % 对b标准化 norm(b):向量元素平方和开根号 while i<=maxIterationsNum+1 if i == maxIterationsNum % 循环结束处理 fprintf('\n第%d分量在%d次迭代内并不收敛。', r,maxIterationsNum); break; end bOld=b; a2=1; u=1; t=X'*b; g=t.*exp(-a2*t.^2/2); dg=(1-a2*t.^2).*exp(-a2*t.^2/2); b=((1-u)*t'*g*b+u*X*g)/SampleNum-mean(dg)*b; % 核心公式 b=b-B*B'*b; % 对b正交化 b=b/norm(b); if abs(abs(b'*bOld)-1)<1e-9 % 如果收敛,则 B(:,r)=b; % 保存所得向量b break; end i=i+1; end end for k=1:numofIC W(:,k)=B(:,k)/5^k; % 得到解混矩阵W end %%%%%%%%%%%%%%%%%%%%%%%%%% ICA计算的数据复原并构图 %%%%%%%%%%%%%%%%%%%%%%%%% ICAedS=W'*Q*MixedS_bak; % 计算ICA后的矩阵 % 将混合矩阵重新排列并输出 subplot(3,2,5),plot(ICAedS(1,:)),title('ICA解混信号1'); subplot(3,2,6),plot(ICAedS(2,:)),title('ICA解混信号2'); % wavwrite(ICAedS(1,:),8000,8,'fastica_wav1.wav');%保存wav数据 % wavwrite(ICAedS(2,:),8000,8,'fastica_wav2.wav');

    程序执行结果及分析:

           由上图我们可以看出,程序执行结果良好,输入信号1、2与ICA解混信号1、2近似等同,即采用该算法能够很好的对混合信号实现解混操作,得到与原始信号近似的两个独立成分。

    3 总结

    接触独立成分分析(ICA)近两个礼拜,通过查阅大佬文章、文献、相关著作,使我对ICA的基础概念、原理、以及应用方向有了一个基础的认识。为此,借以写博客的方式,作者对近段时间的学习,做了一个归纳、梳理。ICA是从多元(多维)统计数据中寻找其内在因子或成分的一种方法,它所寻找的是既统计独立又非高斯的成分。由于ICA模型具有一般性,它在许多领域都有应用,尤其是脑成像、图像特征提取、计量经济学等领域,应用更为广泛。关于ICA的入门学习,建议从《独立成分分析》AapoHyvarinen 编著入手,书中对ICA的模型、算法、以及拓展应用都有着详细介绍,这些有助你建立ICA学习的整体框架。后续阶段,作者也会继续加深对这本书的学习、理解,同时也会做一些学习分享,欢迎持续关注。(文中可能存在一些不全面的地方,欢迎各位大佬的指正,文末最后附上文章参考来源。)

    文章参考来源: [1] https://blog.csdn.net/ctyqy2015301200079/article/details/86705869   学习笔记 | 独立成分分析(ICA, FastICA)及应用 [2] https://wenku.baidu.com/view/ca9e450b8f9951e79b89680203d8ce2f0166653b.html   百度文库|独立成分分析 [3] https://blog.csdn.net/Tonywu2018/article/details/91490158   详解独立成分分析 [4] 《独立成分分析》AapoHyvarinen 编著 [5] https://blog.csdn.net/a358463121/article/details/105622832   独立成分分析FastICA算法原理 补充: https://blog.csdn.net/cai2016/article/details/52983473   ICA(独立成分分析)在信号盲源分离中的应用 https://blog.csdn.net/u012421852/article/details/80500891   【机器学习】【ICA-1】概率统计/代数知识详解:高斯分布、概率密度函数、累积分布函数、联合分布函数、复合函数的概率密度函数、行列式求导等 https://blog.csdn.net/u012421852/article/details/80500940   【机器学习】【ICA-2】ICA独立成分分析的原理 + ICA前的预处理(中心化+漂白) https://blog.csdn.net/zb1165048017/article/details/48464573   ICA独立成分分析—FastICA基于负熵最大 https://blog.csdn.net/lizhe_dashuju/article/details/50263339   史上最直白的ICA教程之一 https://blog.csdn.net/sinat_37965706/article/details/71330979   因子分析、主成分分析(PCA)、独立成分分析(ICA)——斯坦福CS229机器学习个人总结(六) https://blog.csdn.net/nl997566011/article/details/69480074   语音增强研究现状与趋势分析 https://blog.csdn.net/qq_24163555/article/details/89378420  FASTICA独立成分分析matlab代码实现

    Processed: 0.011, SQL: 8