从仿真动画到代码:我是如何用Python复现超声波束合成中的Grating Lobe和Side Lobe的

张开发
2026/4/8 13:26:39 15 分钟阅读

分享文章

从仿真动画到代码:我是如何用Python复现超声波束合成中的Grating Lobe和Side Lobe的
从仿真动画到代码Python复现超声成像中的Grating Lobe与Side Lobe现象超声成像技术作为现代医学诊断的重要工具其核心原理是通过声波的发射与接收构建人体内部结构的图像。在这个过程中波束合成的质量直接影响成像的清晰度和准确性。本文将带你用Python一步步实现超声成像中的两个关键现象——Grating Lobe栅瓣和Side Lobe旁瓣的仿真通过代码直观展示这些现象的产生原理及其对图像质量的影响。1. 超声成像基础与环境搭建在开始编码之前我们需要理解几个基本概念。超声探头由多个阵元(element)组成通过控制各阵元的发射延时形成聚焦声束。接收时则通过动态聚焦技术将各阵元接收到的信号合成。这一过程中阵元间距、发射频率等参数会直接影响波束特性。首先配置Python环境我们将使用以下主要库import numpy as np import matplotlib.pyplot as plt from scipy.signal import gausspulse from scipy.ndimage import gaussian_filternumpy用于数值计算和数组操作matplotlib用于数据可视化scipy.signal提供信号处理工具scipy.ndimage用于图像处理提示建议使用Python 3.8版本并创建独立的虚拟环境以避免依赖冲突。2. 超声场建模与波束形成2.1 探头参数设置我们先定义一个64阵元的线阵探头设置基本参数# 探头参数 num_elements 64 # 阵元数量 pitch 0.3e-3 # 阵元间距(米) center_freq 3e6 # 中心频率3MHz sampling_freq 50e6 # 采样频率50MHz c 1540 # 声速(m/s)2.2 发射波束形成实现偏转45度的发射波束形成def create_transmit_delays(num_elements, pitch, angle, focus_depth, c): 计算各阵元的发射延时 positions np.arange(num_elements) * pitch - (num_elements-1)*pitch/2 delays np.sqrt(positions**2 focus_depth**2 - 2*positions*focus_depth*np.sin(angle))/c return delays - delays.min() # 45度偏转聚焦深度30mm angle np.radians(45) focus_depth 30e-3 tx_delays create_transmit_delays(num_elements, pitch, angle, focus_depth, c)2.3 声场计算计算空间各点的声压分布def calculate_pressure_field(tx_delays, num_elements, pitch, freq, c, grid_size(100,100)): 计算声场压力分布 x np.linspace(-20e-3, 20e-3, grid_size[0]) z np.linspace(0, 40e-3, grid_size[1]) X, Z np.meshgrid(x, z) pressure np.zeros_like(X) for i in range(num_elements): elem_pos i * pitch - (num_elements-1)*pitch/2 distance np.sqrt((X - elem_pos)**2 Z**2) arrival_time distance / c - tx_delays[i] pressure np.cos(2 * np.pi * freq * arrival_time) * (arrival_time 0) return x, z, pressure x, z, pressure calculate_pressure_field(tx_delays, num_elements, pitch, center_freq, c)3. Grating Lobe现象仿真与分析3.1 可视化声场分布将计算得到的声场可视化plt.figure(figsize(10,8)) plt.imshow(20*np.log10(np.abs(pressure)1e-6), extent[x.min()*1e3, x.max()*1e3, z.max()*1e3, z.min()*1e3], cmapgray, vmin-40, vmax0) plt.colorbar(label声压(dB)) plt.xlabel(横向位置(mm)) plt.ylabel(深度(mm)) plt.title(45度偏转发射声场分布) plt.show()3.2 Grating Lobe形成机制Grating Lobe是由于阵元间距过大导致的伪影。当阵元间距d与波长λ满足以下关系时会出现明显的Grating Lobed/λ 1/(1 |sinθ|)其中θ为偏转角度。我们可以通过调整参数观察Grating Lobe的变化参数无Grating Lobe明显Grating Lobe阵元间距0.2mm0.3mm频率5MHz3MHz偏转角度30度45度3.3 参数影响实验通过代码系统研究各参数影响def analyze_grating_lobe_conditions(): 分析不同参数下Grating Lobe表现 conditions [ {pitch:0.2e-3, freq:5e6, angle:30}, {pitch:0.3e-3, freq:3e6, angle:45} ] fig, axes plt.subplots(1, 2, figsize(15,6)) for ax, params in zip(axes, conditions): tx_delays create_transmit_delays(num_elements, params[pitch], np.radians(params[angle]), 30e-3, c) _, _, pressure calculate_pressure_field(tx_delays, num_elements, params[pitch], params[freq], c) ax.imshow(20*np.log10(np.abs(pressure)1e-6), cmapgray, vmin-40, vmax0) ax.set_title(f间距{params[pitch]*1e3:.1f}mm, {params[freq]/1e6}MHz, {params[angle]}°) plt.tight_layout() plt.show() analyze_grating_lobe_conditions()4. Side Lobe现象与抑制技术4.1 Side Lobe的产生Side Lobe是主瓣周围出现的次级能量峰主要由孔径有限导致的衍射引起。我们可以通过变迹(Apodization)技术来抑制Side Lobe。实现汉宁窗变迹def apply_apodization(pressure_field, window_typehanning): 应用变迹窗函数 if window_type hanning: window np.hanning(num_elements) elif window_type uniform: window np.ones(num_elements) apodized_pressure np.zeros_like(pressure_field) for i in range(num_elements): apodized_pressure pressure_field[:,:,i] * window[i] return apodized_pressure4.2 变迹效果对比比较不同变迹方式的效果# 计算无变迹声场 _, _, pressure_uniform calculate_pressure_field(tx_delays, num_elements, pitch, center_freq, c) # 计算汉宁窗变迹声场 pressure_hanning apply_apodization(pressure_uniform, hanning) # 绘制对比 plt.figure(figsize(12,5)) plt.subplot(121) plt.imshow(20*np.log10(np.abs(pressure_uniform)1e-6), cmapgray, vmin-60, vmax0) plt.title(无变迹) plt.subplot(122) plt.imshow(20*np.log10(np.abs(pressure_hanning)1e-6), cmapgray, vmin-60, vmax0) plt.title(汉宁窗变迹) plt.show()变迹技术对成像质量的影响优点显著降低Side Lobe幅度提高图像对比度减少伪影干扰代价主瓣略微展宽轻微降低分辨率5. 完整成像仿真流程5.1 靶点模型建立创建一个包含多个理想靶点的测试模型def create_target_model(grid_size(100,100)): 创建靶点测试模型 model np.zeros(grid_size) # 添加靶点 model[30, 50] 1 # 中心靶点 model[30, 70] 1 # 右侧靶点 model[50, 50] 0.8 # 下方靶点 return gaussian_filter(model, sigma1) target_model create_target_model()5.2 完整成像仿真实现从发射到接收的完整成像流程def simulate_imaging(target_model, tx_angle, tx_focus, rx_focus, apodizationhanning): 完整成像仿真 # 发射波束形成 tx_delays create_transmit_delays(num_elements, pitch, np.radians(tx_angle), tx_focus, c) # 声场传播 _, _, tx_pressure calculate_pressure_field(tx_delays, num_elements, pitch, center_freq, c) # 接收信号模拟 rx_signals np.zeros((num_elements, *target_model.shape)) for i in range(num_elements): elem_pos i * pitch - (num_elements-1)*pitch/2 # 简化的接收信号模型 rx_signals[i] tx_pressure * target_model * np.exp(-0.02 * distance_from_element(elem_pos)) # 接收波束形成 rx_delays create_transmit_delays(num_elements, pitch, np.radians(tx_angle), rx_focus, c) if apodization hanning: weights np.hanning(num_elements) else: weights np.ones(num_elements) beamformed np.zeros(target_model.shape) for i in range(num_elements): beamformed rx_signals[i] * weights[i] * compensate_delay(rx_delays[i]) return beamformed5.3 结果分析与优化对比不同参数下的成像质量# 不同参数组合成像 params_combinations [ {tx_angle:0, tx_focus:30e-3, rx_focus:30e-3, apodization:uniform}, {tx_angle:45, tx_focus:30e-3, rx_focus:30e-3, apodization:uniform}, {tx_angle:45, tx_focus:30e-3, rx_focus:30e-3, apodization:hanning} ] results [] for params in params_combinations: img simulate_imaging(target_model, **params) results.append(20*np.log10(np.abs(img)1e-6)) # 可视化比较 fig, axes plt.subplots(1, 3, figsize(18,6)) titles [0度无变迹, 45度无变迹, 45度汉宁窗] for ax, img, title in zip(axes, results, titles): ax.imshow(img, cmapgray, vmin-40, vmax0) ax.set_title(title) plt.show()在实际项目中我们发现当使用3MHz中心频率、0.3mm阵元间距时45度偏转会出现明显的Grating Lobe伪影。通过调整阵元间距至0.2mm或提高频率至5MHz可以显著改善这一问题。同时汉宁窗变迹能有效抑制Side Lobe虽然会使主瓣略微展宽但在大多数临床应用中是可以接受的折衷方案。

更多文章