精华内容
下载资源
问答
  • 单通道盲源分离程序

    2018-12-03 10:48:38
    基于ICA的单通道盲源分离算法,程序代码方便读者理解,里面包含了相关数据源和程序包
  • 针对这一问题,本文提出了一种利用Kalman滤波算法进行信号估计,解决单通道盲源分离的方法。该方法利用信号间的时序结构,通过Kalman滤波算法对多信号混合中的源信号不断估计并迭代更新,最终得到分离信号。仿真实验...
  • 单通道盲源分离实现代码,Matlab编写的SSA-ICA算法。单通道数据映射成多维子空间,经过分组得到多路数据,再调用FastICA算法实现源信号分离。
  • 基于双树复小波变换的单通道盲源分离算法
  • 基于经验模态分解的单通道盲源分离算法.zip
  • 为了提高单通道盲源分离性能,首先由单路信号利用经验模态分解得到一系列本征模函数分量组合成多路信号;其次针对存在模态混叠的本征模函数分量,提出利用信号周期性构造其多路信号,并利用独立分量分析消除模态混叠...
  • 变分模态分解(VMD)两种预处理方法,使单通道观测信号由欠定信号转为正定或超定从而解决其“非欠定”限制,并对此两种预处理方法进行仿真实验对比验证,研究表明,不同的预处理方法会影响信号盲分离的结果,...
  • 【信号处理】单通道盲源分离(SSA-ICA)算法.md
  • 为了解决这些问题,基于粒子滤波估计算法,提出了扩展卡尔曼粒子滤波算法(EPF)和无味卡尔曼粒子滤波算法(UPF),以解决混沌信号的单通道盲分离问题。 混合不同强度的混沌信号执行盲源分离。 使用不同的评估指标...
  • 入多出的盲源分离SIMO_BSS是一种特殊的欠定盲源分离。针对信道问题,通常采用总体经验模态分解和独立成分分析联合使用EEMD_ICA算法。然而,以EEMD为基础的盲源分离算法,会产生边缘效应降低信号分离准确率。因此...
  • 盲源分离简单的来讲就是在不明确系统的传输特性的前提下,从系统的源信号估计出观测信号的传输信道。 假设n个未知的源信号,各传感器接收到m个混合的观测信号,为混入的加性噪声,混合系统A为未知的混合矩阵。经过...

    盲源分离简单的来讲就是在不明确系统的传输特性的前提下,从系统的源信号估计出观测信号的传输信道。

    假设n个未知的源信号,各传感器接收到m个混合的观测信号,为混入的加性噪声,混合系统A为未知的混合矩阵。经过分离系统W后分离出近似与源信号的估计向,盲源分离的数学模型可以表达为:

    要想分离出源信号S(t)的估计向量Y(t)主要是要求分解离矩阵W,Y(t)的分离系统过程表达式如下:

    盲信号分离的原理框图如图所示,由于混合系统A和源信号S(t)都是未知的,所以对于分离出的估计向量Y(t)可能在幅度大小和排列次序存在不确定性,但是信号的信息存在于信号的波形中,所以并不影响对信号的分离。

    ``` %----------------------------------------------------------------

    clc

    clear all

    %% --------------------------------- Set Parameters

    N = 1; %The number of observed mixtures

    Ns = 2; %The number of independent sources

    Ls = 1000; %Sample size, i.e.: number of observations

    finalTime = 40*pi; %Final sample time (s)

    initialTime = 0; %Initial sample time (s)

    %% --------------------------------- Generating Data for SSA-ICA

    Amix = rand(N,Ns); %Amix is a random N x Ns mixing matrix

    timeVector = initialTime:(finalTime-initialTime)/(Ls-1):finalTime; %Vector of time coordinates

    source1 = sin(1.1*timeVector); %Independent source component 1, sin(a * t)

    source2 = cos(0.25*timeVector); %Independent source component 2, cos(b * t)

    S = [source1;source2]; %Source Matrix

    figure

    plot(timeVector,source1) %Plotting the N independent sources vs. time

    xlabel('time (s)')

    ylabel('Signal Amplitude')

    legend('source 1')

    figure

    plot(timeVector,source2) %Plotting the N independent sources vs. time

    xlabel('time (s)')

    ylabel('Signal Amplitude')

    legend('source 2')

    Yobs = Amix*S; %Matrix consisting of M samples of N observed mixtures

    figure

    plot(timeVector,Yobs) %Plotting the observed signal vs. time

    xlabel('time (s)')

    ylabel('Signal Amplitude')

    legend('observed signal')

    %% --------------------------------- Call SSA-ICA algorithm

    M = 200;

    Sest = SSA_ICA(Yobs,Ns,M);

    %% --------------------------------- Show results

    figure

    plot(timeVector, Sest(1,:))

    xlabel('time (s)')

    ylabel('Signal Amplitude')

    legend('Source Estimation 1')

    figure

    plot(timeVector, Sest(2,:))

    xlabel('time (s)')

    ylabel('Signal Amplitude')

    legend('Source Estimation 2') ```

    展开全文
  • 这是一个单通道盲源分离算法,是SSA-ICA
  • 提出了单通道下基于盲源分离的扩频通信抗干扰方法.所提方法利用扩频序列的周期性,把单通道下的欠定盲源分离问题转换成超定盲源分离问题.算法从整体域统计特性对干扰信号进行估计抵消,同时在抗干扰的过程中完成了解扩...
  • 针对单通道语音信号盲分离的问题,结合盲源分离和经验模式分解的优点,提出了一种基于经验模式分解的单通道语音信号源数估计和盲源分离方法"对语音混合信号进行经验模式分解,利用贝叶斯算法估计语音源数目,根据源...
  • 针对空间侦察中单通道宽带接收机截获到多个独立辐射源信号时的盲源分离问题,提出了一种新的单通道盲信号分离算法。该算法首先利用奇异谱分析(SSA)构建伪阵列信号,进而采用盲源分离算法(BSS)实现信号分离。仿真试验...
  • 基于移不变稀疏编码的单通道机械信号盲源分离
  • 提出一种适用于多途环境下的观测通道水声信号盲源分离方法。该方法首先利用自相关估计多途时延,使经各途径到达的多途信号同相叠加,信号能量得到增强,而噪声由于随机性能量不会增加,进而提高信噪比。然后采用...
  • 提出了一种结合EEMD,PCA和RobustICA的单通道盲源分离方法。 通过单通道机械振动观测信号的eemd分解,获得了多维IMF分量,并对这些IMF分量的矩阵进行了主分量分析(PCA)。 确定主成分的数量,并生成一个满足超限盲...
  • 单通道盲源分离是一种特殊的欠定盲源分离情况,常规的盲源分离算法不再适用。本文针对此问题提出通过快速经验模态分解(EEMD)将由多路信号混合成的单通道信号分解为多路本征模态函数,采用主成分分析估计源信号的...
  • 介绍了单通道混合信号的概念及盲源分离的现状,对实时线性混叠盲分离方法展开研究,分类探讨基于变换域滤波、多参数联合估计、符号序列与信道参数联合估计以及多维映射的单通道混合信号盲分离方法,分析比较各类盲源...
  • 盲源分离方面的算法,使用的是VMD算法对单通道信号进行盲分离。
  • 针对单通道数字混合信号, 本文提出一种基于能量算子的信号数目估计算法。算法利用Teager能量算子, 对混合信号中各信号的符号跳变时刻进行检测。通过统计混合信号中码元速率分量的个数, 实现了单通道混合信号中源...
  • 盲源分离matlab程序

    2014-05-24 16:42:08
    用于轴承信号的处理,采用盲源分离方法,针对轴承的复合故障。
  • 麦克风阵列盲源分离技术

    万次阅读 2017-05-11 20:48:07
    第一部分麦克风数量大于声源数量的ICA的方法,第二部分是麦克风数量小于声源数量的时频分集方法,第三部分是基于最大后验概率的麦克盲源分离技术。 盲源分离解决的问题: 线性模型,又称瞬时模型 卷积模型,...

    我的书:
    在这里插入图片描述
    淘宝购买链接
    当当购买链接
    京东购买链接

    麦克风阵列盲源分离技术

    盲源分离技术仅根据观察到的每一路混叠信号估计原始多路信号,独立成分分析(independent component analysis)卷积混合情况的盲源分离技术。第一部分麦克风数量大于声源数量的ICA的方法,第二部分是麦克风数量小于声源数量的时频分集方法,第三部分是基于最大后验概率的单麦克盲源分离技术。
    盲源分离解决的问题:

    • 线性模型,又称瞬时模型
    • 卷积模型,语音更符合这个模型

    盲源分离存在两种不确定性:分离后信号的排列顺序和复振幅(幅值和相位)。当源信号之间相互独立时,如果对源信号矢量进行变换,当且仅当变换后的信号之间保持相互独立,该变换矩阵可以分解为一个满秩对角阵和一个转置矩阵的乘积,仅改变源信号的幅度和排列顺序,并没有改变信号波形。
    独立分量分析证明了只要通过适当的线性变换,使得变换后的各个信号之间相互独立就可以实现源信号的盲分离,即将盲源分离问题,转换为对独立分量分析的求解问题。可以使用的判决准则:
    >1.自然梯度
    2.随机梯度

    • 信息论法:
      1.基于互信息法:对比函数是一个用来衡量变换后各个信号之间相互独立程度的实值标量函数,当且仅当各个输出信号之间相互独立时,对比函数取得最大值或最小值。
      2.基于信源的非高斯性测度(仅指峭度)
      3.近似负嫡准则,成为FastICA。计算简单,收敛速度快,不需要任何步长参数,且迭代稳定,占用内存少。还可以通过非线性函数的适当选取来找到最优解。

    • 统计量方法:
      1.基于二阶统计量
      2.基于高阶统计量,BP网络分离信号方法,能分离线性和非线性混合,

    PCA主成份分析。高斯噪声分离。
    ICA,非高斯噪声分离,(前提假设线性,静态混合)

    • 研究集中于以下几点:
      1.欠定问题,源数目多于传感器(麦克风)
      2.单通道问题,只有一个传感器,分离出多个源
      3.多维BSS,
      4.非线性BSS,
      5.盲解卷积(声源场景)
      6.全局收敛算法
      7.非平稳环境下的BSS

    • 信号预处理,分离前
      1.中心化,即去均值。
      2.白化,


    项目 | 波束形成算法 | 基于ICA的盲源分离算
    -------- | —
    优势 | 已经商用 | 能够动态跟踪声源
    劣势 | 动态跟踪声源性能差 | 分离矩阵计算量较大;硬件和麦克风成本较高
    ##ICA方法
    ###1.1 方法
    语音信号的卷积盲分离:

    • 基于块扩展的自然梯度法
    • 空时扩展的FastICA方法
      ##1.2瞬时混合模型
      这里写图片描述
      图1.1 瞬时混合模型BSS分离
      m m m是位置语音源 s i ( k ) , 1 ≤ i ≤ m {s_i(k)}, 1\le i \le m si(k),1im数量,观察到 n n n个输出 x j ( k ) , 1 ≤ j ≤ n {x_j(k)}, 1\le j \le n xj(k),1jn.
      x j ( k ) = ∑ i = 1 m a j i s i ( k ) + v j ( k ) x_j(k)=\sum_{i=1}^m {a_{ji}}s_i(k)+v_j(k) xj(k)=i=1majisi(k)+vj(k)
      a j i a_{ji} aji是矩阵 A ( n ∗ m ) A(n*m) A(nm)线性时不变系统的系数, v j ( k ) v_j(k) vj(k)是加性噪声。瞬时混合盲源分离技术就是要找到一个 m ∗ n m*n mn的解混合矩阵 B B B.
      y i ( k ) = ∑ j = 1 n b i j ( k ) x j ( k ) y_i(k)=\sum_{j=1}^n{b_{ij}(k)x_j(k)} yi(k)=j=1nbij(k)xj(k)
      然而室内语音由于反射和混响,其要使用卷积混合模型进行分离。
      ##卷积混合分离模型
      x j ( k ) = ∑ l = − ∞ ∞ ∑ i = 1 m b j i l s i ( k − l ) x_j(k)=\sum_{l=-\infty}^\infty\sum_{i=1}^m {b_{jil}}s_i(k-l) xj(k)=l=i=1mbjilsi(kl)
      这里忽略了噪声,其响应的矩阵表示是:
      y ( k ) = ∑ l = 0 L − 1 B l X ( K − l ) y(k)=\sum_{l=0}^{L-1}B_lX(K-l) y(k)=l=0L1BlX(Kl)
      这里要求输入信号之间是统计独立的,短时平稳的。
      ##使用空域独立特性的时域卷积盲分离
      使用信源统计独立性进行BSS的方法可以分为两类:
    • 基于密度匹配法
    • 基于对比函数法
      ###密度匹配法使用自然梯度
      对于瞬时混合,仍然可以从ICA的信息最大化的推导出密度匹配法。在线性混合条件下,上面两个准则认为联合概率密度函数如下:
      p ( s ) = ∏ k = 1 m p s ( s k ) p(s)=\prod_{k=1}^mp_s(s_k) p(s)=k=1mps(sk)
      将观察到的信号 X ( k ) = [ x 1 ( k ) . . . x m ( k ) ] T X(k)=[x_1(k)...x_m(k)]^T X(k)=[x1(k)...xm(k)]T根据系统解混合矩阵 B B B线性变换得到的输出向量 y ( k ) = B ( k ) X ( k ) y(k)=B(k)X(k) y(k)=B(k)X(k),密度匹配BSS方法是使输出向量的概率密度函数 p y y p_y{y} pyy匹配模型的概率密度函数 p ^ y ( y ) \widehat{p}_y(y) p y(y).
      p y y p_y{y} pyy p ^ y ( y ) \widehat{p}_y(y) p y(y)的差异可以使用相对熵(KL散度)来度量:
      D ( p y ∣ ∣ p ^ y ( y ) ) = ∫ p y ( y ) l o g ( p y p ^ y ( y ) ) D(p_y||\widehat{p}_y(y))=\int{p_y(y)}log(\frac{p_y}{\widehat{p}_y(y)}) D(pyp y(y))=py(y)log(p y(y)py)
      式中 d y = d y 1 . . . d m dy=dy_1...d_m dy=dy1...dm.
      此外还有对比函数法等方法
      ##频域卷积BSS
      对中等程度的混响就需要较长的多通道FIR滤波,这可以放到频域来做,因为时域卷积对应频域相乘。从时域变换到频域可以通过滑窗DFT或者通过短时傅里叶变换(STFT)。窗长内的信号要是准静态的,将T时间内的采样点写成矩阵 X ( k ) X(k) X(k):
      X ( k ) = [ X ( k ) , X ( k + 1 ) , . . . , X ( k + T − 1 ) ] X(k)=[X(k),X(k+1),...,X(k+T-1)] X(k)=[X(k),X(k+1),...,X(k+T1)]
      其DFT如下:
      X ( ω , k ) = ∑ τ = 0 T − 1 X ( k + τ ) e − j 2 π ω τ / T X(\omega,k)=\sum_{\tau=0}^{T-1}X(k+\tau)e^{-j2\pi\omega\tau/T} X(ω,k)=τ=0T1X(k+τ)ej2πωτ/T
      做FFT通常会进行加窗处理。观测信号和源信息源的关系如下:
      X ( ω , k ) ≈ A ( ω ) s ( ω , k ) X(\omega,k)\approx{A(\omega)s(\omega,k)} X(ω,k)A(ω)s(ω,k)
      这里写图片描述
      图:频域盲分离的框图
      y ( ω , k ) = B ( ω , k ) A ( ω ) s ( ω , k ) = G ( ω , k ) S ( z ) y(\omega,k)=B(\omega,k)A(\omega)s(\omega,k)=G(\omega,k)S(z) y(ω,k)=B(ω,k)A(ω)s(ω,k)=G(ω,k)S(z)

    ##分离准则
    盲源分离方法建立在对声源和混合矩阵的不同假设的基础上,一般声源是独立的,至少是不相关的。分离的判决准则可以分为两类,一类是基于高阶统计量(HOS,higher-order statics),和二阶统计量(SOS,second-order statics)。N表示声源数,M表示麦克风数。这在后文一个实例中使用到这一准则。

    N < M N<M N<M | N = M N=M N=M | N > M N>M N>M
    -------- | —
    子空间方法 | 二阶或者三阶累积量 | 非静态,列优先,互质
    降到瞬时混合情况求解 | 1.SOS/HOS对于2*2系统 2.独立功率谱 3.累计量的书序大于二,ML准则 | 互累计量,时频域稀疏
    #卷积盲源分离频域法
    卷积盲源分离包括两类主要方法:时域和频域。设 s 1 , . . . , s N s_1,...,s_N s1,...,sN是N个源信号。{x_jk}是第 j {j} j个麦克风从第 k {k} k个声源在卷积模型下的观察的信号值。
    X j i ( t ) = ∑ l = 0 p h j k ( l ∙ t s ) s k ( t − l ∙ t s ) X_{ji}(t)=\sum_{l=0}^ph_{jk}(l\bullet{t_s})s_k(t-l\bullet{t_s}) Xji(t)=l=0phjk(lts)sk(tlts)
    其中 t ( t s = 1 / f s ) t(t_s=1/f_s) t(ts=1/fs)是时间的离散表示,h_{jk}是声源k到麦克风 j j j的脉冲响应。假设N个声源,则有:
    x j t = ∑ k = 1 N x j k ( t ) = ∑ k = 1 N ∑ l = 0 P h j k ( l ∙ t s ) s k ( t − l ∙ t s ) x_j{t}=\sum_{k=1}^N{x_jk(t)}=\sum_{k=1}^{N}\sum_{l=0}^P{h_{jk}(l\bullet{t_s})}s_k(t-l\bullet{t_s}) xjt=k=1Nxjk(t)=k=1Nl=0Phjk(lts)sk(tlts)
    这里写图片描述
    对分离效果的好坏使用信号/干扰比(signal-to-interference ratio, SIR)和信号/失真比(signal-to-distortion ratio)。
    I n p u t S T R i = 10 log ⁡ 10 ∑ t ∣ x j i ( t ) ∣ 2 ∑ t ∣ ∑ k ≠ i x j k ( t ) ∣ 2 InputSTR_i=10\log_{10}\frac{\sum_t|x_{ji}(t)|^2}{\sum_t|\sum_{k\neq{i}}x_{jk}(t)|^2} InputSTRi=10log10tk=ixjk(t)2txji(t)2 (dB)
    O u t p u t S T R i = 10 log ⁡ 10 ∑ t ∣ y j i ( t ) ∣ 2 ∑ t ∣ ∑ k ≠ i y j k ( t ) ∣ 2 OutputSTR_i=10\log_{10}\frac{\sum_t|y_{ji}(t)|^2}{\sum_t|\sum_{k\neq{i}}y_{jk}(t)|^2} OutputSTRi=10log10tk=iyjk(t)2tyji(t)2 (dB)
    y i k y_{ik} yik s k s_k sk在输出端 y i y_i yi的部分。
    SDR定义如下:
    S D R i = 10 log ⁡ 10 ∑ t ∣ α i y j i ( t − δ ) ∣ 2 ∑ t ∣ y j i − α i x j i ( t − δ i ) ∣ 2 SDR_i=10\log_{10}\frac{\sum_t|\alpha_i{y_{ji}(t-\delta)}|^2}{\sum_t|y_{ji}-\alpha_{i}x_{ji}(t-\delta_{i})|^2} SDRi=10log10tyjiαixji(tδi)2tαiyji(tδ)2
    失真定义于分母,这通过找到合适的幅度调节因子 α i \alpha_{i} αi和时间调节因子 δ i \delta_{i} δi最小化失真获得SDR。最优 δ i \delta_i δi通过最大化互相关获得:
    δ i = a r g m a x δ ∑ t y j i ( t ) ( t − δ ) \delta_i=argmax_{\delta}\sum_ty_{ji}(t)(t-\delta) δi=argmaxδtyji(t)(tδ)
    α i \alpha_i αi通过最小均方误差获得:
    α i = ∑ t y i i ( t ) x j i ( t − δ ) ∑ t ∣ x j i ( t − δ ) ∣ 2 \alpha_i=\frac{\sum_t{y_{ii}(t)x_{ji}(t-\delta)}}{\sum_t|x_{ji}(t-\delta)|^2} αi=txji(tδ)2tyii(t)xji(tδ)
    ##频域BSS
    这里写图片描述
    通过STFT将每一个麦克风观察到的时域信号 x j ( t ) x_j(t) xj(t)转换到频域时间信号 x j ( n , f ) x_j(n,f) xj(n,f):
    x j ( n , f ) ← ∑ t x j ( t ) w i n a ( t − n S t s ) e − t 2 π f t x_j(n,f)\leftarrow\sum_tx_j(t)win_a(t-nSt_s)e^{-t2{\pi}ft} xj(n,f)txj(t)wina(tnSts)et2πft
    每一个离散的频点 f ∈ { 0 , 1 L f s , . . . , L − 1 L f s } f{\in}\{0,\frac{1}{L}f_s,...,\frac{L-1}{L}f_s \} f{0,L1fs,...,LL1fs}.分析用的窗函数可以使用汉宁窗。如果帧长 L L L能够包括绝大部分的脉冲响应 h j k h_{jk} hjk,则卷积模型可近似使用瞬时模型近似:
    x j k ( n , f ) = h j k ( f ) s k ( n , f ) x_{jk}(n,f)=h_{jk}(f)s_k(n,f) xjk(n,f)=hjk(f)sk(n,f)
    则有:
    x j ( n , f ) = ∑ k = 1 N x j k ( n , f ) = ∑ k = 1 N h j k ( f ) s k ( n , f ) x_j(n,f)=\sum_{k=1}^Nx_{jk}(n,f)=\sum_{k=1}^Nh_jk(f)s_k(n,f) xj(n,f)=k=1Nxjk(n,f)=k=1Nhjk(f)sk(n,f)
    向量表示如下:
    X ( n , f ) = ∑ k = 1 N h k ( f ) s k ( n , f ) \mathbf{X}(n,f)=\sum_{k=1}^N\mathbf{h}_k(f)\mathbf{s}_k(n,f) X(n,f)=k=1Nhk(f)sk(n,f)
    接下来的操作,分离,置换以及缩放和T-F掩码都在频域做。复共轭矩阵的关系如下:
    x j { n , m L f s } = x j ∗ { n , L − m L f s , m = 1 , . . . , L 2 − 1 x_j\{n,\frac{m}{L}f_s\}=x_j^*\{n,\frac{L-m}{L}f_s,m=1,...,\frac{L}{2}-1 xj{n,Lmfs}=xj{n,LLmfs,m=1,...,2L1
    这里最关键的就是求分离矩阵,这个非常类似AEC情况下的回声消除求权重的过程,由于AEC是一维,BSS是多维且矩阵间互相影响,所以其计算特别耗时。
    但是这时可以利用SL(sound location)DS/GCC/GCC-PHAT技术,在大概知道多个声源的方向,这时分离矩阵的系数应该让各个方向上能量和其它方向上的能量比值最大。
    另外针对也许特殊的场景,不放考虑使用DNN方式,先前训练好几组权重系数。
    这里给出一个matlab版本程序,需要说明的是,这个程序在无背景噪声,线阵,麦克风大间距下效果非常明显。
    #测试matlab
    ##调用BSS主体

    %read 6 audio sigal, include two for AEC 
    y=audioread('/home/gsc/_0_1.wav');
    %row = number mic
    y=y';
    y1=y(1,:)';
    y2=y(2,:)';
    y3=y(3,:)';
    y4=y(4,:)';
    
    x=[y1';y2';y3';y4'];
    
    Ns=1;
    nFFT=4096;
    nP=50;
    nSample=10000;
    ovl=0.75;
    [y,w]=alcobs(x,Ns,nFFT, nP, nSample, ovl);
    

    ##运行完毕后可以使用如下命令听:

    audioplayer(y(1,:),48000);
    p=audioplayer(y(1,:),48000);
    play(p)
    

    ##BSS实现主体
    可以参考论文《A Frequency Domain Method for Blind Source Separation of Convolutive Audio Mixtures》

    function [y,W] = alcobs(x, Ns, nFFT, nP, nSample, ovl);
    % Alternating Least Squares Convolutive Blind Source Separation
    % Version 1.0
    % Author:  Kamran Rahbar
    % Institue: McMaster University (Statistical Signal processing Lab)         
    % This function does blind source separation of
    % convolutive mixtures useing a frequency domain approach. 
    % For more info. see: 
    %     Kamran Rahbar, James P. Reilly, 
    %    "A Frequency Domain Method for Blind Source Separation
    %     of Convolutive Audio Mixtures", 
    %     IEEE Trans. on Speech and Audio Processing (to be published).
    %
    % Please report any bug or problem to reillyj@mcmaster.ca 
    %
    % usage:
    %             [y,w]=alcobs(x, Ns, nFFT, nP, nSample, ovl);
    %
    %   x         Observed signals from convolutive mixtures
    %   Ns        Number of sources
    %   nFFT      Number of FFT points (usually greather than the length of channel) 
    %   nP        Number of cross spectral density matrices
    %   nSample   Number of samples in each epoch
    %   ovl       Overlap percetange (0<ovl<1) represents the amount of overlap between adjacent FFT windows 
    % 
    %   Note that Lx > (nP*nFFT)/ovl where Lx is the length of observed data
    %
    % 
    %   y         Separated output signal with y(i,:) corresponds to ith signal
    %   W         Demixing matrix in time domain; W(i,j,t) representsb the ij element of demixing matrix
    %              at time t
    %  Example of Usage for data collected in a real room environmnet:
    %  [y,W]=alcobs(x, 2, 4096, 100, 10000, 0.5);
    % 
    %  Copyright Kamran Rahbar & James P. Reilly  
    %
    %THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
    %IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    %WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    %HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    %ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    %DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    %OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    %HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    %STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    %ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    %POSSIBILITY OF SUCH DAMAGE.
    %
    %----------- 2002 McMaster University - Kamran Rahbar -----------
    %
    
    [mx, nx]=size(x);
    if mx > nx
        x=x';
        [mx nx]=size(x);
    end
    if (mx < Ns)
        error('Ns should be less than or equal to num. of observed signals')'
        return;
    end
    
    if (ovl >1 | ovl<=0 )
        error('0<ovl<1');
        return;
    end
    
    if (fix(log2(nFFT))-log2(nFFT)~=0)
        error('nFFT should be in power of 2')
        return
    end  
    
    if (nFFT> nSample)
        error('nSample should be >= nFFT')
    end
    
    
    shift=ceil((1-ovl)*nFFT);
    
    if (nx < (nSample*nP+ceil(ovl*nSample)))
        error(' Lx > nSample*nP+ovl*nSample')
        return;
    end    
    
    % Calculate the Cross Spectral Density Matrices
    [Px, x]=CalPx(x, shift, nFFT, nP, nSample); 
    % Calculate H(w) at each frequency bin using ALS
    [H,D,Binv,Nit]=AlsBss(Px,Ns,nFFT);
    % remove permutations
    [HH,DD,per]=PermRemove(H,D);
    % Calculate the final output
    W=real(ifft(HH,nFFT,3));
    y=mat_conv(W, x);
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    
    function [Px, x]=CalPx(x, shift, nFFT, M, nSample)
    
    [mx, nx]=size(x);
    Len=nSample*M;
    if (Len > nx)
        error('nSample*M should be leq to number of observed data')
        return;
    end
    x=x(:,1:Len);
    %=========================remove the mean and normalize=============================
    for i=1:mx
        x(i,:)=x(i,:)-mean(x(i,:));
    end
    x=diag(1./std(x'))*x;
    %=========Main program starts from here================================
    Px=zeros(mx,mx,nFFT/2+1,M);
    kk=0;
    for z=0:nSample:Len-nSample    
        kk=kk+1;
        ShowProgress(kk/M, 'Calculating CPSD matrices.....');
        for v=0:shift:nSample-nFFT-1
    	     i=z+v;
    	     for mmm=1:mx
                 X(mmm,:)=fft(x(mmm,i+1:i+nFFT).*hanning(nFFT)',nFFT);
    	     end
             for k=1:1:nFFT/2+1
                 Px(:,:,k,kk)=(1/nFFT)*X(:,k)*X(:,k)'+Px(:,:,k,kk);
             end  
        end
    end
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    function [B,D,Binv,Nit]=AlsBss(Px,nSource,nFFT);
    [N1,N2,Kr,M]=size(Px);
    kk=0;
    eps=1e-8;
    delta=0.005;
    Kp=2*(Kr-1)/nFFT;
    K=nFFT/2+1;
    H_init=zeros(N1,nSource);
    H_init(1:nSource,1:nSource)=eye(nSource);
    for k=1:Kp:Kr
        kk=kk+1;
        ShowProgress(k/Kr, 'Calculating B(w) using ALS.....');
        R=[];
        P_sum=zeros(N1,N1);
        for i=1:M         
        R(:,:,i)=Px(:,:,k,i)/(norm(Px(:,:,k,i),'fro')+1e-8);  
        end
        R(:,:,1)=R(:,:,1)+delta*eye(N1);
       if kk==1 
        [Binv(:,:,kk),D(:,:,:,kk),Nit(kk),cost]=als(R,nSource,eps,H_init);
       else
        [Binv(:,:,kk),D(:,:,:,kk),Nit(kk),cost]=als(R,nSource,eps,Binv(:,:,kk-1)); 
       end
       B(:,:,kk)=pinv(Binv(:,:,kk));
       B(:,:,kk)=B(:,:,kk)/norm(B(:,:,kk),'fro');
    end
    clc
    disp('Final Adjusments......');
    for k=2:(K-1)
         Binv(:,:,2*K-k)=conj(Binv(:,:,k));   
         B(:,:,2*K-k)=conj(B(:,:,k));
    end
    Delay=K-1;
    for k=1:2*(K-1)
       B(:,:,k)=B(:,:,k)*exp(2*pi*1j*Delay*(k-1)/(2*(K-1)));  
    end
     
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
    
    function [H,D,Nit,cost]=als(P,nSource,thresh,H_init); 
     [N,N,M]=size(P);
     MaxNumItr=60;
     Psi=zeros(N*N,nSource);
     E=zeros(N*N,M);
     d=zeros(nSource,M);
     tmp=zeros(N*N,M);
     for i=1:nSource
         G(:,:,i)=H_init(:,i)*H_init(:,i)';
         G1=G(:,:,i);
         Psi(:,i)=G1(:);
     end
     for m=1:M
       P1=P(:,:,m);  
       Pv(:,m)=P1(:);
       d(:,m)=pinv(Psi)*Pv(:,m);
     end
     H=H_init;
     cost(1)=0;
     for ii=1:MaxNumItr
       cost(ii+1)=0;
       for i=1:nSource
          for m=1:M
             tmp(:,m)=Pv(:,m)-Psi*d(:,m);
             E(:,m)=tmp(:,m)+Psi(:,i)*d(i,m);
          end
          Psi(:,i)=E*d(i,:)'/norm(d(i,:))^2;
            q_init=H(:,i);
            G1=mat(Psi(:,i));
            z_init=G1*q_init;
            V_max=z_init/norm(z_init);
            H(:,i)=V_max;
            G1=V_max*V_max';
            Psi(:,i)=G1(:);
       end
       for m=1:M
            d(:,m)=pinv(Psi)*Pv(:,m);
            D(:,:,m)=diag(d(:,m));
            cost(ii+1)=norm(tmp(:,m))^2+cost(ii+1);
       end 
       
       if abs(cost(ii+1)-cost(ii))/(cost(2)+1e-8)<thresh
           break;
       end
    end
    Nit=ii;
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
      
    function [H,D,per]=PermRemove(H,D)
    
    [N1,N2,K]=size(H);
    [N1,N2,M,KKK]=size(D);
    
    Pindx=perms(1:N1);
    I=eye(N1);
    for i=1:length(Pindx)
        Permute_Table(:,:,i)=I(:,Pindx(i,:));
    end    
    
    KK=K/2+1;
    Level=log2(K/2);
    Htmp=H;
    per=zeros(1,KK);
    ii=0;
    D_ave=zeros(N1,N2,M,2^(Level+1)-1);
    D_ave(:,:,:,1:KK-1)=D(:,:,:,1:KK-1);
    indx=0;
    %**************Level Zero**********************
    indx=KK-1;
    for k=1:2:KK-1
        ShowProgress(k/(KK-1), 'removing permutations in level--0 ......');
        indx=indx+1;
        [PI,flag]=FindPermute(D_ave(:,:,:,k),D_ave(:,:,:,k+1),Permute_Table);
                                                                
        if flag>0
            for i=1:M
                D_ave(:,:,i,k)=PI*D_ave(:,:,i,k)*PI';
            end
            H(:,:,k)=PI*H(:,:,k); 
            per(k)=abs(per(k)-1);
        end
        D_ave(:,:,:,indx)=D_ave(:,:,:,k)+D_ave(:,:,:,k+1);
    end
    
    %********************************************************************************
    
    
    %**************Level >0 ****************************
    n=0;
    for level=1:Level-1
        
        n=2^(Level-level+1)+n;
        for k=1:2:(KK-1)/(2^level)
            ShowProgress(k/((KK-1)/2^level), strcat('Removing permutations in level--', num2str(level), '......')); 
            kk=n+k;
            indx=indx+1;
            if level==5
                stop1=1;
            end
            [PI flag]=FindPermute(D_ave(:,:,:,kk),D_ave(:,:,:,kk+1),Permute_Table);
            
            if flag>0
                [D_ave,H,per]=ChangePermute(kk,level,KK-1,D_ave,H,PI,per);
            end
            D_ave(:,:,:,indx)=D_ave(:,:,:,kk)+D_ave(:,:,:,kk+1);
        end
    end
    
    D(:,:,:,1:KK-1)=D_ave(:,:,:,1:KK-1);
    
    
    %*************************For the last bin KK ******************
    
    clc
    disp('Final Adjusments......')
    [PI flag]=FindPermute(D(:,:,:,KK),D(:,:,:,KK-1),Permute_Table);
    if flag>0
        
        for i=1:M
           D(:,:,i,KK)=PI*D(:,:,i,KK)*PI';
        end
        H(:,:,KK)=PI*H(:,:,KK);
    end
    
    %****************************************************************
    
    
       for k=2:KK-1
          H(:,:,2*KK-k)=conj(H(:,:,k));
          D(:,:,:,2*KK-k)=conj(D(:,:,:,k));
       end
    
       if nargin>2
         for k=1:K
           Cf(:,:,k)=H(:,:,k)*Bf(:,:,k);
         end
         
       end
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    
    function [PI,flag]=FindPermute(D1,D2,Permute_Table)
    
    [N,N1,M]=size(D1);
    [N1,N1,K]=size(Permute_Table);
    PI=zeros(N,N);
    E1=zeros(N,M);
    E2=zeros(N,M);
    for i=1:N
        d1=squeeze(D1(i,i,:));
        d2=squeeze(D2(i,i,:));
        E1(i,:)=abs(d1)'/norm(d1);
        E2(i,:)=abs(d2)'/norm(d2);
    end 
    Max=-10;
    for k=1:K
        cost=trace(E1'*Permute_Table(:,:,k)*E2);
        if cost>Max
            Max=cost;
            k_max=k;
        end
    end
    
    PI=Permute_Table(:,:,k_max);
    
    if PI==eye(N)
        flag=0;
    else
        flag=1;
    end
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    
    function [D_ave,H,per]=ChangePermute(n,level,K,D_ave,H,PI,per)
    [N1,N2,M,Top_indx]=size(D_ave);
    KK=K+1;
    indx=zeros(1,level);
    [k_min k_max]=ChildAddress(n,level,K);
    for j=k_min:k_max   
       if level>0
         for l=1:level
           indx(l)=CalAddress(K,l,j); % finds the parent of the current child for each level
           D_tmp(:,:,:,indx(l))=D_ave(:,:,:,indx(l))-D_ave(:,:,:,j);
         end
       end
       H(:,:,j)=PI*H(:,:,j); 
       per(j)=abs(per(j)-1);
       for i=1:M
          D_ave(:,:,i,j)=PI*D_ave(:,:,i,j)*PI';
       end
       if level >0
          for l=1:level
            D_ave(:,:,:,indx(l))=D_tmp(:,:,:,indx(l))+D_ave(:,:,:,j);
          end
       end
    end
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    function [k_min,k_max]=ChildAddress(n,level,K)
    t=0:level-1;
    Num_child=2^level;
    tmp=K./(2.^t);
    k_max=2^(level)*(n-sum(tmp));
    k_min=k_max-Num_child+1;
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    function [address]=CalAddress(K,level,k);
    k_level=FindLevel(K,k);
    address=K+ceil(k/(2^level));
    N_level=log2(K);
    if level>N_level
        level=N_level;
    end
    if level>k_level
      t1=0:level-1;
      if k_level>0
        t2=0:k_level-1;
        tmp2=K./(2.^t2);
      else
        tmp2=0;
      end
      tmp1=K./(2.^t1);
      address=sum(tmp1)+ceil(((k-sum(tmp2))/(2^(level-k_level))));
    else
      address=k;
    end
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    function X = mat(x,n)
    % Y = MAT(x,n)   or   Y = MAT(x)     (the 2nd argument is optional)
    %   Given a vector of length n^2, this produces the n x n matrix
    %   Y such that x = vec(Y).  In other words, x contains the columns of the
    %   matrix Y, stacked below each other.
    %
    % SEE ALSO vec.
    
     %   This file is part of SeDuMi 1.02   (03AUG1998)
     %   Copyright (C) 1998 Jos F. Sturm
     %   CRL, McMaster University, Canada.
     %   Supported by the Netherlands Organization for Scientific Research (NWO).
     % 
     %   This program is free software; you can redistribute it and/or modify
     %   it under the terms of the GNU General Public License as published by
     %   the Free Software Foundation; either version 2 of the License, or
     %   (at your option) any later version.
     % 
     %   This program is distributed in the hope that it will be useful,
     %   but WITHOUT ANY WARRANTY; without even the implied warranty of
     %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     %   GNU General Public License for more details.
     % 
     %   You should have received a copy of the GNU General Public License
     %   along with this program; if not, write to the Free Software
     %   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     %
    
    if nargin < 2
      n = floor(sqrt(length(x)));
      if (n*n) ~= length(x)
        error('Argument X has to be a square matrix')
      end
    end
    if issparse(x)
      X = sparse(1+rem(find(x)-1,n), 1+fix((find(x)-1)/n), nonzeros(x),n,n);
    else
      X = zeros(n,n);
      X(:) = full(x);
      if issparse(x)
        X = sparse(X);
      end
    end
    
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    function [X]=mat_conv(H,S)
      
      [M,N,L]=size(H(:,:,:));
      [Ms,Ns]=size(S);
      X=zeros(M,Ns+L-1);
      for i=1:M
          ShowProgress(i/M, 'Calculating Output Signals......');  
           for j=1:N
          %  X(i,:)=X(i,:)+conv(H(i,j,:),S(j,:));
          X(i,:)=X(i,:)+conv(reshape(H(i,j,:),1,L),S(j,:));
           end
      end
      
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    function [level]=FindLevel(K,n);
    level=0;
    L=log2(K);
    for i=1:L
        t=0:i-1;
        tmp=K./(2.^t);
        level=level+floor(n/(sum(tmp)+1));
    end
      
    %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  
    function ShowProgress(x, title)
    clc
    disp('**********************************************************');
    disp('**********************************************************');
    disp('********ALS Convolutive Blind Source Separation **********');
    disp('********')
    disp(strcat('********', title));
    disp('********')
    fprintf('******** PROGRESS: %d %%\n',fix(x*100));
    disp('**********************************************************');
    
    展开全文
  • 用主成分分析准确估计信号个数,解决了单通道信号盲分离的欠定问题;利用快速独立分量分析(Fast-ICA)算法实现了信号的盲分离。实验信号分别采用仿真信号和列车实验信号进行实验,实验结果表明,该算法可以有效...
  • 针对通信系统接收的时频混叠信号难以分离的特点,以压缩感知(CS)与盲源分离数学模型之间的关系为出发点,利用通信信号固有的稀疏特征,对基于稀疏表示盲源分离几种关键技术进行了探讨与总结,并就进一步研究方向...
  • 23 卷第 2008 年 3 月第 2 期 陈锡明 ,黄硕翼 盲源分离综述 ——— 问题 、 原理和方法 1 1 引言 盲源分离 (BSS) 是信号处理领域的一个基本 问题 ,......盲源分离与神经网络汇报人:刘力 2016/9/30 ?问题来源 鸡尾酒...

    23 卷第 2008 年 3 月第 2 期 陈锡明 ,黄硕翼 盲源分离综述 ——— 问题 、 原理和方法 1 1 引言 盲源分离 (BSS) 是信号处理领域的一个基本 问题 ,......

    盲源分离与神经网络汇报人:刘力 2016/9/30 ?问题来源 鸡尾酒会问题 盲分离(Blind Signal Separation, BSS) 盲源分离(Blind Source Separation) ?发展状况 ? ?...

    电子信息对抗技术·第23卷2008年3月第2期中图分类号:TN971.1 陈锡明,黄硕翼 盲源分离综述——问题、原理和方法 文献标志码:A 文章编号:CN51—1694(2008)02......

    这就说明了盲源的可分离性, 同时也意味着输出达到统计独立就可以实现盲源 分离, ...

    数格子——一种简单的盲源分离方法 陈阳;何振亚;杨绿溪 【期刊名称】《数据采集与处理》 【年(卷),期】2002(017)001 【摘要】将多个随机变量的实现的每个分量......

    本文针对CDMA通信系统中的盲多用户检测问题,将噪声数据的定点ICA算法应用到多用户检测中,实现了多用户信号的分离。通过matlab实验仿真比较了盲自适应检测算法与本文......

    转化为本征 模态函数(IMFs),并抑制噪声;利用主成份分 析对多路 IMFs 进行降维处理,去掉其中的无效成 分;将降维后的多路信号进行独立成分分析来实 现盲源分离。...

    在分析基于最大信噪比盲源分离算法数学模型的基础上,利用C语言编写S函数,并提出了基于最大信噪比盲源分离系统仿真建模的方法.在Matlab/Simulink中,构造C MEX S函数......

    首先介绍 ICA,然后引入 FastICA 算 法的推导过程,最 后通过 MATLAB 仿真将其...因此一旦 B 求出 后,就可以采用 FastICA 算法去实现盲源分离。 由于两个独立......

    采用双概率模型,并在盲分离算法迭代过程中,根据分离结果的统 计特性变化, 动态切换概率模型, 最终实现概率模型与真实源信号概率分布类型 的统一,实现最佳的盲分离......

    一种欠定语音盲源分离方法及装置 (57)摘要 本发明公开了一种欠定语音盲源分离方法 包括以下步骤:获取观测信号,对获取的观测信 号进行处理,并获取语音源信号稀疏......

    几种盲源分离算法的比较 王微微;邵鸣;许建华 【期刊名称】《电脑与信息技术》 【...

    该算法的特点是实现简单、速度快.仿真实验表明,与现有的采用 快速 l1 范数最小化和 OMP 算法的欠定盲源分离方法相比,提出的算法在保证分 离性能的前提下大幅度......

    ChristianJutten 提出了递归神经网络模型和基于 Hebb 学习律的学习算法,以实现两个独立源信号混合的分 离, 这一篇开创性论文的发表使盲源分离问题的研究有了实质性......

    that the waveform after separation was closed to the source singnal.% 针对 ICA 算法不能直接应用于单通道盲分离的问题,提出了基于小波变换的 ICA 盲源分离......

    盲源分离方法研究_生物学_自然科学_专业资料 人阅读|次下载 盲源分离方法研究...

    与设计报告书 摘要简述了独立成分分析的基本原理以及利用 FastICA 算法进行信号分离的理 论依据,并通过 Matlab 仿真实验实现了混合图像的盲分离,取得了较好的分离 ......

    基于人工神经网络的盲源分离研究 杨晓梅 【摘要】[摘要] 本文介绍了盲源分离的神经网络模型,讨论了基于前馈神经 网络和递归神经网络的最常用盲源分离算法的方法和......

    第30卷第6期2014年6月 信 号 处 理 V01.30 No.6 JOURNALOFSIGNALPROCESSING Jun.2014 快速NMF盲源分离算法 刘中健1 赵知劲1’2 尚俊娜1’2(1.杭州电子......

    简述了独立成分分析的 用 基本原理以及利用 FastICA 算法进行信号分离的理论依据,并通过 Matlab 仿真 实验实现了混合图像的盲分离, 取得了较好的分离效果。结果表明......

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 392
精华内容 156
关键字:

单通道盲源分离