主要内容

检查聚焦相控阵的响应

介绍

这个例子介绍了聚焦光束的概念,并展示了如何使用分阶段。FocusedSteeringVector生成相控阵所需的元素权重。它还展示了如何使用分阶段。SphericalWavefrontArrayResponse计算阵列在给定角度和范围内的阵列响应。首先,您将查看单个光束形成时的响应,并检查焦点区域的特征,然后模拟超声成像中常用的收集策略,以查看聚焦光束如何出现在图像中。

聚焦波束形成

球面波前延迟和

在典型的远场假设下,波束形成可以将信号波前建模为沿其法线方向传播的平面。当信号入射到阵列上时,波前与单个元件相交,其相对时间延迟与元件沿波传播方向的距离成正比。在该模型下,可以对每个元件施加延迟(或在窄带情况下的相移),使得跨元件(无论是发射还是接收)的输出在相干求和时具有建设性相位。

在没有远场假设的情况下,从点源发出的波前被建模为以该源为中心的球面。该波前与相控阵的单元相交,其相对延迟由共线单元的双曲范围决定。虽然该模型只会给远场图的生成增加不必要的计算成本,但球面波前模型对于理解近场波束形成和聚焦是必要的。

这个函数helperPlotULAWavefronts给出了在有聚焦和没有聚焦的操纵波束之间的元件延迟和波前形状的差异。元素延迟是相对于阵列中心的。

figure helperplotuawavefronts (14,1e6,1540,20,inf) title(“带领波阵面”

图包含一个轴对象。标题为steering Wavefront的轴对象包含29个类型为line的对象。一条或多条线仅使用标记显示其值。这些对象表示元素、Prop路径、波阵面。

figure helperplotuawavefronts (14,1e6,1540,20,0.01) title(“定向聚焦波前”

图包含一个轴对象。标题为“定向聚焦波前”的轴对象包含30个线类型的对象。一条或多条线仅使用标记显示其值。这些对象表示元素、焦点、支柱路径、波阵面。

焦点区域和远近边界

在远场中,制导阵列在角度空间中具有明确的方向图,且方向图与距离无关。在近场,操纵(但未聚焦)阵列根本没有可识别的波瓣结构。由于元件之间的非线性相位关系,在给定方向的所有范围内都具有相等幅度的响应是不可能的。相反,通过聚焦光束,人们可以获得一个小区域,在角度和范围上都有限制,在这个区域内的响应类似于远场响应,称为远场响应焦点区域。焦区的角位置可以像远场光束一样容易控制。焦点区域在距离内的位置由焦范围,和景深(DoF),即区域的范围范围。

下图显示了聚焦均匀阵列和矩形阵列的光束形状随距离的变化。这个函数helperPlotResponseSlices来演示如何生成这种类型的图形。

Example_FocusedSlices_ULA (2) . jpgExample_FocusedSlices_URA (2) . jpg

在焦距范围内,我们的光束在角度空间上与远场模式非常相似。

近/远边界,在概念上类似于其他近场/远场边界,是无法聚焦的边界。相反,在边界的近侧不可能有定向但不聚焦的光束。下图说明了这一事实。注意,定向光束只在远端开始成形,而聚焦光束只在近端聚焦。

NearFarBoundaryComparison.jpg

在医学影像文献中,可以找到这个边界的范围是有充分记录的 l 数组 2 / 4 λ ,在那里 l 数组 是数组的长度。对于一个简单的均匀线性阵列 N 临界间隔元素,这可以表示为 N 2 λ / 16

产生单一光束的响应

本节将展示如何生成和绘制单个光束。首先设置相控阵和其他系统对象。常用的医学成像超声系统的工作频率在2 ~ 20mhz之间,普遍接受的声音在软组织中的平均传播速度为1540 m/s。

rng (“默认”)频率= 4e6;C = 1540;λ = c/频率;

超声波换能器有各种各样适合特定活动的拓扑结构。这个例子简单地使用了一个具有临界元素间距的均匀线性数组。

numElems = 256;elemSpacing = lambda/2;array = phased.ULA(numElems,elemSpacing);

系统对象分阶段。FocusedSteeringVector分阶段。SphericalWavefrontArrayResponse串联使用来生成导向和聚焦元素权重,并计算某个域上的响应。将数组和传播速度规范从上面传递给构造函数。对于数组响应,也打开权重输入端口。

阶段性的。FocusedSteeringVector(“SensorArray”数组,“PropagationSpeed”c);AR =阶段性的。SphericalWavefrontArrayResponse (“SensorArray”数组,“PropagationSpeed”c“WeightsInputPort”,真正的);

现在你有最小的设置需要形成和检查聚焦光束。使用10度的方位角和40毫米的焦距。

azSteer = 10;focalRange = 0.04;

使用一个从阵列前面开始并延伸到两倍焦距的域,并在横向方向上覆盖阵列的长度。数组元素沿Y轴排列,数组法线方向为+X。

arrayLength = numElems*elemSpacing;x = linspace(1e-3,2*focalRange,200);y = linspace(-arrayLength/2,arrayLength/2,200);

转换为球坐标输入转向矢量和响应计算。

[az,el,rng] = car2sph (x,y',0);Ang = rad2deg([az(:) el(:)]');RNG = RNG (:)';

现在计算聚焦阵列在指定域上的响应。

权重= SV(frequency,[azSteer;0],focalRange);beam = AR(frequency,ang,rng,weights);

重塑,规范化,并使用对数尺度。

Beam =重塑(Beam, nummel (y), nummel (x));Beam = Beam /max(abs(Beam (:)));梁= mag2db(abs(梁));

使用提供的函数helperPlotResponse来绘制结果。数组元素的位置由红色标记表示。

图helperPlotResponse(beam,x,y,array) title(“单舵聚焦光束”

图包含一个轴对象。标题为“单方向聚焦光束,xlabel轴向距离,ylabel横向位置”的轴对象包含2个类型为image, line的对象。其中一行或多行仅使用标记显示其值。

在指定的距离和角度下,焦点区域清晰可见。与远场响应(模式)一样,球面波前响应的大小考虑了元素间相位的变化,但与远场响应不同的是,球面波前响应还包括元素间自由空间传播损耗变化的影响。这本质上是跨元素的轻微幅度调制,其效果在波束的旁瓣中可见。对每个单元施加等于焦距的平坦增益,因此每个单元的整体振幅权重为响应点与阵列中心之间的距离与响应点到单个单元的距离之比: R 分别地 / R 初步的 。例如,位于原点的元件对总光束的贡献将具有单位大小。

焦点区域

为了使焦区域在范围上有界,焦范围必须足够小,以至于整个区域(其范围由DoF决定)必须比近/远边界更近。DoF可以表示为相关量的函数,通常在光学中看到,被称为焦距比数,即焦距与阵列长度之比: F = R / l 数组 。从这个量,一个很好的估计的自由度是 d F = 7 1 λ F 2 。对于固定的阵列和频率,DoF随焦距的平方而增加。

本节将介绍景深随焦距的变化情况。在焦距范围内产生响应,并检查变化的DoF。这个函数helperPlotBeamMarkers将显示每个焦距范围的景深指示。焦距区域大致呈椭圆形,不以焦距为中心。另一个经验法则可以用来找到从焦距到区域中心的偏移量: d F / 4

nearField = arrayLength^2/(4*lambda);%近/远边界范围x = linspace(1e-3,nearField* 1.2100);Y = linspace(-0.01, 0.01100);Coeff = 0.1:0.1:0.9;%近/远边界的比例focalRanges = coff *nearField;fnum = focalRanges/arrayLength;Dof = 7.1*lambda*fnum.^2;focalRegionCenter = focalRanges + dof/4;数字= 1:数值(focalRanges) beam = helperMakeSingleBeam(SV,AR, frequency,0,focalRanges(ind),x,y);helperPlotResponse(beam,x,y)坐标轴([- 60])%只查看波束中最大的6dbhelperPlotBeamMarkers (focalRanges(印第安纳州),focalRegionCenter(印第安纳州),近距离,景深(印第安纳州),0.001)标题(sprintf (焦距=近/远边界的%d%%轮(多项式系数(印第安纳州)* 100)))drawnow结束

图包含一个轴对象。标题为Focal Range = 90% of Near/Far Boundary, xlabel Axial Distance, ylabel Lateral Position的轴对象包含6个类型为image, line的对象。

当焦距增加到近/远边界的60%时,焦区的偏心率变得相当大。在80%的情况下,焦点区域与远/近边界相交,基本上变成了一束未聚焦的光束。

与远场响应一样,焦点区域的波束宽度仍然可以用通常的方法粗略计算 λ / l 数组 ,波长与阵列长度的比值。因此,焦点区域的宽度(横向)可以近似为 R λ / l 数组

线性子阵列移位单线采集

a扫描和图像形成

与雷达系统不同,雷达系统可以通过远场信号的波束形成有效地估计到达方向,而超声系统的近场波束形成和延迟要求通常需要一种更简单的策略来定位返回能量的来源。一类常见的收集策略涉及多个a,沿着给定线段的反射率曲线。这些线在形成的图像中的位置仅由光束的已知位置决定。

为了形成一个矩形图像,就像这个例子一样,线性子阵列移位可以使用。使用这种方法,对每个脉冲使用阵列元素的子集(子阵列),而不进行转向,以获得从子阵列中心开始并沿轴向扩展的距离轮廓。通过将子数组选择移动到一组不同的元素来形成连续的行。

焦距的选择可以与光束指向分开考虑。一些系统可能保持固定的焦距,或使用动态聚焦接收,并加上apodiization或开窗,以产生覆盖大部分近场区域的宽图像。在本例中,当子阵列的横向位置变化时,焦距保持固定。

助手类helperSubarray提供了仿真子阵列选择和简化仿真回路。这个类跟踪哪些元素属于当前子数组,并处理全局帧和子数组帧之间的必要转换。

图像形成

为了演示聚焦波束形成的效果,本例使用了一种简单的图像形成策略,通过量化和积累每个脉冲的响应来构建每个距离轮廓,然后根据子阵列的位置将该轮廓插入到完成的图像中。这模拟了自由空间中的理想三角洲脉冲,从而可以比较焦点区域内外的横向分辨率。该方法不考虑波形选择和多径反射的影响,将散射体视为完美的点各向同性反射体。

模拟

将使用与前一节相同的系统参数。每个子数组将由64个元素组成。子阵列从阵列的末端开始,在每个脉冲上移动一个元素。

numsubbelems = 64;subarray = helperSubarray(array, numsubbelems);

如果子阵列在每个脉冲上移动一个元素,并且覆盖所有相邻的子阵列,则脉冲总数将为

num豆类= numElems - numSubElems + 1
num脉冲= 193

在上一节的分析之后,检查此子阵列的焦点区域参数。获取子阵列长度、近/远边界、DoF和焦点区域的横向宽度。

subarrayLength = numsubbelems *elemSpacing;nearFieldSub = subarrayLength^2/(4*lambda);%子数组的近/远边界fnumSub = focalRange/subarrayLength;dofSub = 7.1*lambda*fnumSub.^2
dofSub = 0.0288
widthSub = lambda/subarrayLength*focalRange
widthSub = 0.0013

子阵列光束的DoF约为28.8 mm,焦区的横向宽度约为1.3 mm。检查焦点区域是否在近/远边界内

boundedFocalRegion = focalRange + dofSub < nearFieldSub
boundedFocalRegion =逻辑1

为了演示聚焦光束的主要用途,在焦点区域减少波束宽度,使用沿轴向散射体的多条平行线(深度线)。指定所需的最大散射体深度,并使用所提供的辅助函数,helperGetResponsePoints,得到散射点的位置。设所有散射体具有单位振幅的反射率。散射体位置被摄动以避免由于对称而产生伪影。

对于线的横向间距,使用4倍计算的焦点区域宽度。由于子阵列每次只移动一个元素,距离比焦点区域的光束宽度短,因此每条散射体的返回值在图像的多行中显示,使它们看起来具有更大的宽度。

maxDepth = nearFieldSub;linespspacing = 4*widthSub;[sx,sy] = helperGetResponsePoints(maxDepth,arrayLength,lambda, linespspacing);

为了使场景可视化,将散射体位置与数组元素一起绘制出来。

图plot(子数组)hold情节(sx, sy,“。”)举行传奇(数组元素的“初始子数组”“散射”)包含(“轴向距离”) ylabel (“横向位置”

图包含一个轴对象。xlabel轴向距离,ylabel横向位置的轴对象包含3个类型为line的对象。其中一行或多行仅使用标记显示其值。这些对象表示数组元素、初始子数组、散射体。

为了形成距离轮廓并捕获副瓣回波干扰的影响,必须定义距离采样参数。现代超声系统使用相对较高的采样频率,与传输波形的中心频率相同。使用量程仓尺寸为1mm,对应的采样率约为1.5 MHz。提供的辅助函数helperFormRangeProfile用于从阵列响应数据形成距离轮廓。

rangeBinSize = 1e-3;Fs = c/rangeBinSize;rangeBinSize:maxDepth;numrangessamples = numel(rangebin);

得到散射体的位置在球坐标(角度在度)的输入SphericalWavefrontArrayResponse

[respAng,~,respRng] = car2sph (sx,sy,0);respAng = rad2deg(respAng(:)');= = = = ';

模拟的每个循环包括计算当前子阵列的权重,计算响应,形成距离轮廓,并逐行形成图像。我们还将应用范围相关增益的均匀亮度(见helperFormRangeProfile).

im = 0 (num脉冲,numrangessamples);center = 0 (3, num脉冲);脉冲= 1:num脉冲中心(:,脉冲)= subarray.center;%当前子数组的中心位置[focAzGlobal,~,focRngGlobal] = subarray。localToGlobalSph(0,0,focalRange);到当前焦点的角度和范围权重= SV(frequency,[focAzGlobal;0],focRngGlobal);Weights (~subarray.selection) = 0;%未使用元素的零权重resp = AR(频率,respAng,respRng,权重);resp = respp ./respRng(:);撤消归一化以使用实际传播损耗im(脉冲,:)= helperFormRangeProfile(resp,sx,sy,center(:,脉冲),rangeins);%向图像添加行如果脉冲< num脉冲subarray.shift(1)如果有脉冲剩余,移动子阵列结束结束

归一化并绘制图像,以及散射点位置的叠加。

Im = Im /max(abs(Im (:)));figure subplot(1,2,1) helperPlotResponse(mag2db(abs(im)), rangebin,center(2,:)) title(“线性子阵列移位图像”) subplot(1,2,2) helperPlotResponse(mag2db(abs(im)), rangebin,center(2,:)) hold情节(sx, sy,“r”“markersize”, 1)标题(散射体叠加的)设置(gcf“位置”得到(gcf“位置”)+[0 0 560 0]);

图中包含2个轴对象。标题为“线性子阵列移动图像,xlabel轴向距离,ylabel横向位置”的轴对象1包含一个图像类型的对象。标题为Scatterer Overlay, xlabel Axial Distance, ylabel Lateral Position的坐标轴对象2包含2个类型为image, line的对象。其中一行或多行仅使用标记显示其值

深度线在焦距范围内是可分辨的,距离间隔大致等于子阵列波束的计算DoF。在远离焦点的地方,由于光束在焦点区域外的广角扩散,散射体的平行线很快变得难以区分。

请注意,虽然所有的散射体都用于计算能量返回,但由于整个阵列大小和子阵列中心位置范围之间的剪切,并非所有的线都是可见的。以降低横向分辨率为代价,用更短的子阵列可以获得更宽的总视场。

结论

本例介绍了两个系统对象,分别用于计算聚焦权重和计算球面波前阵列的非远场响应。演示了如何检测聚焦光束的一些基本特征,以及如何使用线性子阵列移位收集方法生成基本图像以可视化聚焦光束对横向分辨率的影响。

参考文献

Demi,自由主义者。实用指南超声光束形成:光束模式和图像重建分析。应用科学8,不。9(2018年9月3日):1544。https://doi.org/10.3390/app8091544

[2] Ramm, o.t. Von和S. W. Smith。“用线性阵列控制波束。”IEEE生物医学工程学报BME-30,不。8(1983年8月):438-52。

辅助函数

helperMakeSingleBeam

函数[beam,x,y] = helperMakeSingleBeam(SV,AR, frequency,azSteer,focalRange,x,y)获得单个梁的单元权重并计算响应权重= SV(frequency,[azSteer;0],focalRange);%响应范围如果margin < 6 x = linspace(1e-3,2*focalRange,200);结束如果margin < 7 pos = SV.SensorArray.getElementPosition;Halfy = max(pos(2,:))*1.2;Y = linspace(-halfy,halfy,200);结束[az,el,rng] = car2sph (x,y',0);Ang = rad2deg([az(:) el(:)]');RNG = RNG (:)';%生成响应beam = AR(frequency,ang,rng,weights);Beam =重塑(Beam, nummel (y), nummel (x));%归一化,使用对数刻度Beam = Beam /max(abs(Beam (:)));梁= mag2db(abs(梁));结束

helperPlotResponse

函数helperPlotResponse (R, x, y,数组)在x和y定义的定义域上绘制响应R。显示亮度图像(x, y, R)集(gca),“ydir”“正常”) xlabel([-32 0])“轴向距离”) ylabel (“横向位置”如果margin > 3 pos = getElementPosition(数组);持有H = plot(pos(1,:),pos(2,:),“r”);持有Xl = xlim;Xlim ([min(pos(1,:)) xl(2)]) legend(h,数组元素的“位置”“东南”“自动更新”“关闭”结束结束

helperPlotBeamMarkers

函数helperPlotBeamMarkers (focalRange中心,近距离,景深,抵消)在波束图上放置信息标记Line ([center-dof/2 center+dof/2],[offset offset],“颜色”“白色”) line([center-dof/2 center-dof/2],[0 offset],“颜色”“白色”) line([center+dof/2 center+dof/2],[0 offset],“颜色”“白色”) line([focalRange focalRange],ylim,“颜色”“红色”) line([nearField nearField],ylim,“颜色”“青色”结束

helperGetResponsePoints

函数[sx,sy] = helperGetResponsePoints(maxDepth,arrayLength,lambda,dy)沿着X画出平行的散射体线sx = linspace(0.001,maxDepth,400);y = -arrayLength/2:dy:arrayLength/2;[sx,sy] = meshgrid(sx,sy);Sx = Sx (:);Sy = Sy (:);Sx = Sx + (rand(size(Sx))-1/2)*lambda;Sy = Sy + (rand(size(Sy))-1/2)*lambda;结束

helperFormRangeProfile

函数rangeProf = helperFormRangeProfile(resp,sx,sy,center, rangebin)此辅助函数在范围内连贯地量化响应%累加每个仓中的返回值,并对每个仓应用振幅加权%范围箱rangeBinSize = rangeBins(2) - rangeBins(1);numrangessamples = numel(rangebin);%散射体相对于子阵列中心的范围scatRngRel = sqrt((center(1)-sx))。^2 + (center(2)-sy).^2);量化散射范围到快速采样向量scatRidx = 1 + floor(scatRngRel/rangeBinSize);只保持样品低于最大深度I = scatRidx <= numrangessamples;scatRidx = scatRidx(I);resp = resp(I);累加返回到快速采样网格rangeProf = accumarray(scatRidx,resp,[numrangessamples 1]);rangeProf = rangeProf';%应用距离相关增益rangeProf = rangeProf.* rangebin;结束

helperPlotULAWavefronts

函数helperplotuawavefronts (numElems,f,c,az,r)用ArrayAxis 'y'绘制给定ULA的波前%方位角和焦距。对于远场波前,使用inf表示焦距λ = c/f;array = phased.ULA(numElems,lambda/2);pos = getElementPosition(array);arrayLength = max(pos(2,:)) - min(pos(2,:));%获取相对路径长度如果isinf(r) L = phased.internal.elemdelay(pos,c,[az;0])*c;其他的L = phase .internal.sphericalelemdelay(pos,c,[az;0],r)*c;结束%绘图元素位置情节(pos (1:), pos (2:)“oblue”);持有;%如果近场,绘图源如果~ isinf (r) (src (1, 1), src (2, 1), src (3,1)] = sph2cart (az *π/ 180 0 r);情节(src (1), src (2),“* r”“markersize”10);结束%波前标记宽度S = λ /6;%远场支柱路径如果isinf (r)(洛杉矶(1,1),洛杉矶(2,1),洛杉矶(3,1)]= sph2cart (az *π/ 180,0,1);结束1:size(pos,2)每个元素的百分比P = pos(:,ind);如果isinf(r) src = p + los*arrayLength;结束路径= SRC - p;Path = Path /norm(Path);wp = p + path*L(ind);%波前位置%道具路径Line ([wp(1) src(1)],[wp(2) src(2)],“颜色”“黑”“线型”“——”);%波前标记U = cross([0;0;1],path)*s;线([wp (1) - u (1) wp (1) + u(1)]、[wp (2) - u (2) wp (2) + u (2)),“颜色”“红色”);结束持有;网格;轴平等的;如果isinf传奇(r) (“元素”“道具”路径“时”“位置”“东南”);其他的传奇(“元素”“焦点”“道具”路径“时”“位置”“东南”);结束结束

helperPlotResponseSlices

函数helperPlotResponseSlices演示如何可视化球形波前响应的范围切片F = 2e6;C = 1540;λ = freq2waven (f,c);Array = phased。([32 32],λ/ 2);elemPos = array.getElementPosition;focalRange = 0.03;samplerranges = .01:.01:.05;每个切片的%域azSteer = -20;elSteer = 20;az = azSteer + (-30:.1:30);el = elSteer + (-30:.1:30);[az,el] = meshgrid(az,el);Ang = [az(:) el(:)]';[x,y,z] = sph2cart(z*pi/180,el*pi/180,1);阶段性的。FocusedSteeringVector(“SensorArray”数组,“PropagationSpeed”c);AR =阶段性的。SphericalWavefrontArrayResponse (“SensorArray”数组,“PropagationSpeed”c“WeightsInputPort”,真正的);w = SV(f,[azSteer;elSteer],focalRange);= 1:num (sampleRanges), resp = AR(f,ang,sampleRanges(ind),w);resp = resp / array.getNumElements;Resp =重塑(Resp,size(x));alpha = 1 - (abs(sampleRanges(ind) - focalRange)/(max(sampleRanges)-min(sampleRanges)));%的透明度冲浪(x * sampleRanges(印第安纳州),y * sampleRanges(印第安纳州),z * sampleRanges(印第安纳州),mag2db (abs(职责)),“FaceAlpha”,α)阴影结束%绘制元素位置和轴向矢量-32年caxis ([0]) plot3 (elemPos (1:), elemPos (2:), elemPos (3:)“布莱克”“markersize”4);[b(1),b(2),b(3)] = sph2cart(azSteer*pi/180,elSteer*pi/180,max(sampleRanges)*1.2);quiver3 (0, 0, 0, b (1), (2), (3),“黑”自动定量的“关闭”)轴平等的持有集(gca),“视图”, -70年[22])结束
Baidu
map