延迟相乘叠加求和(Delay Multiply and Sum)
延迟相乘叠加(Delay Multiply and Sum, DMAS)算法,最初是为雷达微波系统设计的,研究者们对 DMAS 波束合成方法进行了修改,并应用超声成像。结果表明,DMAS 波束合成在模拟和实验中的表现都优于传统的延时叠加(Delay and Sum, DAS),这种新方法带来的主要改进是对比度分辨率明显提高(即主瓣和侧瓣更窄),从而增加了动态范围,提高了 B 型超声图像质量。
与传统 DAS 相似,DMAS 算法通过对来自超声换能器阵元的信号应用几何计算延迟来聚焦接收到的波束。在求和之前,信号会进行组合耦合和乘法运算。这一操作可解释为孔径自相关函数,即在每个时间瞬间,计算有源传感器收集的所有接收信号之间的空间交叉相关性。因此,DMAS 是一种非线性波束合成算法。
通常,在一个简单的 DAS 波束合成器中,接收到的信号会被延迟(重新对齐)叠加,以产生扫描线相对应的最终输出。通过这种方式,波束成形器的目的是对来自所需点的信号成分进行重新相位和增强,同时尽可能地去除来自其他方向的不需要的干扰。
整个扫描完成后,波束合成的信号经过包络检测、对数压缩和进一步可能的信号处理,最后用于形成和显示二维图像(扫描转换)。
DMAS算法参考文献:https://ieeexplore.ieee.org/document/6960091
DMAS 算法原理框图
图中假定有一个三阵元接收孔径, x i ( i = 1 , 2 , 3 ) \ x_i(i=1,2,3) xi(i=1,2,3) 是一条扫描线的接收射频(RF)信号。信号 x i \ x_i xi被延迟、耦合和相乘;然后在保留符号的情况下对相乘的绝对值进行平方根运算,对得到的信号求和并进行带通(BP)滤波。通过解调、归一化和对数压缩(未显示),输出 y F − D M A S \ y_{F−DMAS} yF−DMAS 用来形成图像线。
DMAS 波束合成的信号为:
这一运算在数学上可解释为接收孔径的自相关函数,其中的自积项(i=j)被排除,系数减半(在求和时不考虑
s
i
s
j
\ s_is_j
sisj和
s
j
s
i
\ s_js_i
sjsi项)。此时得到的信号
y
D
M
A
S
\ y_{DMAS}
yDMAS不能用作传统 B型图像的扫描线:由于乘法阶段的原因,它实际上是一个尺寸平方(即 [Volt^2] ,而不是 [伏特])、部分整流的非零均值信号,因此不能应用包络检测。
因此,这项工作在原始 DMAS中引入一些新的处理步骤(原理框图中的灰色块),以开发一种用于 B 模式图像形成的波束合成算法。
首先,通过对求和中的每个
s
i
s
j
\ s_is_j
sisj 应用 "带符号"平方根(实际上,我们计算的是
s
i
\ s_i
si和
s
j
\ s_j
sj的带符号几何平均数),得出一个新的 “等效RF信号”,这样每个乘法项的振幅就能正确缩放,与 RF 信号
s
i
\ s_i
si具有相同的维度,而不会丢失符号。
用 n 来索引 i 和 j 的所有组合耦合,则每个新的波束成形信号
y
D
M
A
S
∗
\ y^*_{DMAS}
yDMAS∗的计算公式为:
此外,虽然 DAS 波束成形的输出是零均值信号,其振幅频谱与RF信号 si 相似,DMAS 波束成形输出的频谱中同时出现了直流和二次谐波成分。这是因为,通过将频率内容几乎相似的RF信号(例如,以 f0 为中心的频带)相乘,输出信号的振幅频谱中会产生两个新的分量,即一个以 f0−f0=0 为中心,另一个以 f0+f0=2f0 为中心。因此,在 DMAS 处理链(Filtered-DMAS,即 F-DMAS)中引入了进一步的步骤,对波束成形信号
y
D
M
A
S
∗
\ y^*_{DMAS}
yDMAS∗进行带通(BP)滤波,以减弱直流和高频成分,同时保持以 2f0 为中心的成分几乎不变。最后得到
y
F
−
D
M
A
S
\ y_{F−DMAS}
yF−DMAS ( DMAS 算法原理框图)。
最后通过希尔伯特变换进行包络线检测,并对得到的线条进行归一化和对数压缩,形成最终图像。
Field II 仿真
% 求解带符号平方根
for i = idx(1:end-1)'
count = count + 1;
j_idx = idx(1+count:end)'; % Get all j indices
% https://ieeexplore.ieee.org/document/6960091
% 论文中公式(3)和(4)
y_dmas_signed(z,x) = y_dmas_signed(z,x) + sum(sign(data_cube(z,x,i).*data_cube(z,x,j_idx)).*sqrt(abs(data_cube(z,x,i).*data_cube(z,x,j_idx))));
end