JADE盲分离算法仿真

news2025/1/11 16:57:06

JADE算法原理

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

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

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.coloradmin.cn/o/1023800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React+Node——next.js 构建前后端项目

一、安装全局依赖 npm i -g create-next-app二、创建next项目 create-next-app react-next-demo //或 create-next-app react-next-demo --typescript三、加载mysql依赖 npm i -S mysql2四、运行项目 npm run dev五、创建db文件目录&#xff0c;目录下创建index.ts import…

WebRTC系列--sdp协商中的answer编解码协商过程

关于createAnswer的流程在前面的文章WebRTC系列-SDP之CreateAnswer这篇文章中有详细的分析。 这篇文章主要对于MediaSessionDescriptionFactory的AddAudioContentForAnswer做详细的分析,也就是说对于音频编码的匹配也是在这个方法里实现: 首先主要的函数调用如下图: 这篇文…

怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)

《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代&#xff0c; 编著成5000页的《尼恩Java面试宝典》&#xff0c;致力于体系化&#xff0c; 系统化&#xff0c;形象化 梳理&#xff0c;形成一个大的知识体系&#xff0c;从而帮助大家 进大厂&a…

20-SpringCloudAlibaba-1

一 Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为什么要推出Sp…

Python处理英文文档(添加音标和翻译)

Python处理英文文档&#xff08;添加音标和翻译&#xff09; Python处理英文文档单词标注音标英文翻译对word文档的操作方法整合待改进之处 Python处理英文文档 上英语课的时候老师总喜欢找人读文章和翻译文章&#xff0c;一点点的准备太浪费时间&#xff0c;就用Python写了一…

已解决 Python Error: ImportError: No module named ‘module_name‘

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

人声分离网站,帮你快速提取视频中的人声和背景音乐

今天给大家带来一个可以分离人声的网站——音分轨&#xff0c;他运用人工智能算法可以将音频中的人声部分和音乐部分分离&#xff0c;使我们的视频制作过程可以更方便。 我们点击右下角“选择文件”上传一个音频&#xff0c;上传好音频后&#xff0c;人工智能就开始处理我们上传…

同步 -- 信号量

本篇文章基于Linux-6.5源码 建议&#xff1a;搭配Linux源码观看更佳 struct semaphore {raw_spinlock_t lock; // 保护信号量的自旋锁unsigned int count; // 最大同时可访问临界区的进程数量struct list_head wait_list; // 等待队列&#xff0c;wait_list指…

linux 磁盘命令之du和df命令

du相关的命令: du -ah 显示所有目录或文件所占空间 du -KG 显示所有目录或文件所占空间 块大小K为单位 du -BM 显示所有目录或文件所占空间 块大小M为单位 du -BG 显示所有目录或文件所占空间 块大小G为单位du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文…

5.2 磁盘CRC32完整性检测

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法&#xff0c;校验算法可以通过计算应用与数据的循环冗余校验&#xff08;CRC&#xff09;检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测&#xff0c;…

Java“牵手”天猫商品列表页数据采集+天猫商品价格数据排序,天猫API接口申请指南

天猫开放平台接口获取商品列表和详情数据&#xff0c;具体步骤如下&#xff1a; 在开放平台注册并创建一个应用&#xff0c;获取到 App Key 和 App Secret等信息。使用获取到的信息进行签名和认证&#xff0c;获取 Access Token。调用开放平台提供的接口&#xff0c;传入商品 …

PM3398B-6P-1–3P-E 借助物联网和人工智能解决方案

PM3398B-6P-1–3P-E 借助物联网和人工智能解决方案 油砂中的卡车发动机捕获大量数据&#xff0c;如振动、温度、压力和吞吐量等参数。但是这些数据大部分都没有被使用。借助物联网和人工智能解决方案&#xff0c;您可以轻松利用这些数据获得有用的见解。这些见解有助于您提高发…

1.wifi开发,wifi连接初次连接电脑没有识别,搭建环境

wifi连接初次连接电脑没有识别 1.不识别可能是线的问题&#xff0c;即使wifi的灯亮了&#xff0c;虽然串口却没有找到。所以解决方法就是重新来一个usb的线 一。初步使用 &#xff08;1&#xff09;使用ESP烧写工具&#xff08;选择esp8266&#xff09; &#xff08;2&#xf…

TienChin 渠道管理-添加渠道

在我们平时新建一个全新的 Java 类&#xff0c;这个类需要存放的包不存在&#xff0c;可以使用如下的方式进行创建&#xff1a; 含义就是说&#xff0c;将 ChannelVO 这个类放在 vo 这个包当中&#xff0c;如果存在则不创建&#xff0c;存在就将新建的类放入其中。 ChannelVO /…

2000-2018年各省能源消费和碳排放数据

2000-2018年各省能源消费和碳排放数据 1、时间&#xff1a;2000-2018年 2、范围&#xff1a;30个省市 3、指标&#xff1a;id、year、ENERGY、COAL、碳排放倒数*100 4、来源&#xff1a;能源年鉴 5、指标解释&#xff1a; 2018年碳排放和能源数据为插值法推算得到 碳排放…

SpringBoot接口中如何直接返回图片数据

SpringBoot接口中如何直接返回图片数据 目录 接口直接返回图片数据 起因 类似这种 根据个人经验 优雅的实现图片返回 接口直接返回图片数据 起因 最近在做涉及到分享推广的业务&#xff0c;需要由业务员分享二维码进入推广页面&#xff0c;由于是新项目&#xff0c;前期…

Vue.js基本语法上

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.插值 1.1 文本 1.2 v-v-html 1.3 数据双向绑定数据(v-model) 1.4 属性&#xff…

fork函数

二.fork函数 2.1函数原型 fork()函数在 C 语言中的原型如下&#xff1a; #include <unistd.h>pid_t fork(void);其中pid_t是一个整型数据类型&#xff0c;用于表示进程ID。fork()函数返回值是一个pid_t类型的值&#xff0c;具体含义如下&#xff1a; 如果调用fork()的…

Vue3 菜鸟入门(一)超详细:介绍、安装、打包、创建项目、目录结构、起步等

【学习笔记】Vue3 菜鸟入门&#xff08;一&#xff09;超详细&#xff1a;介绍、安装、打包、创建项目、目录结构、起步等 关键词&#xff1a;Vue 、Vue 3、Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含Vue3介绍、安装、打包、创建项目、目录结构、起步…

避雷器雷击计数器检验

试验目的 由于密封不良&#xff0c; 放电计数器在运行中可能进入潮气或水分&#xff0c; 使内部元件锈蚀&#xff0c;导致计数器不能正确动作&#xff0c; 因此需定期试验以判断计数器是否状态良好、 能否正常动作&#xff0c; 以便总结运行经验并有助于事故分析。 带有泄漏电…