【二维前视声呐信号处理】距离向降采样与最大值池化的原理及FPGA硬件架构

【二维前视声呐信号处理】距离向降采样与最大值池化的原理及FPGA硬件架构

【二维前视声呐信号处理】距离向降采样与最大值池化的原理及FPGA硬件架构

文章目录

📖 引言

在二维前视声呐(Forward-Looking Sonar, FLS)的底层数据处理链路中,为了获得极高的距离分辨率,硬件后端的模数转换器(ADC)和波束形成(Beamforming)模块通常会以极高的频率进行采样。例如,在一个量程为100米的探测任务中,单波束的距离向采样点可能高达 16 , 384 16,384 16,384 个。

然而,对于显控终端而言,普通的显示器径向像素通常只有 800 ∼ 1080 800 \sim 1080 800∼1080 个。如果将这上万个浮点型或高位宽的数据点全部传输给上位机,不仅会瞬间撑爆通信带宽(尤其是在水声通信或微型ROV的细缆传输中),而且在进行极坐标到直角坐标转换时也会造成极大的计算冗余。

因此,在FPGA底层直接进行距离向降采样(Range Downsampling) 是降低数据量的必由之路。但在水下声学成像中,降采样方法的选择至关重要。本文将详细解析为何选择最大值池化(Max-Pooling),其背后的数学原理,以及如何在FPGA中构建高效、低延迟的硬件架构。


🎯 一、 为什么必须是最大值池化?

在数字信号处理中,降低数据采样率(Decimation)通常有三种做法:

  1. 等间隔抽样(直接丢弃):每隔 M M M 个点取1个点。
    • 致命缺点:严重破坏奈奎斯特采样定律,容易引发频率混叠;更可怕的是,如果水下有一根极细但反射极强的防潜网钢缆,其回波可能只占据1~2个采样点,直接抽样极大概率会将其漏掉。
  2. 均值池化(Average-Pooling / 低通滤波后抽样):取 M M M 个点的平均值。
    • 致命缺点:水下的强目标(如水雷、沉船桅杆)回波尖锐但持续时间极短,周围全是被水体衰减的极低底噪。如果取平均值,强目标的高能量会被周围的底噪“稀释”拉低,导致在屏幕上难以察觉。
  3. 最大值池化(Max-Pooling):取 M M M 个点中的最大值。
    • 完美契合声呐特性:声呐操作员最关心的是哪里有强反射障碍物。最大值池化相当于一种“峰值保持”技术,不仅能将数据量严格压缩为原来的 1 / M 1/M 1/M,还能100%保留局部区域内的最强目标回波,确保避障的绝对安全。

📐 二、 数学模型与公式推导

1. 降采样因子 M M M 的确定

设声呐系统的采样率为 f s f_s fs​,声速为 c c c(约 1500 m / s 1500 m/s 1500m/s),则原始数据的空间距离分辨率为:
Δ r o r i g = c 2 f s \Delta r_{orig} = \frac{c}{2 f_s} Δrorig​=2fs​c​

设当前声呐设定的最大量程为 R m a x R_{max} Rmax​,此时单波束的总采样点数为 N N N。
如果上位机期望的径向显示分辨率(像素数)为 P P P,为了保证数据量刚好适配显示器且不冗余,我们需要计算降采样因子(池化窗口大小) M M M:
M = ⌊ N P ⌋ M = \lfloor \frac{N}{P} \rfloor M=⌊PN​⌋
(注:在工程实现中,为了简化硬件设计,通常由上位机下发 M M M 值,或者限制 M M M 为 2 的幂次方整数。)

2. 最大值池化公式

设波束形成模块输出的极坐标二维数据矩阵为 X X X,其中 X [ n , b ] X[n, b] X[n,b] 表示第 b b b 个波束、第 n n n 个距离采样点的幅度值(已取包络或模值)。
其中:

  • 距离索引 n ∈ [ 0 , N − 1 ] n \in [0, N-1] n∈[0,N−1]
  • 波束索引 b ∈ [ 0 , B − 1 ] b \in [0, B-1] b∈[0,B−1]

经过降采样因子为 M M M 的最大值池化后,输出的新数据矩阵为 Y Y Y。对于无重叠的块状池化(Non-overlapping Block Pooling),步长(Stride)等于窗口大小 M M M。输出矩阵 Y [ m , b ] Y[m, b] Y[m,b] 的计算公式为:

Y [ m , b ] = max ⁡ k = 0 M − 1 { X [ m ⋅ M + k , b ] } Y[m, b] = \max_{k=0}^{M-1} \{ X[m \cdot M + k, b] \} Y[m,b]=k=0maxM−1​{X[m⋅M+k,b]}

其中, m m m 为降维后的新距离索引, m ∈ [ 0 , ⌊ N M ⌋ − 1 ] m \in [0, \lfloor \frac{N}{M} \rfloor - 1] m∈[0,⌊MN​⌋−1]。
通过此公式,数据在距离维度(n)上被压缩了 M M M 倍,而波束维度(b)保持不变。

在这里插入图片描述

🛠️ 三、 FPGA 硬件架构设计方案

FPGA处理此类流式数据(Streaming Data)具有天然优势。我们将通过模块划分、数据流向与状态控制逻辑来详述硬件实现方案。

1. 数据流输入特征假设

在波束形成(DBF/CBF)后,数据通常遵循以下时序进入降采样模块:

  • 模式A(按波束顺序传输):先传完波束0的所有距离点,再传波束1的所有距离点。
  • 模式B(按距离环交织传输):传完所有波束的第0个距离点,再传所有波束的第1个距离点。

本文以更具挑战性且更普遍的 模式B(时分复用交织传输,TDM) 为例进行架构设计。

2. 核心硬件模块划分

为了实现实时、无死角的流水线最大值池化,我们需要构建以下核心硬件逻辑单元:

模块一:输入数据缓冲与解析(Input Interface)

负责接收带有 AXI-Stream 握手协议(valid, ready, data, last)的波束数据。提取当前的波束号(beam_idx)和距离计数器(range_cnt)。

模块二:多通道局部极大值寄存缓存(BRAM Cache)

因为数据是按距离环交织进来的,系统不能简单地用一个寄存器来保存“当前最大值”。当波束 b b b 的数据进来时,必须调出上一刻波束 b b b 暂存的最大值进行比较。

  • 实现方式:使用一块真正的双端口 RAM(True Dual-Port BRAM)。
  • 深度:波束总数 B B B(例如 128 或 256)。
  • 宽度:数据位宽(如 16-bit 或 32-bit)。
模块三:流式比较树核(Streaming Max-Comparator Core)

核心运算单元,不包含复杂的乘加运算,只有极低延迟的比较逻辑。
运算逻辑

  1. 读出当前 beam_idx 在 BRAM 中暂存的历史最大值 hist_max
  2. 将输入的新数据 new_datahist_max 进行无符号(或浮点)大小比较。
  3. 将两者中的较大值 current_max 重新写回 BRAM 的 beam_idx 地址中。
模块四:池化窗口控制状态机(Window Controller)

管理降采样因子 M M M 的计数逻辑。

  • 维持一个全局距离计数器,每处理完一整圈波束,距离计数器加 1。
  • 维持一个模 M M M 的窗口内计数器 window_cnt(范围从 0 0 0 到 M − 1 M-1 M−1)。

3. 数据处理生命周期(Step-by-Step)

为了清晰展示 FPGA 时序,我们将一个池化周期( M M M 个距离点)拆解如下:

  • 阶段 1:窗口起始(window_cnt = 0
    当 M M M 个点中的第 1 个点到达时,不读取 BRAM 的历史值,直接将当前传入的数据 new_data 写入 BRAM,作为该波束本轮比较的“初始打底值”。
  • 阶段 2:窗口累积比较(window_cnt = 1M-2
    新一圈数据到达。读出 BRAM 中的值,与新数据送入比较器,较大的值覆盖写入 BRAM。这在硬件上是一个标准的读-改-写(Read-Modify-Write)流水线。设计时需注意流水线气泡(Pipeline Bubbles),由于是多通道交织,不同波束地址不冲突,不存在 RAW(Read-After-Write)数据冒险。
  • 阶段 3:窗口结束与数据输出(window_cnt = M-1
    池化窗口的最后一个点到达!
    此时比较器输出的最大值不再写回 BRAM,而是拉高输出有效信号(out_valid,将最终的极大值推入下一级 FIFO 或 DMA,准备发送给上位机。
    至此,一个大小为 M M M 的距离窗压缩成了一个点输出,完成了数据降维。

⚙️ 四、 工程优化与避坑指南

在实际的FPGA工程落地中,仅仅实现功能是不够的,以下细节决定了系统的鲁棒性:

  1. 边界截断问题(尾部残留数据)
    • 问题:如果总采样点数 N N N 不能被 M M M 整除,最后剩余的几个点(不足 M M M 个)怎么办?
    • 对策:在状态机中监控帧结束信号(TLASTframe_end)。一旦收到帧结束,无论 window_cnt 是否到达 M − 1 M-1 M−1,立刻强制将当前 BRAM 中的最大值输出,清空流水线,防止尾部盲区目标丢失。
  2. 动态可编程降采样率(Dynamic M)
    • 固化的 M M M 值灵活性极差。建议通过 AXI-Lite 总线,将参数 M M M 映射为寄存器,允许上位机根据量程动态配置。例如,大量程时 M = 16 M=16 M=16,近距离高精度成像时 M = 2 M=2 M=2 或旁路关闭( M = 1 M=1 M=1)。
  3. 流水线时序收敛(Timing Closure)
    • 如果时钟频率较高(>200MHz),从 BRAM 读出、比较、再写回可能会导致时序违例(Setup Time Violation)。需要在此数据路径中插入一级流水线寄存器(Pipeline Register)。由于波束是交织传入的,延迟一拍写回不仅不会影响逻辑,还能极大提升时序裕量。

🚀 结语

在二维前视声呐的硬件实现中,采用最大值池化(Max-Pooling) 对距离向进行降采样,是平衡“数据传输带宽”与“强弱目标保真度”的黄金解法。

通过在 FPGA 中构建基于 BRAM 与比较树的流式处理架构,我们在极其苛刻的低延迟要求下,实现了实时的数据大幅缩减。这种纯硬件级的数据瘦身,为后续上位机的坐标转换(Scan Conversion)和高质量图像渲染(如CLAHE增强、伪彩色映射)释放了宝贵的计算资源。

Could not load content