JADE盲分离算法仿真

JADE算法原理

JADE 算法首先通过去均值预白化等预处理过程得到解相关的混合信号,预处理后的信号构建的协方差矩阵变为单位阵,为后续的联合对角化奠定基础;其次,通过建立四阶累积量矩阵,利用高阶累积量的统计独立性等性质从白化后的传感器混合(观测)信号中得到待分解的特征矩阵;最后,通过特征矩阵联合对角化和Givens 旋转得到酉矩阵U,从而获得盲源分离算法中混合矩阵A 的有效估计,进而分离出需要的目标信号。
JADE算法的流程图如下:

混合信号
白化
四阶累计量矩阵
特征矩阵联合对角化和Givens旋转
得到酉矩阵
解混合
源信号

下面是JADE算法的公式推导,从论文中截的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JADE仿真程序

JADE算法的函数:

function [A,S]=jade(X,m) 
% Source separation of complex signals with JADE. 
% Jade performs `Source Separation' in the following sense: 
%   X is an n x T data matrix assumed modelled as X = A S + N where 
%  
% o A is an unknown n x m matrix with full rank. 
% o S is a m x T data matrix (source signals) with the properties 
%    	a) for each t, the components of S(:,t) are statistically 
%    	   independent 
% 	b) for each p, the S(p,:) is the realization of a zero-mean 
% 	   `source signal'. 
% 	c) At most one of these processes has a vanishing 4th-order 
% 	   cumulant. 
% o  N is a n x T matrix. It is a realization of a spatially white 
%    Gaussian noise, i.e. Cov(X) = sigma*eye(n) with unknown variance 
%    sigma.  This is probably better than no modeling at all... 
% 
% Jade performs source separation via a  
% Joint Approximate Diagonalization of Eigen-matrices.   
% 
% THIS VERSION ASSUMES ZERO-MEAN SIGNALS 
% 
% Input : 
%   * X: Each column of X is a sample from the n sensors 
%   * m: m is an optional argument for the number of sources. 
%     If ommited, JADE assumes as many sources as sensors. 
% 
% Output : 
%    * A is an n x m estimate of the mixing matrix 
%    * S is an m x T naive (ie pinv(A)*X)  estimate of the source signals 
[n,T]	= size(X); %%  source detection not implemented yet ! 
if nargin==1, m=n ; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% A few parameters that could be adjusted 
nem	= m;		% number of eigen-matrices to be diagonalized 
seuil	= 1/sqrt(T)/100;% a statistical threshold for stopping joint diag %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%% whitening 
% 
if m<n, %assumes white noise [U,D] 	= eig((X*X')/T);  [puiss,k]=sort(diag(D)); ibl 	= sqrt(puiss(n-m+1:n)-mean(puiss(1:n-m))); bl 	= ones(m,1) ./ ibl ; W	= diag(bl)*U(1:n,k(n-m+1:n))'; IW 	= U(1:n,k(n-m+1:n))*diag(ibl); 
else    %assumes no noise IW 	= sqrtm((X*X')/T); W	= inv(IW); 
end; 
Y	= W*X; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%% Cumulant estimation R	= (Y*Y' )/T ; 
C	= (Y*Y.')/T ; Yl	= zeros(1,T); 
Ykl	= zeros(1,T); 
Yjkl	= zeros(1,T); Q	= zeros(m*m*m*m,1) ; 
index	= 1; for lx = 1:m ; Yl 	= Y(lx,:); 
for kx = 1:m ; Ykl 	= Yl.*conj(Y(kx,:)); 
for jx = 1:m ; Yjkl	= Ykl.*conj(Y(jx,:)); 
for ix = 1:m ;  Q(index) = ... (Yjkl * Y(ix,:).')/T -  R(ix,jx)*R(lx,kx) -  R(ix,kx)*R(lx,jx) -  C(ix,lx)*conj(C(jx,kx))  ; index	= index + 1 ; 
end ; 
end ; 
end ; 
end %% If you prefer to use more memory and less CPU, you may prefer this 
%% code (due to J. Galy of ENSICA) for the estimation the cumulants 
%ones_m = ones(m,1) ;  
%T1 	= kron(ones_m,Y);  
%T2 	= kron(Y,ones_m);   
%TT 	= (T1.* conj(T2)) ; 
%TS 	= (T1 * T2.')/T ; 
%R 	= (Y*Y')/T  ; 
%Q	= (TT*TT')/T - kron(R,ones(m)).*kron(ones(m),conj(R)) - R(:)*R(:)' - TS.*TS' ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%computation and reshaping of the significant eigen matrices [U,D]	= eig(reshape(Q,m*m,m*m));  
[la,K]	= sort(abs(diag(D))); %% reshaping the most (there are `nem' of them) significant eigenmatrice 
M	= zeros(m,nem*m);	% array to hold the significant eigen-matrices 
Z	= zeros(m)	; % buffer 
h	= m*m; 
for u=1:m:nem*m,  Z(:) 		= U(:,K(h)); M(:,u:u+m-1)	= la(h)*Z; h		= h-1;  
end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%% joint approximate diagonalization of the eigen-matrices %% Better declare the variables used in the loop : 
B 	= [ 1 0 0 ; 0 1 1 ; 0 -i i ] ; 
Bt	= B' ; 
Ip	= zeros(1,nem) ; 
Iq	= zeros(1,nem) ; 
g	= zeros(3,nem) ; 
G	= zeros(2,2) ; 
vcp	= zeros(3,3); 
D	= zeros(3,3); 
la	= zeros(3,1); 
K	= zeros(3,3); 
angles	= zeros(3,1); 
pair	= zeros(1,2); 
c	= 0 ; 
s	= 0 ; %init; 
encore	= 1; 
V	= eye(m);  % Main loop 
while encore, encore=0; for p=1:m-1, for q=p+1:m, Ip = p:m:nem*m ; Iq = q:m:nem*m ; % Computing the Givens angles g	= [ M(p,Ip)-M(q,Iq)  ; M(p,Iq) ; M(q,Ip) ] ;  [vcp,D] = eig(real(B*(g*g')*Bt)); [la, K]	= sort(diag(D)); angles	= vcp(:,K(3)); if angles(1)<0 , angles= -angles ; end ; c	= sqrt(0.5+angles(1)/2); s	= 0.5*(angles(2)-j*angles(3))/c;  if abs(s)>seuil, %%% updates matrices M and V by a Givens rotation encore 		= 1 ; pair 		= [p;q] ; G 		= [ c -conj(s) ; s c ] ; V(:,pair) 	= V(:,pair)*G ; M(pair,:)	= G' * M(pair,:) ; M(:,[Ip Iq]) 	= [ c*M(:,Ip)+s*M(:,Iq) -conj(s)*M(:,Ip)+c*M(:,Iq) ] ; end%% if end%% q loop end%% p loop 
end%% while %%%estimation of the mixing matrix and signal separation 
A	= IW*V; 
S	= V'*Y ; return ; 

主程序:

%% JADE算法仿真
% 输入信号为两段语音,混合矩阵为随机数构成,
% 采用基于四阶累计量的特征矩阵联合近似对角化JADE算法对两段语音进行分离,并绘制了源信号、混合信号和分离信号
% Author:huasir 2023.9.19 Beijing
close all,clear all;clc;
%=========================================================================%
%                          读取语音文件,输入源信号                       %
%=========================================================================%
[S1,fs1] = audioread('E:\sound1.wav'); % 读取原始语音信号,需要将两个语音文件放置在相应目录下
[S2,fs2] = audioread('E:\ICA\sound2.wav');
figure;
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');
%=========================================================================%
%               采用JADE算法进行盲源分离,得到源信号的估计                %
%=========================================================================%
[Ae,Se]=jade(MixedS,2);  %Ae为估计的混合矩阵,Se为估计的源信号
% 将混合矩阵重新排列并输出
subplot(3,2,5),plot(Se(1,:)),title('JADE解混信号1');
subplot(3,2,6),plot(Se(2,:)),title('JADE解混信号2');
%=========================================================================%
%        源信号、混合信号以及解混合之后的信号的播放                       %
%=========================================================================%
% sound(S1,8000); %播放输入信号1
% sound(S2,8000); %播放输入信号2
% sound(MixedS(1,:),8000); %播放混合信号1
% sound(MixedS(2,:),8000); %播放混合信号2
% sound(Se(1,:),8000); %播放分离信号1
% sound(Se(2,:),8000); %播放分离信号2
fprintf('混合矩阵为:\n'); % 输出混合矩阵以及估计的混合矩阵
disp(Sweight);
fprintf('估计的混合矩阵为:\n');
disp(Ae);

然后对其进行混合,混合后调用JADE函数进行解混合,最后对解混合的信号进行绘制并进行读取。
可以听到两段录音的内容不一样,音调也不用,它们满足不相关性,因此能够很好的分离。由下图可以看出,分离后的信号的幅度和真实信号有所不同,并且排序也不同,这是盲分离算法本身的局限性:即幅度模糊性和排序模糊性。但是一般情况下,信号的信息保存在波形的变化中,人们对于其绝对幅度并不敏感。
结果如下图:
在这里插入图片描述

图1. JADE算法分离结果
在主程序中,首先是读取语音文件,语音文件由以下链接给出,当然也可以自己生成源信号。

链接:https://pan.baidu.com/s/1DwnZqDBc1sogERcq7RrVqA
提取码:ngk1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/115455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口自动化测试框架postman tests常用方法

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; postman常用方法集合&#xff1a; 1.​​​​​​设置环境变量 postman.setEnvironmentVariable("…

OceanBase杨传辉传递亚运火炬:国产数据库为“智能亚运”提供稳稳支持

9 月 14 日&#xff0c;亚运火炬传递到了浙江台州&#xff0c;OceanBase 的 CTO 杨传辉作为火炬手交接了第 89 棒火炬。 2010 年&#xff0c;杨传辉作为创始成员之一参与自研原生分布式数据库 OceanBase。十年磨一剑&#xff0c;国产数据库 OceanBase 交出了一张优秀的成绩单&a…

三相组合式过电压保护器试验

三相组合式过电压保护器试验 试验目的 三相组合式过电压保护器主要分为有带串联间隙过压保护器和无间隙过压保护器两大类&#xff0c;其试验项目内容要求分别使用高压工频交流和高压直流电源。 三相组合式过电压保护器试验&#xff0c;主要是为了及早发现设备内部绝缘受潮及…

九芯电子丨语音智能风扇,助您畅享智慧生活

回忆童年时期的传统机械风扇&#xff0c;那“古老”的扇叶连摆动看起来是那么吃力。在一个闷热的夏夜&#xff0c;风扇的噪音往往令人印象深刻。但在今天&#xff0c;静音家用风扇已取代了传统的机械风扇。与此同时&#xff0c;随着智能化的发展&#xff0c;智能家居已逐渐成为…

C语言强化练习(一): 初识C语言

文章目录 一、问答题1.1 C语言开发过程是怎样的&#xff1f;1.2 C语言的应用领域有哪些&#xff1f; 二、上机题2.1 第一个C语言程序2.2 一个完整的C语言程序2.3 输出名言2.4 计算出正方形的周长 一、问答题 1.1 C语言开发过程是怎样的&#xff1f; 问题描述&#xff1a;C语言…

排序算法-----归并排序

目录 前言&#xff1a; 归并排序 1. 定义 2.算法过程讲解 2.1大致思路 2.2图解示例 拆分合成步骤 ​编辑 相关动态图 3.代码实现&#xff08;C语言&#xff09; 4.算法分析 4.1时间复杂度 4.2空间复杂度 4.3稳定性 前言&#xff1a; 今天我们就开始学习新的排序算法…

VisualStudio配置opencv

下载opencv 链接&#xff1a;https://opencv.org/releases/ 我下载的是4.7.0&#xff0c;选择windows下载。 下载成功后打开exe文件&#xff0c;选择路径安装。 配置环境变量 安装成功后找到安装目录&#xff0c;复制bin目录路径。 我的是放在了D盘 D:\Opencv4.7.0\opencv…

李超线段树

李超线段树 概念 李超线段树是巨佬李超发明的一种可以求函数定点最值的线段树&#xff0c;又名李超树。代码简短&#xff0c;思想简明&#xff0c;用途广泛。 问题 李超线段树是用来解决类似于这种问题 题目传送门 要求在平面直角坐标系下维护两个操作&#xff1a; 在平面上…

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数&#xff1a;全局安装的特性 包的删除npm uni…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Dashdot服务器仪表盘

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Dashdot服务器仪表盘 一、云耀云服务器L实例介绍二、Dashdot介绍2.1 Dashdot简介2.2 开发环境要求2.3 Yarn介绍 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、检查服务器环境4.1 购买云耀云服务器L实例…

MySQL进阶 —— 超详细操作演示!!!(中)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;中&#xff09; 三、SQL 优化3.1 插入数据3.2 主键优化3.3 order by 优化3.4 group by 优化3.5 limit 优化3.6 count 优化3.7 update 优化 四、视图/存储过程/触发器4.1 视图4.2 存储过程4.3 存…

JDBC基本概念

什么是JDBC JDBC概念 JDBC&#xff08;Java DataBase Connectivity&#xff09;是一套统一的基于Java语言的关系数据库编程接口规范。 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库&#xff0c; …