JADE盲分离算法仿真
JADE算法原理
JADE 算法首先通过去均值预白化等预处理过程得到解相关的混合信号,预处理后的信号构建的协方差矩阵变为单位阵,为后续的联合对角化奠定基础;其次,通过建立四阶累积量矩阵,利用高阶累积量的统计独立性等性质从白化后的传感器混合(观测)信号中得到待分解的特征矩阵;最后,通过特征矩阵联合对角化和Givens 旋转得到酉矩阵U,从而获得盲源分离算法中混合矩阵A 的有效估计,进而分离出需要的目标信号。
JADE算法的流程图如下:
下面是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函数进行解混合,最后对解混合的信号进行绘制并进行读取。
可以听到两段录音的内容不一样,音调也不用,它们满足不相关性,因此能够很好的分离。由下图可以看出,分离后的信号的幅度和真实信号有所不同,并且排序也不同,这是盲分离算法本身的局限性:即幅度模糊性和排序模糊性。但是一般情况下,信号的信息保存在波形的变化中,人们对于其绝对幅度并不敏感。
结果如下图:
链接:https://pan.baidu.com/s/1DwnZqDBc1sogERcq7RrVqA
提取码:ngk1
相关文章:

JADE盲分离算法仿真
JADE算法原理 JADE 算法首先通过去均值预白化等预处理过程得到解相关的混合信号,预处理后的信号构建的协方差矩阵变为单位阵,为后续的联合对角化奠定基础;其次,通过建立四阶累积量矩阵,利用高阶累积量的统计独立性等性…...
CMake教程-第 1 步:基本起点
CMake教程-第 1 步:基本起点 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Adding Support for…...

Linux 或者 Docker 容器通过 date 设置系统时间
目录 1. Linux2. Docker 容器2.1 进入容器内部修改2.2 可能会遇到的问题 1. Linux 要在Linux系统中设置日期和时间,可以使用date命令。 使用以下命令格式来设置日期和时间: sudo date -s "YYYY-MM-DD HH:MM:SS"其中,YYYY表示年份…...
Docker 容器中运行 Kibana
Kibana 的 Docker 镜像可以从 Elastic 官网上的 Docker 镜像仓库获取。该镜像是随 X-Pack 一起打包的。 X-Pack 在这个 image 中是预装好的。安装了 X-Pack,Kibana 会去连接同样带有 X-Pack 的 Elasticsearch 集群。 获取镜像 向 Elastic Docker 仓库发送一条 do…...
【23种设计模式】建造者模式【⭐⭐⭐】
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...

进阶指针(一)
✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 进阶指针(一) 0.回顾初阶指针1.字符指针1.1 相关面试题 2.数组指针3.指针数组3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4.数组传参和指针传参4.…...
Linux: code: name: void dev_deactivate(struct net_device *dev)
一开始看这个函数,还以为要做,网卡设备的down操作。 后来一看代码,原来这个函数是在net/sched/sch_generic.c 文件里,而且不是要做网络接口的down操作。操作的结果是:deactivate transmissions on several devices&…...

语义分割——灰度图像转伪彩色图像
目录 检验灰度图检验代码 灰度图转伪彩色图代码转换代码使用细则 示例转换结果总结 检验灰度图 制作语义分割数据集或用训练好模型测试图像时,得到的结果是灰度图像,如下: 检验代码 上面图像灰度值不是全是全为0,灰度范围在[0…...

观察级水下机器人使用系列之七机械手臂
本期是观察级水下机器人使用系列的最后一期,主要讲ROV所使用的机械臂。机械臂正式名称为5功能电动机械,型号为BE-500,由法国公司Ocean Innovation System设计的,可代替人工进行水下作业,完成海底样品采集、打捞、设备定…...
char s[]和char *s的区别,数组和指针的,堆和栈指针的一些思考
最近在学习的时候看到一个概念,数组不等价于指针,很合理但又很难理解。 例如char s[]和char *s有什么区别,前者是数组,后者是指针,个人学习成果如下: 1.char s[]和char *s的区别 char s[]: …...
Flutter快速入门学习(二)
目录 Dart介绍 一些Dart的重要概念 Dart语法学习 变量 内建类型 Number String Boolean List Set Map Symbol 函数 参数类型(可选参数,必选参数) 函数作为另一个函数的参数 匿名函数 运算符 关系运算符 类型判定运算符 赋…...

【Phoenix】phoenix实现每个Primarykey主键保留N版本数据,CDC数据记录为Changelog格式
一、背景: CDC数据中包含了,数据的变更过程。当CDC写入传统数据库最终每一个primary key下会保存一条数据。当然可以使用特殊手段保存多分记录但是显然造成了数据膨胀。 另外数据湖Hudi(0.13.1)是不支持保存所有Changelog其Compaction机制会清除所有旧版…...

阿里云服务器开放的一个新端口,重启防火墙,端口未启动
问题: 阿里云网页开放的一个新端口后,重启防火墙,端口未启动,之前配置的也都停止了。 解决: 原因可能是阿里的服务控制了,只能一个个端口开启了。把新配置新端口也单独启用。 开启80端口指令 firewall-cm…...

【PHPCUSTOM】打包PHP程序为EXE
目录 一、下载PHPCUSTOM 二、PHP网站打包 1、打开PHPCUSTOM 2、配置参数 3、生成exe文件 网上很多PHP程序打包成EXE的文章,但是都不能用,最后找到了PHPCUSTOM,使用PHPCUSTOM可以把PHP程序打包成exe。我们都知道PHP是服务端语言ÿ…...

药品咨询报告合集整理平台打包(一共36597份)【专题推荐】
<医药行业从业者必看>笔者今天分享高价值医药行业报告36500余份的获取/下载方法,报告涵盖了医药细分领域研究报告药品报告(所有上市药品)医药行业分析报告医药环境观察报告药品市场调研报告药品靶点研究报告医药白皮书;数据…...

数字化管理新革命,AI数字人CEO登场引领变革!
王一博老板乐华娱乐CEO杜华推出了她的双生数字人华华子,专门替自己直播卖货。在没有任何宣传的情况下,仅仅在短短的10分钟直播时间内,观众人数就飙升至30万人!同时,“杜华AI华华子直播”更是迅速登上了微博热搜榜。这一…...

FPGA/数字IC(芯海科技2022)面试题 2(解析版)
以下仅为学习参考(非原创),如有疑惑欢迎评论区指出! 一、单选题(共20题,每题3分,共60分) 1. D触发器:Tsetup3ns,Thold1ns,Tck2q1ns, 该D触发器最大可运行时…...

SpringMVC之JSON数据返回与异常处理机制---全方面讲解
一,JSON数据返回的理解 在Spring MVC中,当需要将数据以JSON格式返回给客户端时,可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON,并…...
信息化发展53
数据标准化 1 、数据标准化是实现数据共享的基础。 2 、数据标准化的主要内容包括元数据标准化、数据元标准化、数据模式标准化、数据分类与编码标准化和数据标准化管理。 元数据标准化 1 、元数据是关于数据的数据( Data About Data )。其实质是用于…...
Java学习笔记——字符/字符串
在 Java 语言中,字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现 StringBuilder 字符 字符是用单引号括起来的单个字母,在Java中,表示字符的数据类型为char。一个字符…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...