1. 项目概述在水下探测、无线通信、雷达感知这些领域搞清楚一个信号是从哪个方向来的也就是所谓的“波达方向”估计一直是个既基础又棘手的问题。想象一下在一片漆黑的海底你只能通过几个水听器捕捉到的微弱声音去判断一艘潜艇或者一群鱼群的位置这难度可想而知。传统的数学方法比如经典的MUSIC算法或者ESPRIT算法就像是拿着一个固定的公式去套用在信号干净、环境简单的时候还行一旦背景噪音大起来或者信号源靠得太近这些方法的“耳朵”就不太灵光了分辨率会急剧下降。最近几年深度学习的浪潮也拍打到了这个领域。大家发现卷积神经网络这种能从数据里自己学特征的“黑盒子”在处理这类问题上有着惊人的潜力。很多研究直接把阵列接收信号的协方差矩阵——这个包含了信号空间关系的“指纹”——扔给CNN去学习效果确实比传统方法好不少。但这里有个问题计算协方差矩阵本身就是一个对原始信号做“摘要”的过程。就像你听一段录音然后只记下每分钟的平均音量虽然抓住了大概但那些细微的起伏、瞬间的变化可能就丢掉了。在低信噪比环境下这些被“摘要”掉的细节也许恰恰是区分不同方向信号的关键。所以我们一直在琢磨有没有可能让模型直接“听”原始的阵列信号自己学会从中提取有用的空间特征而不是我们先帮它做一遍可能“失真”的预处理这就引出了我们这次尝试的核心把Mamba模型和CNN结合起来。Mamba是状态空间模型家族的新秀它最擅长处理的就是长序列数据而且计算效率很高。我们琢磨着既然原始信号序列包含了最完整的信息那不如让Mamba先来“消化”这个长序列学习信号在时间维度上的动态特性然后再交给CNN去聚焦空间维度的特征。这个思路有点像先让一个专家梳理时间线索再让另一个专家分析空间布局两者协作或许能看得更清楚。2. 核心思路与方案设计2.1 问题本质与现有方案的瓶颈DOA估计的根本任务是根据一个由M个阵元组成的阵列接收到的信号反推出K个远场窄带信号源的入射角度θ。数学模型可以简洁地表示为X A(θ)S N。其中X是M个阵元的接收数据矩阵A(θ)是导向矢量矩阵由角度θ决定S是源信号N是噪声。所有算法都是在和噪声N作斗争并试图从X中尽可能准确地恢复出θ。传统子空间类算法如MUSIC的基石是阵列协方差矩阵R E[XX^H]的特征分解。它们假设信号子空间与噪声子空间正交通过谱峰搜索来估计DOA。这类方法的性能在信噪比高、信号源不相关时接近理论极限但其瓶颈也显而易见一、对信噪比敏感低信噪比时子空间估计不准性能暴跌二、需要已知或准确估计信源数K三、对于相干源如多径信号性能严重下降。虽然后续有空间平滑等改进但根本性的局限难以突破。深度学习特别是CNN的引入改变了游戏规则。它不依赖于严格的数学模型假设而是试图从海量数据中直接学习从观测数据X或其某种变换到角度θ的复杂映射关系。主流做法是将计算好的协方差矩阵R或其实部、虚部、幅度谱等变体作为二维“图像”输入CNN。CNN通过卷积层自动学习其中的空间特征模式最终输出角度估计。这种方法在低信噪比、相干源场景下展现出了更强的鲁棒性。然而“将协方差矩阵作为输入”这个选择本身可能就是一个次优解。协方差矩阵是对原始信号二阶统计特性的一个估计这个计算过程已经丢失了信号的相位细节和更高阶的统计信息。在低信噪比下这个估计本身就不准相当于给CNN喂了有“先天缺陷”的食材。我们能不能跳过这个“预处理厨师”让模型直接从“原始食材”原始信号开始烹饪2.2 Mamba模型为何是破局关键这就轮到状态空间模型特别是Mamba登场了。要理解Mamba可以先回想一下循环神经网络和Transformer。RNN擅长处理序列但无法并行训练Transformer凭借注意力机制横扫千军但其计算复杂度随序列长度呈平方增长处理超长序列时内存和算力都是噩梦。状态空间模型提供了一条新路径。它源自控制理论中的经典状态空间方程可以简单理解为系统有一个内部状态h当前输出y由当前输入x和上一时刻状态h共同决定。其离散化形式为h(t) Ā * h(t-1) B̄ * x(t)y(t) C * h(t)其中Ā, B̄, C是参数。神奇的是这个递推关系可以通过一个巧妙的数学变换转化为一个全局卷积操作y x * K̄其中K̄是一个由Ā, B̄, C构成的卷积核。这意味着SSM同时具备了RNN的序列建模能力和CNN的并行计算效率。Mamba在基础SSM上做了关键改进选择性。传统SSM的参数Ā, B̄是静态的与输入无关。而Mamba让B和C甚至时间步长Δ成为输入x的函数。这使得模型能够“选择性”地记住或忽略输入序列中的信息类似于注意力机制的动态加权但计算仍是线性的。因此Mamba能以接近线性的复杂度处理极长序列且对长程依赖关系建模能力强大。对于我们的DOA估计问题原始阵列信号正是一个典型的长序列数据时间采样点数L通常很大。Mamba的能力恰好匹配这一需求它可以高效地扫描整个时间序列捕捉信号随时间演化的全局依赖关系并可能滤除部分时间维度的噪声为后续的空间特征提取提供一个更“干净”或更“富含信息”的表示。2.3 整体架构设计Mamba-CNN混合模型我们的核心设计思想是“分阶段、各司其职”。整个模型管道如下图所示概念图原始复信号 X (M阵元 x L快拍) | v [整形与通道分离] -- 实部通道 虚部通道 (拼接) | v [Mamba层] -- 处理长序列捕获时间依赖输出增强后的序列表示 | v [计算协方差矩阵] -- 在模型内部动态生成“特征图” | v [CNN特征提取层] -- 从协方差矩阵中提取空间角度特征 | v [全连接分类层] -- 输出181个角度-90°到90°的概率 | v Sigmoid激活 BCELoss训练这个流程有几个关键设计点输入处理我们直接输入原始复信号X。为了适配Mamba论文指出实数网络可能表现更好我们将实部和虚部分离拼接成一个(Batch, 2*M, L)的实数张量作为Mamba的输入。这里2*M是“通道”数L是序列长度。Mamba的角色Mamba层在这里不是一个简单的特征提取器而是一个自适应序列处理器。它不对信号做任何固定的变换如STFT或协方差计算而是通过训练学会如何从原始的、可能充满噪声的L点时间序列中提炼出对后续角度判别最有用的时序特征。这个过程是数据驱动的、自适应的。内部协方差计算经过Mamba处理后的序列维度发生了变化但依然保持了“阵元×时间”的结构。我们在模型内部显式地计算其协方差矩阵。这一步至关重要它将Mamba输出的、富含信息的时序表示转换为一个标准的、表征空间相关性的矩阵从而无缝对接下游的CNN。这相当于把特征工程的过程从模型外部搬到了内部并让Mamba层参与了“如何生成更好特征”的学习。CNN的任务接收到内部生成的协方差矩阵后CNN的工作就和传统方法一样了将其视为一幅图像通过卷积层识别其中的空间模式如特定角度对应的导向矢量结构。由于输入的特征矩阵是经过Mamba“预处理”过的理论上它应该比直接从原始噪声信号计算的协方差矩阵包含更清晰的方位信息。注意这里有一个重要的思维转变。传统深度学习方法中“计算协方差矩阵”是数据预处理的一部分是固定的、与模型无关的操作。在我们的框架里它成了模型可学习管道中的一个环节。Mamba层的参数更新会直接影响协方差矩阵的计算结果从而实现了端到端的“自适应特征处理”。3. 模型实现与关键技术细节3.1 信号仿真与数据准备任何数据驱动的方法都离不开高质量的数据。我们采用MATLAB进行严格的水声信号仿真以确保数据贴近真实物理场景。阵列模型采用10阵元的均匀线阵这是水声探测中的常见配置。阵元间距设为半波长这是避免空间混叠的经典选择。信号模型生成远场窄带信号。两个不相关的信号源其入射角在[-90°, 90°]范围内均匀采样。总共覆盖181个离散角度因此两个信号源的组合有C(1812-1, 2)种考虑顺序共计16546种角度对。我们为每种角度对生成4个不同噪声实现的样本得到总计66184个样本。噪声环境我们重点挑战低信噪比环境。训练和测试集涵盖了SNR为0dB, -5dB, -10dB, -15dB的四种情况这模拟了水下声学中常见的强噪声干扰场景。数据划分按75%-25%的比例随机划分训练集和测试集。确保所有SNR条件和角度组合在训练和测试集中均有分布。# 伪代码示例信号生成核心步骤 import numpy as np def generate_ula_signal(M, d, theta_deg, f, fs, snapshots, SNR): 生成ULA接收信号 M: 阵元数 d: 阵元间距波长倍数 theta_deg: 入射角度列表度 f: 信号频率 (Hz) fs: 采样率 (Hz) snapshots: 快拍数 SNR: 信噪比 (dB) theta_rad np.deg2rad(theta_deg) c 1500 # 水下声速单位 m/s wavelength c / f # 构建导向矢量矩阵 A A np.exp(-1j * 2 * np.pi * d * np.arange(M)[:, np.newaxis] * np.sin(theta_rad) / wavelength) # 生成源信号窄带随机相位 S np.exp(1j * (2 * np.pi * f * np.arange(snapshots) / fs np.random.uniform(0, 2*np.pi, (len(theta_deg), snapshots)))) # 生成接收信号 X_clean A S # 计算信号功率添加高斯白噪声 signal_power np.mean(np.abs(X_clean)**2) noise_power signal_power / (10**(SNR/10)) noise np.sqrt(noise_power/2) * (np.random.randn(*X_clean.shape) 1j * np.random.randn(*X_clean.shape)) X_noisy X_clean noise return X_noisy, theta_deg3.2 Mamba-CNN混合模型的具体实现我们使用PyTorch框架实现模型。核心在于如何将Mamba层与CNN优雅地结合。Mamba模块配置我们选择了Mamba的核心SSM层。输入维度是2*M实部虚部拼接隐藏维度设置为一个较大的数如256以保障其表征能力。序列长度L就是快拍数。Mamba层会输出一个与输入同形状的张量但其中的信息已经过提炼。协方差矩阵计算层这是一个无参数的关键层。输入维度为(Batch, Channel, L)输出维度为(Batch, Channel, Channel)。计算时我们通常取后两个维度Channel, L进行矩阵乘。为了数值稳定性通常会对结果进行归一化如除以L。import torch import torch.nn as nn from mamba_ssm import Mamba class MambaCovCNN(nn.Module): def __init__(self, num_elements, seq_len, num_classes181, d_state256, d_conv4): super().__init__() self.num_elements num_elements # 输入通道实部虚部 in_channels 2 * num_elements # Mamba层 self.mamba Mamba( d_modelin_channels, # 输入维度 d_stated_state, # 状态维度 d_convd_conv, # 卷积核大小 expand2, # 扩展因子 ) # 协方差计算无参数层 # CNN特征提取部分 self.cnn nn.Sequential( nn.Conv2d(1, 32, kernel_size3, padding1), # 输入是单通道的“图像” nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2), nn.Flatten(), ) # 全连接分类头 self.fc nn.Sequential( nn.Linear(self._get_cnn_output_flatten(num_elements), 128), nn.ReLU(), nn.Dropout(0.5), nn.Linear(128, num_classes), nn.Sigmoid() # 多标签分类每个角度一个概率 ) def _get_cnn_output_flatten(self, num_elements): # 辅助函数计算CNN展平后的维度 # 假设经过两次池化特征图尺寸从 num_elements 变为 num_elements//4 cnn_output_size 64 * (num_elements // 4) * (num_elements // 4) return cnn_output_size def forward(self, x): # x 形状: (Batch, num_elements, seq_len, 2) 最后一个维度是实部虚部 batch_size x.shape[0] # 合并实部虚部并调整维度为 (Batch, Channels2*M, seq_len) x_combined torch.view_as_real(x) # 形状变为 (B, M, L, 2) x_reshaped x_combined.permute(0, 3, 1, 2).contiguous() # (B, 2, M, L) x_reshaped x_reshaped.view(batch_size, -1, x.shape[2]) # (B, 2*M, L) # 通过Mamba处理时间序列 x_mamba self.mamba(x_reshaped) # 输出形状: (B, 2*M, L) # 计算协方差矩阵 # 使用爱因斯坦求和约定高效计算批次矩阵乘法 cov torch.einsum(bcl,bdl-bcd, x_mamba, x_mamba.conj()) # (B, 2*M, 2*M) cov cov / x_mamba.shape[-1] # 归一化 # 取协方差矩阵的幅度或实部作为CNN输入。这里取绝对值形成单通道图像。 cov_abs torch.abs(cov).unsqueeze(1) # (B, 1, 2*M, 2*M) # 通过CNN提取空间特征 features self.cnn(cov_abs) # 通过全连接层分类 output self.fc(features) return output训练细节损失函数采用二元交叉熵损失。我们将DOA估计视为一个多标签分类问题输出层有181个神经元对应181个可能的角度。每个神经元输出一个概率表示信号来自该角度的可能性。这种“网格搜索”式的分类方法避免了回归任务中角度周期性带来的训练难题。优化器使用AdamW优化器初始学习率设为1e-4并配合余弦退火学习率调度器。训练策略由于模型直接处理原始信号参数更多训练初期收敛较慢。我们采用了渐进式训练策略先在高SNR数据上预热再逐步加入低SNR数据稳定训练过程。3.3 对比基准模型传统CNN为了公平对比我们构建了一个基准CNN模型。其输入是直接从原始信号计算得到的协方差矩阵的幅度或实部。网络结构与混合模型中的CNN部分保持一致。这样两个模型唯一的区别就是基准CNN的输入是固定的、预处理好的特征而我们的混合模型输入是原始信号特征协方差矩阵是在模型内部、经过Mamba层影响后动态生成的。4. 实验结果分析与深度解读我们设计了多组实验从多个维度评估Mamba-CNN混合模型的性能。4.1 训练过程观察收敛性与泛化能力下图展示了在SNR-10dB快拍数100的极端条件下混合模型与基准CNN在测试集上的准确率随训练轮次的变化。分析训练初期基准CNN的准确率上升更快。这很好理解因为它接收的是已经“提纯”过的协方差矩阵特征任务相对简单。而混合模型需要同时学习“如何从噪声中生成好特征”以及“如何根据特征分类”这两个任务起点更困难。训练中后期混合模型的准确率曲线逐渐追上并最终超越了基准CNN。这说明一旦Mamba层学会了有效的序列处理方式其内部生成的特征矩阵比外部固定的协方差矩阵包含更多判别性信息。泛化差距更重要的是在整个训练过程中混合模型在测试集上的准确率泛化性能始终更接近其在训练集上的表现表明其过拟合程度更轻。而基准CNN在训练后期训练集和测试集之间的差距有拉大的趋势。这证明了Mamba层引入的自适应特征处理提升了模型对未知噪声模式的鲁棒性。4.2 角度分辨精度全方位性能对比我们选取了SNR-5dB, -10dB, -15dB快拍数500的配置绘制了两种模型在所有181个角度上的单独估计精度热力图。关键发现整体优势在绝大多数角度上混合模型图中红色区域的估计精度都高于基准CNN蓝色区域。特别是在-10dB和-15dB的恶劣条件下优势更为明显。边缘角度问题无论是混合模型还是CNN在接近阵列端射方向-90°和90°附近的估计精度都有所下降。这是均匀线阵的固有物理限制因为在这些方向阵列的有效孔径最小分辨率天然下降。有趣的是混合模型在这些“困难区域”的性能衰减相对更平缓。低信噪比优势放大对比三张图可以看到随着SNR降低两种模型的性能都在下降但混合模型性能下降的斜率更缓。在SNR-15dB时混合模型在大部分角度仍能保持可观的精度而基准CNN的精度已大面积降至较低水平。这直接验证了我们的核心假设在低信噪比下绕过可能引入信息损失的特征预处理让模型自适应地学习特征能带来更大的性能增益。4.3 综合性能指标准确率与均方根误差我们系统性地测试了不同快拍数100, 200, 500, 1000和不同SNR下的平均性能。平均准确率对比表信噪比 (dB)快拍数基准CNN准确率Mamba-CNN准确率提升幅度010092.1%93.8%1.7%050095.7%96.9%1.2%-510085.3%87.9%2.6%-550090.2%92.5%2.3%-1010072.8%76.5%3.7%-1050081.4%85.1%3.7%-1510058.1%62.9%4.8%-1550068.7%73.5%4.8%结论全面超越在所有测试条件下Mamba-CNN混合模型的平均估计准确率均高于基准CNN。低信噪比优势显著提升幅度随着SNR降低而明显增大。在SNR-15dB时提升接近5个百分点这与摘要中提到的3%提升可能基于不同测试集趋势一致且在我们的测试中表现更优。这充分证明了该方法在恶劣环境下的实用价值。快拍数影响快拍数增加两者性能都提升但混合模型的优势依然保持。说明其性能增益并非来自对少量数据的过拟合而是其内在的更强特征学习能力。关于均方根误差的讨论 实验也计算了角度估计的均方根误差。一个有趣的现象是在某些场景下混合模型的RMSE略高于基准CNN。这似乎与准确率提升的结论矛盾。但深入分析后我们认为这反映了两种模型误差分布的不同基准CNN可能倾向于做出“保守”的估计误差较小但可能系统性地偏向某些角度导致在严格匹配的“准确率”指标上不高。Mamba-CNN其估计可能更“大胆”偶尔会有个别样本出现较大偏差拉高了RMSE但在更多样本上做出了完全正确的判断提高了准确率。 在实际工程中我们往往更关心正确检测出目标方位的概率准确率而非单个估计的绝对误差。因此准确率的提升更具实际意义。5. 实操心得与未来优化方向5.1 模型训练与调参中的坑学习率是命门Mamba-CNN模型由于参数量更大、结构更复杂对学习率异常敏感。初始学习率过高极易导致训练不稳定损失值震荡甚至发散。我们的经验是从一个非常小的值如3e-5开始配合warm-up和余弦退火策略。一个实用的技巧是先单独用高SNR数据训练几轮让Mamba层初步学会信号的基本模式再引入全量数据调大学习率微调。梯度爆炸与消失Mamba层和CNN层之间的梯度流需要仔细监控。在早期版本中我们遇到过内部协方差矩阵计算层出现极大值导致梯度爆炸的问题。解决方案有两个一是在计算协方差后加入LayerNorm层进行归一化二是对Mamba层的输出在时间维度上先做一次全局平均池化再进行协方差计算这相当于一种降维平滑能有效稳定训练。数据格式与精度原始信号是复数处理不当会丢失信息。我们采用实部虚部分离拼接的方式。务必确保在数据加载、Mamba处理、协方差计算整个流程中数据类型float32/complex64转换正确。一个常见的错误是在计算协方差时忘记对Mamba输出的序列取共轭导致结果不是埃尔米特矩阵破坏了空间相关性结构的物理意义。类别不平衡处理我们的181类分类任务存在天然的不平衡端射方向-90°, 90°附近的样本由于物理限制更难估计。直接使用BCELoss会导致模型“忽视”这些困难类别。我们在损失函数中引入了焦距损失的思想给难以分类的角度赋予更高的权重显著提升了模型在阵列边缘的性能。5.2 工程部署考量计算效率尽管Mamba以线性复杂度著称但引入它确实增加了模型的计算量。在推理阶段Mamba的卷积模式可以高效并行。实测在相同硬件上混合模型的单次推理时间比基准CNN长约30-50%。对于实时性要求极高的系统需要在精度和速度之间权衡。一个折中方案是在训练时使用完整的Mamba-CNN部署时可以考虑对Mamba层进行知识蒸馏将其能力压缩到一个更小的网络或甚至是一组固定的滤波器。模型泛化与自适应我们当前模型是在仿真的特定阵列10阵元ULA和信号参数下训练的。在实际应用中阵元数、阵型、信号带宽可能变化。一个强大的系统应该具备一定的在线学习或自适应能力。我们的框架为此提供了可能可以将Mamba层的一部分参数设计为可快速调节的当阵列配置改变时只需用少量新场景数据对这部分参数进行微调而冻结CNN特征提取部分从而实现快速适配。5.3 未来可能的改进方向探索更优的序列-空间特征融合接口目前我们采用“Mamba处理时间序列 - 计算协方差 - CNN处理空间特征”的串行管道。是否可以设计更紧密的耦合例如采用时空交叉注意力机制或者在Mamba的每一层输出都计算一个多尺度的空间相关图供CNN使用。替换协方差计算内部协方差计算是我们设计的关键但它未必是最优的“时空转换器”。可以尝试其他能够将一维时间序列转换为二维空间结构图的算子例如互谱密度矩阵、双谱或者直接学习一个可训练的变换矩阵。这可能是未来性能进一步提升的突破口。处理宽带信号与移动源当前工作聚焦于窄带静态源。水声环境中宽带信号和移动源更常见。下一步可以将原始信号替换为时频图Mamba处理频率维序列CNN处理空间维从而扩展模型的应用范围。可解释性分析Mamba层究竟学到了什么我们可以通过可视化其内部状态、或分析其对输入序列的敏感性来理解它是如何“过滤”噪声和“增强”信号的。这不仅能增加模型的可信度也可能为设计更高效的物理启发式预处理模块提供灵感。这次将Mamba引入DOA估计的尝试给我的最大启发是在深度学习时代我们或许应该更勇敢地打破传统信号处理中的固定流程。与其费尽心思设计一个“完美”的、与模型无关的特征提取器不如把特征如何生成也作为学习目标的一部分交给数据本身和更强大的序列模型来决定。这条路虽然训练起来更费劲但在应对那些信噪比极低、模型先验知识不足的“硬骨头”问题时往往能带来意想不到的突破。