leospark/Cpp-Array-Processing
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
# 🎯 C++ 阵列信号处理与AI测向框架 本项目实现了完整的阵列信号处理流程,结合**传统算法**和**深度学习**方法,用于方向到达角(DOA)估计。采用现代C++设计,集成ONNX Runtime实现AI推理,是一个完整的智能测向解决方案。 [](https://isocpp.org/) [](https://cmake.org/) [](https://onnxruntime.ai/) ## ✨ 核心特性 ### 📡 传统测向算法 - **CBF** (常规波束形成) - 经典空域滤波方法 - **MVDR** (最小方差无失真响应) - 自适应波束形成 - **MUSIC** (多重信号分类) - 子空间超分辨算法 ### 🤖 AI深度学习测向 - **深度神经网络** - 基于协方差矩阵特征的角度回归 - **ONNX模型推理** - C++端高性能推理 - **端到端训练** - 从数据生成到模型部署的完整流程 ### 🏗️ 工程架构 - **面向对象设计** - `Beamformer` 类封装所有算法 - **CMake构建系统** - 跨平台编译支持 - **模块化设计** - 头文件与实现分离,易于扩展 - **第三方库集成** - Eigen3数学库 + ONNX Runtime推理引擎 ## 📋 项目结构 ``` CBF_MVDR_MUSIC_2026.1.10/ ├── 3rdparty/ # 第三方依赖库 │ ├── eigen3/ # Eigen3 线性代数库(头文件) │ └── onnxruntime/ # ONNX Runtime 推理引擎 │ ├── include/ # 头文件 │ └── lib/ # 动态库文件 ├── include/ # 项目头文件 │ └── Beamformer.h # 波束形成类定义 ├── src/ # 源代码实现 │ ├── main.cpp # 主程序入口 │ └── Beamformer.cpp # 算法实现 ├── data/ # 数据文件 │ ├── cbf_input.txt # 测试数据(复数阵列信号) │ └── doa_model.onnx # 训练好的AI模型 ├── model_training/ # AI模型训练 │ ├── train_doa.py # PyTorch训练脚本 │ └── doa_model.onnx # 导出的ONNX模型 ├── build/ # CMake构建目录(.gitignore忽略) ├── CMakeLists.txt # CMake配置文件 └── readme # 本文件 ``` ## 🔧 环境依赖 ### 必需组件 - **CMake** ≥ 3.10 - **C++编译器** - 支持C++17标准 - Windows: MinGW-w64 或 MSVC - Linux: GCC ≥ 7.0 - **Eigen3** - 已包含在 `3rdparty/eigen3`(无需额外安装) - **ONNX Runtime** - 已包含在 `3rdparty/onnxruntime` ### AI训练环境(可选) 如需重新训练模型,需要: ```bash pip install torch numpy onnx onnxscript ``` ## 🚀 快速开始 ### 1️⃣ 克隆项目 ```bash git clone https://github.com/2622912324gu/Cpp-Array-Processing.git cd Cpp-Array-Processing ``` ### 2️⃣ 编译项目 ```bash # 创建构建目录 mkdir build cd build # 配置CMake cmake .. # 编译 cmake --build . ``` ### 3️⃣ 运行程序 ```bash # Windows .\SmartRadar.exe # Linux ./SmartRadar ``` ### 📊 预期输出 ``` === Modern C++ Array Processing Framework === [Info] Data loaded. Shape:10x100 [Info] Covariance matrix R computed. CBF Power at 30 degrees: 104.055 MVDR Power at 30 degrees: 0.931144 MUSIC Power at 30 degrees: 84.7295 Program finished [AI] Loading ONNX model... AI predicted angle: -30.9711 ``` ## 🔬 技术原理 ### 阵列信号模型 ``` 接收信号模型: X = A*S + N - X: n_sensors × n_snapshots 接收数据矩阵 - A: 导向矢量矩阵 - S: 信号矩阵 - N: 噪声矩阵 协方差矩阵: R = E[X*X^H] = A*Rs*A^H + σ²I ``` ### 算法流程 #### 1. CBF (常规波束形成) ```cpp P_CBF(θ) = a^H(θ) * R * a(θ) ``` - 简单高效,计算量小 - 分辨率受阵列孔径限制 #### 2. MVDR (最小方差无失真响应) ```cpp w_MVDR = R^(-1) * a(θ) / (a^H(θ) * R^(-1) * a(θ)) P_MVDR(θ) = 1 / (a^H(θ) * R^(-1) * a(θ)) ``` - 自适应权重计算 - 抑制干扰,提升信噪比 #### 3. MUSIC (多重信号分类) ```cpp 特征分解: R = U_s * Λ_s * U_s^H + U_n * Λ_n * U_n^H P_MUSIC(θ) = 1 / (a^H(θ) * U_n * U_n^H * a(θ)) ``` - 超分辨算法 - 利用噪声子空间正交性 #### 4. AI深度学习测向 ``` 输入: 协方差矩阵 R (10×10 复数) → 展平为 200维向量 (100实部 + 100虚部) 网络: MLP (200 → 128 → 64 → 1) 输出: 预测角度 θ ∈ [-60°, 60°] 训练: 5000个样本,MSE损失,Adam优化器 ``` ## 📁 数据格式说明 ### 输入数据 (`cbf_input.txt`) 格式:每行一个复数,先实部后虚部 ``` # 100个时间快拍 × 10个阵元 = 1000行 real_part imaginary_part 0.5 0.3 -0.2 0.8 ... ``` 数据组织:按时间快拍优先 - 第1-10行:第1个快拍的10个阵元数据 - 第11-20行:第2个快拍的10个阵元数据 - ... ## 🧠 AI模型训练 ### 训练新模型 ```bash cd model_training python train_doa.py ``` ### 训练过程 1. **数据生成**:随机生成5000个样本,角度范围 [-60°, 60°] 2. **特征提取**:计算协方差矩阵并展平 3. **网络训练**:500个epoch,学习率0.001 4. **模型导出**:保存为ONNX格式,权重内嵌 ### 模型部署 训练完成后,将 `doa_model.onnx` 复制到: - `build/` 目录(程序运行时加载) - `data/` 目录(备份) ## 🛠️ 代码架构 ### Beamformer 类接口 ```cpp class Beamformer { public: Beamformer(int sensors, int snapshots); // 数据处理 void loadData(const std::string& filename); void computeCovariance(); // 传统算法 double runCBF(double theta_deg); double runMVDR(double theta_deg); double runMUSIC(double theta_deg, int n_sources); // AI推理 double runSmartDOA(); private: VectorXcd getSteeringVector(double theta_deg); int n_sensors_; // 阵元数 int n_snapshots_; // 快拍数 double d_; // 阵元间距(波长单位) MatrixXcd X_; // 接收数据矩阵 MatrixXcd R_; // 协方差矩阵 }; ``` ### 关键技术点 - **Eigen库应用**:复数矩阵运算、特征分解 - **ONNX Runtime集成**:C++ API调用、Tensor构造 - **CMake配置**:头文件路径、库链接、跨平台支持 ## 📝 常见问题 ### Q1: 编译时找不到Eigen头文件 **A**: 检查 `CMakeLists.txt` 中的路径设置: ```cmake include_directories("3rdparty/eigen3") ``` ### Q2: 运行时提示找不到 `onnxruntime.dll` **A**: 将 `3rdparty/onnxruntime/lib/onnxruntime.dll` 复制到 `build/` 目录,或添加到系统PATH。 ### Q3: ONNX模型加载失败 **A**: 确保 `doa_model.onnx` 在 `build/` 目录中,且权重已内嵌(无需`.data`文件)。 ### Q4: AI预测角度不准确 **A**: 检查: - 输入数据是否正确加载 - 协方差矩阵计算是否正常 - 模型是否与训练时的特征提取方式匹配 ## 🔮 未来改进 - [ ] 增加更多DOA算法(ESPRIT、Root-MUSIC等) - [ ] 支持二维DOA估计(方位角+俯仰角) - [ ] 优化AI模型(CNN、Transformer等架构) - [ ] 添加可视化界面(谱图绘制) - [ ] 实时信号处理支持 - [ ] GPU加速(CUDA) ## 📄 许可证 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 ## 👨💻 贡献 欢迎提交 Issue 和 Pull Request! ## 📧 联系方式 - GitHub: [@2622912324gu](https://github.com/2622912324gu) - 项目链接: [Cpp-Array-Processing](https://github.com/2622912324gu/Cpp-Array-Processing) --- ⭐ 如果这个项目对你有帮助,请给个Star!