Skip to content

leospark/Cpp-Array-Processing

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

# 🎯 C++ 阵列信号处理与AI测向框架

本项目实现了完整的阵列信号处理流程,结合**传统算法**和**深度学习**方法,用于方向到达角(DOA)估计。采用现代C++设计,集成ONNX Runtime实现AI推理,是一个完整的智能测向解决方案。

[![Language](https://img.shields.io/badge/Language-C++17-blue.svg)](https://isocpp.org/)
[![Build System](https://img.shields.io/badge/Build-CMake-green.svg)](https://cmake.org/)
[![AI Framework](https://img.shields.io/badge/AI-ONNX%20Runtime-orange.svg)](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!

About

CBF、MVDR和MUSIC的c++工程化

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • C++ 62.6%
  • Python 30.6%
  • CMake 6.8%