超声相控阵波束合成实战代码
目录核心需求确认一、Python 完整代码带可视化初学者友好代码运行说明二、C 完整代码工程化版本可移植C 代码说明三、核心知识点总结相控波束合成完整代码我为你提供Python 版本易理解、可直接运行、带可视化和C 版本工程化、可移植到硬件 / 上位机覆盖发射延迟计算、接收波束合成、动态聚焦、分数延迟插值等核心功能完全适配超声相控阵应用场景。核心需求确认你需要的是相控阵波束合成的端到端可运行代码包含延迟计算、多通道数据处理、波束合成核心逻辑且能直观看到效果同时兼顾工程实用性。一、Python 完整代码带可视化初学者友好该代码实现128 阵元线性阵列延迟计算偏转 聚焦分数延迟插值解决非整数采样点延迟问题多通道回波模拟与接收波束合成动态聚焦 扇形扫描效果可视化输出合成后的 A-Scan/B-Scan 图像import numpy as np import matplotlib.pyplot as plt from scipy import signal # 全局参数配置 # 阵列参数 N_ELEMENTS 128 # 阵元数 PITCH 0.6e-3 # 阵元间距 (m) CENTER_FREQ 5e6 # 中心频率 (Hz) SAMPLING_RATE 100e6 # 采样率 (Hz) SOUND_SPEED 5900 # 钢中声速 (m/s) # 扫描参数 DEFLECT_ANGLE 30 # 偏转角度 (°) FOCUS_DEPTH 0.05 # 聚焦深度 (m) SCAN_DEPTH 0.1 # 扫描深度 (m) SCAN_POINTS 200 # 深度采样点数 # 核心函数定义 def calculate_delay(angle_deg, focus_depth): 计算每个阵元的延迟偏转聚焦 :param angle_deg: 偏转角度 (°) :param focus_depth: 聚焦深度 (m) :return: 每个阵元的延迟 (s) angle_rad np.deg2rad(angle_deg) delays np.zeros(N_ELEMENTS) # 阵元位置中心对称 element_pos np.arange(N_ELEMENTS) * PITCH - (N_ELEMENTS-1)*PITCH/2 for n in range(N_ELEMENTS): xn element_pos[n] # 偏转聚焦延迟公式 path_length np.sqrt(focus_depth**2 xn**2 - 2*focus_depth*xn*np.sin(angle_rad)) delays[n] path_length / SOUND_SPEED # 减去最小延迟对齐时间起点 delays - np.min(delays) return delays def fractional_delay(signal, delay_samples, fs): 分数延迟插值Lagrange 4阶插值工程常用 :param signal: 输入信号 :param delay_samples: 延迟采样点数可小数 :param fs: 采样率 :return: 延迟后的信号 int_delay int(np.floor(delay_samples)) frac_delay delay_samples - int_delay # 构造Lagrange插值核 taps 4 # 4阶插值 x np.arange(-taps, taps1) kernel np.ones_like(x) for i in range(len(x)): for j in range(len(x)): if i ! j: kernel[i] * (frac_delay - x[j]) / (x[i] - x[j]) # 卷积实现插值延迟 delayed_sig signal.convolve(signal, kernel, modesame) # 整数延迟移位 delayed_sig np.roll(delayed_sig, int_delay) return delayed_sig def simulate_echo_data(): 模拟多通道回波数据含噪声 :return: (N_ELEMENTS, N_SAMPLES) 回波数据 # 生成时间轴 t_total SCAN_DEPTH / SOUND_SPEED * 2 # 往返时间 n_samples int(t_total * SAMPLING_RATE) t np.arange(n_samples) / SAMPLING_RATE # 生成基准信号调幅正弦波 envelope np.hanning(len(t)) # 汉宁窗降低旁瓣 base_signal np.sin(2 * np.pi * CENTER_FREQ * t) * envelope # 叠加高斯噪声模拟实际采集 noise np.random.normal(0, 0.1, len(base_signal)) base_signal noise # 生成多通道数据每个通道带微小幅度差异 echo_data np.zeros((N_ELEMENTS, n_samples)) for n in range(N_ELEMENTS): # 模拟通道间幅度衰减0.95~1.0 amp 0.95 0.05 * np.random.random() echo_data[n] base_signal * amp return echo_data, n_samples def beamforming(echo_data, delays): 接收波束合成核心逻辑 :param echo_data: 多通道回波数据 (N_ELEMENTS, N_SAMPLES) :param delays: 每个阵元的延迟 (s) :return: 合成后的A-Scan信号 n_samples echo_data.shape[1] beamformed np.zeros(n_samples) # 延迟转采样点数可小数 delay_samples delays * SAMPLING_RATE # 逐通道延迟叠加 for n in range(N_ELEMENTS): delayed_sig fractional_delay(echo_data[n], delay_samples[n], SAMPLING_RATE) beamformed delayed_sig # 归一化 beamformed / N_ELEMENTS return beamformed def dynamic_focus_beamforming(echo_data): 动态聚焦波束合成不同深度对应不同聚焦点 :param echo_data: 多通道回波数据 :return: B-Scan图像数据 n_samples echo_data.shape[1] b_scan np.zeros((SCAN_POINTS, n_samples)) # 逐深度点动态聚焦 depths np.linspace(0.01, SCAN_DEPTH, SCAN_POINTS) for i, depth in enumerate(depths): # 每个深度重新计算延迟 delays calculate_delay(DEFLECT_ANGLE, depth) # 波束合成 a_scan beamforming(echo_data, delays) b_scan[i] a_scan return b_scan # 主流程执行 if __name__ __main__: # 1. 模拟多通道回波数据 echo_data, n_samples simulate_echo_data() print(f生成 {N_ELEMENTS} 通道回波数据每通道 {n_samples} 采样点) # 2. 计算固定延迟偏转聚焦 fixed_delays calculate_delay(DEFLECT_ANGLE, FOCUS_DEPTH) # 3. 固定聚焦波束合成A-Scan a_scan_fixed beamforming(echo_data, fixed_delays) # 4. 动态聚焦波束合成B-Scan b_scan_data dynamic_focus_beamforming(echo_data) # 5. 可视化结果 fig, axes plt.subplots(2, 1, figsize(12, 8)) # A-Scan图像 axes[0].plot(a_scan_fixed) axes[0].set_title(fA-Scan (偏转{DEFLECT_ANGLE}°聚焦{FOCUS_DEPTH*100}cm)) axes[0].set_xlabel(采样点) axes[0].set_ylabel(振幅) # B-Scan图像 im axes[1].imshow(b_scan_data, aspectauto, cmapgray, extent[0, n_samples, SCAN_DEPTH*100, 0]) axes[1].set_title(fB-Scan (动态聚焦扫描深度{SCAN_DEPTH*100}cm)) axes[1].set_xlabel(采样点) axes[1].set_ylabel(深度 (cm)) plt.colorbar(im, axaxes[1]) plt.tight_layout() plt.show()代码运行说明环境依赖安装必要库pip install numpy matplotlib scipy运行效果输出 A-Scan 曲线单深度聚焦后的合成信号输出 B-Scan 图像全深度动态聚焦的扫描结果可直接修改DEFLECT_ANGLE/FOCUS_DEPTH等参数测试不同效果二、C 完整代码工程化版本可移植该版本适配嵌入式 / 上位机开发去掉可视化保留核心算法可直接集成到相控阵检测设备中#include iostream #include vector #include cmath #include algorithm #include numeric // 全局参数定义 const int N_ELEMENTS 128; // 阵元数 const double PITCH 0.6e-3; // 阵元间距 (m) const double CENTER_FREQ 5e6; // 中心频率 (Hz) const double SAMPLING_RATE 100e6; // 采样率 (Hz) const double SOUND_SPEED 5900; // 钢中声速 (m/s) // 延迟计算函数 std::vectordouble calculateDelay(double angleDeg, double focusDepth) { std::vectordouble delays(N_ELEMENTS, 0.0); double angleRad angleDeg * M_PI / 180.0; // 计算阵元位置中心对称 std::vectordouble elementPos(N_ELEMENTS); for (int n 0; n N_ELEMENTS; n) { elementPos[n] n * PITCH - (N_ELEMENTS-1)*PITCH/2; } // 计算每个阵元的延迟 for (int n 0; n N_ELEMENTS; n) { double xn elementPos[n]; double pathLength sqrt(pow(focusDepth, 2) pow(xn, 2) - 2*focusDepth*xn*sin(angleRad)); delays[n] pathLength / SOUND_SPEED; } // 减去最小延迟 double minDelay *std::min_element(delays.begin(), delays.end()); for (auto d : delays) d - minDelay; return delays; } // 分数延迟插值Lagrange 4阶 std::vectordouble fractionalDelay(const std::vectordouble signal, double delaySamples) { int intDelay static_castint(floor(delaySamples)); double fracDelay delaySamples - intDelay; // 4阶Lagrange插值核 const int taps 4; std::vectordouble x {-4, -3, -2, -1, 0, 1, 2, 3, 4}; std::vectordouble kernel(x.size(), 1.0); for (int i 0; i x.size(); i) { for (int j 0; j x.size(); j) { if (i ! j) { kernel[i] * (fracDelay - x[j]) / (x[i] - x[j]); } } } // 卷积实现插值 std::vectordouble delayedSignal(signal.size(), 0.0); for (int i taps; i signal.size() - taps; i) { double sum 0.0; for (int k 0; k kernel.size(); k) { sum signal[i - taps k] * kernel[k]; } delayedSignal[i] sum; } // 整数延迟移位 std::vectordouble output(signal.size(), 0.0); for (int i 0; i signal.size() - intDelay; i) { if (i intDelay signal.size()) { output[i intDelay] delayedSignal[i]; } } return output; } // 波束合成核心函数 std::vectordouble beamforming(const std::vectorstd::vectordouble echoData, const std::vectordouble delays) { int nSamples echoData[0].size(); std::vectordouble beamformed(nSamples, 0.0); std::vectordouble delaySamples(N_ELEMENTS); // 延迟转采样点数 for (int n 0; n N_ELEMENTS; n) { delaySamples[n] delays[n] * SAMPLING_RATE; } // 逐通道延迟叠加 for (int n 0; n N_ELEMENTS; n) { std::vectordouble delayedSig fractionalDelay(echoData[n], delaySamples[n]); for (int i 0; i nSamples; i) { beamformed[i] delayedSig[i]; } } // 归一化 double sum std::accumulate(beamformed.begin(), beamformed.end(), 0.0); for (auto val : beamformed) val / sum; return beamformed; } // 主函数测试 int main() { // 1. 模拟多通道数据实际使用时替换为ADC采集数据 int nSamples 2000; std::vectorstd::vectordouble echoData(N_ELEMENTS, std::vectordouble(nSamples, 0.0)); for (int n 0; n N_ELEMENTS; n) { for (int i 0; i nSamples; i) { double t i / SAMPLING_RATE; echoData[n][i] sin(2 * M_PI * CENTER_FREQ * t) * (0.5 - 0.5*cos(2*M_PI*i/(nSamples-1))); } } // 2. 计算延迟30°偏转5cm聚焦 std::vectordouble delays calculateDelay(30.0, 0.05); // 3. 波束合成 std::vectordouble aScan beamforming(echoData, delays); // 4. 输出结果前100个采样点 std::cout 波束合成后A-Scan前100点 std::endl; for (int i 0; i 100; i) { std::cout aScan[i] ; } std::cout std::endl; return 0; }C 代码说明编译运行需链接数学库如 g 编译g beamforming.cpp -o beamforming -lm工程适配echoData替换为多通道 ADC 采集的原始数据可通过 FPGA/MCU 实现硬件加速延迟计算、插值、叠加支持动态聚焦循环调用calculateDelay更新不同深度的延迟三、核心知识点总结延迟计算核心公式为路径长度/声速结合偏转角度和聚焦深度实现波束定向 聚焦。分数延迟插值解决延迟非整数采样点的问题4 阶 Lagrange 插值是工程中平衡精度和效率的最优选择。波束合成逻辑逐通道延迟对齐 → 信号叠加 → 归一化本质是让目标点回波同相增强。动态聚焦对每个深度点重新计算延迟是提升相控阵成像分辨率的关键。该代码可直接用于超声相控阵无损检测、医疗超声成像等项目如需适配特定硬件如 16/64 阵元、不同声速介质仅需修改全局参数即可。

相关新闻

正确理解C++中的值语义:move

正确理解C++中的值语义:move

正确理解C中的值语义:move C每个表达式都有自己独特的类型和值类别。其中值类别能够让我们和编译器正确的理解每一份内存的生命周期,从而能够在保证安全的情况下对内存资源进行高效的利用。大多数情况下,值类别的判断交给编译器就可以了&…

2026/7/6 14:25:05 阅读更多 →
《深度解析!Agentic AI在智能制造潜力,提示工程架构师视角揭秘》

《深度解析!Agentic AI在智能制造潜力,提示工程架构师视角揭秘》

深度解析!Agentic AI在智能制造的潜力——提示工程架构师视角揭秘 引言:智能制造的“痛”与Agentic AI的“药” 1. 智能制造的现状与痛点 当我们谈论“工业4.0”“数字化转型”时,智能制造的核心需求从未改变:更高效、更柔性、更智…

2026/7/3 16:40:50 阅读更多 →
基于双层优化与二阶锥松弛模型的电动汽车时空调度策略:在MATLAB环境中的配电网研究

基于双层优化与二阶锥松弛模型的电动汽车时空调度策略:在MATLAB环境中的配电网研究

双层优化 大型电动汽车 时空调度 测试环境:MATLAB 关键词:双层优化,电动汽车,时空调度,配电网。 考虑电动汽车有序充放电的机组组合和最优趋势,机组组合采用相同的线性化方法,采用二阶锥松弛的…

2026/7/6 11:50:39 阅读更多 →

最新新闻

learn-opengl入门

learn-opengl入门

opengl是一个大状态机 环境配置 1.下载GLFW源代码 2.创建librarel文件包含include目录和第三方库libs 3.include直接从GLFW的源代码中拿,libs里需要编译生成的库glfw3.lib。 4.通过CMake编译源代码拿到glfw3.lib。 5.将我们的librarel加入编辑器的包含文件和库目录里&#xff0…

2026/7/6 21:34:28 阅读更多 →
初入编程世界感觉眼花缭乱?

初入编程世界感觉眼花缭乱?

眼花缭乱有没有?抽象理解第一个C语言程序1. C语言是什么概括:多用于底层开发的,面向过程的编程语言2. 上来就写程序?我开始也觉得不合理,哪有上来就敲代码嘛...QAQ其实不然,一个最简单的“Hello world”程序…

2026/7/6 21:34:28 阅读更多 →
@Async异步线程:Spring 自带的异步解决方案

@Async异步线程:Spring 自带的异步解决方案

前言 在项目应用中,使用MQ异步调用来实现系统性能优化,完成服务间数据同步是常用的技术手段。如果是在同一台服务器内部,不涉及到分布式系统,单纯的想实现部分业务的异步执行,这里介绍一个更简单的异步方法调…

2026/7/6 21:30:26 阅读更多 →
揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪?

揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪?

揭秘HQTrack核心架构:InternT-MSDeAOTL-V2模型如何实现高精度实时追踪? 【免费下载链接】HQTrack Tracking Anything in High Quality 项目地址: https://gitcode.com/gh_mirrors/hq/HQTrack 你是否曾想过,如何让计算机像人类一样精准…

2026/7/6 21:28:26 阅读更多 →
从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路

从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路

从 0 新增一个 has.echo:我如何理解小程序容器里的 API 调用链路说明:本文是一次脱敏后的学习复盘。文中的 has.echo、EchoModule、system.demo 都是为了讲清楚调用链路而设计的最小示例,不包含公司内部源码、真实业务接口、真实模块路径和敏…

2026/7/6 21:28:26 阅读更多 →
151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控

151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控

151、RAG 检索增强生成(五):评估体系——RAGAS 指标、人工评测与线上监控 上周五凌晨两点,我被生产环境告警电话吵醒。用户反馈一个法律咨询机器人回答“根据《民法典》第X条,您需要承担全部责任”,但实际法条引用完全错误。我查了日志,发现RAG检索到的文档片段是某篇自…

2026/7/6 21:26:25 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻