


一句话介绍: 这套程序先把 4 个源信号随机混合成 5 路带噪观测,再使用 SOBI(Second-Order Blind Identification,二阶盲辨识)根据不同时间延迟下的二阶统计特征进行联合对角化,在不知道真实混合系数的情况下恢复源信号,并用相关系数和信干比 SIR 评价分离效果。
在很多测量场景中,传感器接收到的并不是单独一个源,而是多个信号叠加后的结果。
多个声源同时被不同麦克风接收;
多个振动源同时传到多个传感器;
多个通信信号在线性通道中发生混合。
如果只观察混合结果,很难直接知道每个原始源分别是什么。
这套程序构造的问题是:
4 个原始信号 → 随机线性混合 → 5 路观测 → 加入噪声 → SOBI 分离 → 恢复源信号 → 计算相关性与 SIR
SOBI 的关键不是利用源信号的具体波形模板,而是利用:
不同源信号在多个时间延迟下具有不同的自相关结构。
1. 这个工程真正包含什么?
工程很小,真正需要关注的只有几个文件。
文件 | 作用 |
|---|---|
| 主程序,完成源信号选择、随机混合、加噪、SOBI 分离和结果评价 |
| SOBI 核心算法:中心化、白化、时延相关矩阵和联合对角化 |
| 用绝对相关系数匹配原始源和分离分量 |
| 根据系统串扰矩阵计算各源 SIR |
| 预先准备好的源信号库 |
run.asv 是 MATLAB 自动保存文件,与正式运行逻辑基本相同,不需要单独理解。
2. 程序使用了多少个源信号?
参与实验的是:4 个源信号,每个源 8000 个采样点。
这 4 路源在零时延下的两两线性相关系数都非常小,最大绝对值约为:0.012
说明它们在当前数据上彼此近似不相关,很适合用来演示基于二阶统计量的盲源分离。
3. 程序怎样制造“混合信号”?
混合模型可以写成:X = A·S
其中:
S:4×8000 的源信号矩阵;
A:5×4 的未知混合矩阵;
X:5×8000 的观测矩阵。
也就是说,每一个接收通道都同时包含 4 个源的不同权重叠加。
4. 程序加入噪声
主程序运行后会要求用户输入:SNR
然后对 5 路混合观测分别调用 awgn 加入高斯白噪声。
因此实际进入 SOBI 的数据更接近:
X = A·S + N
其中 N 表示噪声。
SNR 越高,噪声相对越弱;
SNR 越低,混合观测受到的噪声影响越明显,通常也会增加盲源分离难度。
由于 SNR 是用户运行时输入的,而且混合矩阵和噪声也具有随机性,所以这个工程不存在一个固定不变的最终 SIR 数值。
5. SOBI 为什么能够在不知道 A 的情况下分离信号?
如果不同源之间互不相关,那么源信号在某个时间延迟 τ 下的相关矩阵可以近似写成对角形式:
Rₛ(τ) ≈ diag[r₁(τ), r₂(τ), …]
对于混合观测:
X = A·S
对应的时延相关矩阵满足:
Rₓ(τ) ≈ A·Rₛ(τ)·Aᵀ
这里最重要的地方是:
对于多个不同的时间延迟 τ,真正的源信号坐标系应该能够让这些相关矩阵同时尽量接近对角矩阵。
SOBI 就是反过来利用这一特点,寻找能够把多个时延相关矩阵同时对角化的变换。
6. 第一步:先把观测信号变成零均值
sobi.m 首先对每一路接收数据减去自己的平均值。
可以写成:X₀ = X - mean(X)
这样做是为了去掉直流分量,使后面的二阶统计分析主要描述信号的波动和相关结构。
这一步本身不能完成分离,但属于后续白化和相关矩阵计算的重要预处理。
7. 第二步:为什么要做白化?
程序对中心化后的观测矩阵进行 SVD:
X₀ᵀ = UΣVᵀ
然后构造白化矩阵 Q,并得到:
Z = Q·X₀
白化后的目标是让零时延协方差接近单位阵:
R_z(0) ≈ I
简单理解:先去掉各观测通道之间由尺度和即时相关性造成的影响,把后续问题主要转换成“寻找一个旋转方向”。
这样联合对角化需要估计的自由度会明显减少。
8. 为什么多个时延比只看一个协方差更有用?
零时延协方差只能描述:“两个信号在同一时刻是否相关。”
但很多不同源在零时延下都可能近似不相关,这时单靠 R(0) 很难继续区分。
SOBI 进一步观察:
延迟 1 点以后怎样相关;延迟 3 点以后怎样相关;
延迟 5 点以后怎样相关;延迟 7 点以后怎样相关。
如果不同源具有不同的时间结构,那么它们的自相关随 τ 的变化也会不同。
这就是 SOBI 的核心优势:
不是依赖高阶统计量,而是利用多时延二阶统计信息来区分具有不同时间相关结构的源。
9. 第三步:联合对角化到底在做什么?
程序把多个时延相关矩阵并排存入 M,然后不断使用 Givens 旋转调整矩阵方向。
目标可以概括成:
寻找 V,使 VᵀR_z(τ)V 在多个 τ 下都尽量接近对角矩阵。
可以用一个简单目标理解:
min Στ off[VᵀR_z(τ)V]
其中 off 表示矩阵非对角元素的整体大小。
如果找到合适的 V,那么不同输出分量之间的时延互相关就会被尽量削弱。
程序使用一系列两两 Givens 旋转,不断更新:
相关矩阵 M、联合对角化矩阵 V
直到旋转量低于阈值。
当前停止阈值为:
ε = 1 / (100√N)
10. 最终源信号怎样恢复?
白化以后,程序得到 Z。
联合对角化完成后,恢复信号为:
Y = Vᵀ·Z
其中:
Y:SOBI 输出的分离分量;
V:联合对角化得到的变换矩阵。
程序还计算:
W = pinv(Q)·V
并把 W 注释为估计得到的混合矩阵。
如果 SOBI 分离理想,那么 W 应该和真实随机混合矩阵 A 在排列和尺度意义下对应。
11. 为什么恢复出来的信号顺序可能和原始信号不同?
盲源分离存在一个很典型的问题:
分离算法通常无法自动知道“这个输出原来应该叫源 1 还是源 3”。
例如真实源顺序是:S₁、S₂、S₃、S₄
分离以后可能得到:Y₃、Y₁、Y₄、Y₂
而且某个分量还可能整体变成负号:Y ≈ -S
这不代表分离失败,因为信号波形本身仍然被恢复。
因此盲源分离通常存在:排列不确定性、尺度 / 符号不确定性
12. coef.m 为什么要计算绝对相关系数?
为了在仿真中判断“哪个分离分量对应哪个真实源”,程序计算:
C(i,j) = |corr(Sᵢ, Yⱼ)|
然后对于每个真实源 Sᵢ,找到相关系数最大的输出分量。
因为使用的是绝对值,所以:
Y ≈ S、Y ≈ -S
都会得到很高的匹配相关性。
这正好解决了盲源分离中的符号不确定问题。
需要强调:
原始源信号只用于实验结束后的匹配和性能评价,并没有参与 SOBI 的联合对角化分离过程。
所以核心分离本身仍然是盲的。
13. SIR 是怎样评价分离质量的?
主程序利用估计混合矩阵 W 和真实混合矩阵 A 计算系统矩阵:
T = W⁻¹A
理想情况下,如果分离完全正确,经过适当排列和尺度归一化以后,T 应该接近单位阵:T ≈ I
也就是说:
主对角元素代表目标源;
非对角元素代表其他源泄漏进来的干扰。
sir.m 会先让每一行的主导分量归一化为 1,再计算:
SIRᵢ = 10log₁₀[1 / (Σⱼ|Tᵢⱼ|² - 1)]
因此:非目标源泄漏越小,SIR 越高,说明分离越干净。
程序最后同时输出:每个源的 SIR、所有源的平均 SIR avesir
14. 为什么 SOBI 特别适合这类信号?
当前 4 路源在零时延下已经接近互不相关。
如果只看普通协方差,很难继续区分。
SOBI 再利用多个时延下的相关结构,使不同源之间的动态差异成为分离依据。
一些 ICA 方法需要利用偏度、峰度或其他高阶统计量。
SOBI 主要依赖协方差和时延相关矩阵,因此理论结构比较清楚,而且对于具有明显时间相关性的信号很自然。
单个时延可能不够稳定。
程序同时使用 1、3、5、7 四个时延,相当于要求同一个 V 同时解释多组相关矩阵。
这种“共同满足多个条件”的方式比只对一个矩阵做对角化更有辨识能力。
如果源信号具有不同的功率谱或自相关结构,SOBI 能够利用这种差异进行分离。
所以它尤其适合:
不是完全白噪声,而是具有明显时间结构的随机或周期信号。
15. 这个程序适合用在哪里?
多个麦克风同时收到多个声源时,可以研究瞬时线性混合条件下的盲分离。
多个机械振动源被多个传感器同时测到时,如果各源具有不同的时间相关结构,可以利用 SOBI 研究源成分恢复。
SOBI 常用于研究多通道观测中具有不同时间结构的潜在源成分。当前工程属于算法 Demo,并没有针对具体医学数据做专门处理。
程序完整展示了:
随机混合 → 加噪 → 白化 → 多时延相关矩阵 → 联合对角化 → 源匹配 → SIR
非常适合理解二阶盲辨识的基本逻辑。
16. 怎么运行?
主程序为:run.m
运行过程:保持 run.m、sobi.m、coef.m、sir.m 和 s_option.mat 在 MATLAB 当前路径;
程序自动选取 4 路源信号;自动生成随机 5×4 混合矩阵;
输入希望测试的 SNR;程序给 5 路观测加入高斯白噪声;
自动执行 SOBI;最后输出各源 SIR 和平均 SIR。
程序调用了 awgn,因此 MATLAB 环境需要能够提供这个函数。
17. 哪些参数最值得修改?
参数 | 当前值 | 主要作用 |
源信号索引 |
| 从 8 路库中选哪 4 路源 |
源信号数 | 4 | 当前实验真实源数量 |
接收通道数 m | 5 | 混合观测数量 |
样本数 | 8000 | 每路信号长度 |
SNR | 用户输入 | 高斯噪声强度 |
SOBI 时延个数 | 4 | 当前使用 4 个时延 |
实际时延 | 1、3、5、7 | 用于相关矩阵联合对角化 |
对角化阈值 | 1/(100√N) | Givens 旋转停止条件 |
最值得做的实验包括:
逐渐降低 SNR,看平均 SIR 如何变化;改变源信号组合;
改变时延个数;改变接收通道数量。
18. 一句话看懂这个项目
这是一个 MATLAB SOBI 二阶盲源分离程序:用随机 5×4 矩阵将它们混合成 5 路观测并加入用户指定 SNR 的高斯白噪声;SOBI 先对观测进行零均值和 SVD 白化,通过 Givens 旋转进行联合对角化,最后恢复候选源分量,并利用已知真值相关系数解决排列/符号匹配,再通过 SIR 评价分离后的串扰水平。