forked from nudt_dsp/sonar2radar
主要改动: - 移除 PingPongBuffer 作为独立模块,改为模块内寄存器 - DopplerStream/ED 接收整批数据,内部迭代处理 - 简化 RadarModuleConfigs/SonarModuleConfigs,移除连接配置 - 精简测试:只对比仿真与 reference.py 结果 - 节省 50% 存储空间 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .github/workflows | ||
| app | ||
| docs | ||
| scripts | ||
| sim | ||
| tests | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| LICENSE | ||
| README.md | ||
README.md
信号处理仿真平台
脉冲多普勒雷达和主动声纳信号处理仿真平台,用于架构验证和硬件统计。
特性
- 多层级仿真:算法级(验证算法)+ 周期级(模拟时序)
- Stream 协议:valid/ready 握手,Pipeline 延迟建模,背压传播
- SDF 框架:SDFGraph 统一数据流调度,支持 PingPong 缓冲
- 定点数仿真:支持可配置的定点数精度,模拟真实硬件行为
- 分类度量统计:ROM/RAM/COMPUTE 分类统计,量化存储和计算资源
- 统一配置:dataclass 配置类,支持并行度参数化
目录结构
sim/ # 通用基础设施
├── types.py # 定点数类型、转换、饱和
├── metrics.py # 度量收集(ROM/RAM/COMPUTE 分类)
├── sdf.py # SDF 数据流图(SDFGraph)
├── pipeline.py # 延迟建模(DelayLine + Pipeline)
├── stream_fsm.py # Stream 状态机(valid/ready 握手)
├── pingpong.py # Ping-Pong 双缓冲
├── rom.py # 只读存储器(预计算系数)
└── report.py # 报告生成
app/
├── common/
│ ├── funcs.py # 共享计算函数
│ ├── types.py # 通用数据类型
│ ├── input_source.py # 输入源
│ ├── output_collector.py # 输出收集器
│ └── signal.py # 信号生成工具
├── radar/
│ ├── signal.py # RadarParams 和信号生成
│ ├── configs.py # 模块配置(dataclass)
│ ├── processor.py # SDF 处理器
│ ├── simulation.py # 仿真入口
│ ├── reference.py # 浮点参考实现
│ └── modules/ # 硬件模块
│ ├── matched_filter_stream.py # MF(FFT→CMUL→IFFT)
│ ├── time_beamformer_stream.py # 时域 BF
│ ├── doppler_stream.py # Doppler 处理
│ └── energy_detection_stream.py # 能量检测
└── sonar/
├── signal.py # SonarParams 和信号生成
├── configs.py # 模块配置
├── processor.py # SDF 处理器
├── simulation.py # 仿真入口
├── reference.py # 浮点参考实现
└── modules/
├── matched_filter_freq_stream.py # 频域 MF
├── freq_beamformer_stream.py # 频域 BF
└── ifft_energy_detection_stream.py # IFFT + 能量检测
docs/ # 设计文档
├── MODULE_DESIGN.md # 模块设计(SDF 框架、Stream 协议)
└── SIM_FRAMEWORK.md # 框架设计
output/ # 仿真输出
├── radar/
│ └── images/ # 输出图片
└── sonar/
└── images/
tests/ # 测试
├── test_sdf.py # SDF 框架测试
├── test_pipeline.py # Pipeline 测试
├── test_pingpong.py # PingPong 缓冲测试
├── test_types.py # 定点类型测试
├── test_radar_processor.py # 雷达处理器测试
├── test_sonar_processor.py # 声纳处理器测试
└── test_algorithm_correctness.py # 检测精度测试
核心设计
五层架构
┌─────────────────────────────────────────────────────┐
│ Processor (处理器层) │
│ - 管理输入输出 │
│ - 预计算系数(ROM) │
│ - 收集结果 │
├─────────────────────────────────────────────────────┤
│ SDFGraph (数据流图层) │
│ - 模块连接 │
│ - PingPong 缓冲管理 │
│ - 调度执行(拓扑顺序) │
├─────────────────────────────────────────────────────┤
│ stream_fsm (状态机层) │
│ - valid/ready 握手 │
│ - pending output 管理 │
│ - 背压传播 │
├─────────────────────────────────────────────────────┤
│ Pipeline / _ctrl_fsm (控制层) │
│ - Pipeline: 延迟建模,1:1 数据流 │
│ - _ctrl_fsm: 累加控制,N:1 数据流 │
├─────────────────────────────────────────────────────┤
│ _compute (计算层) │
│ - fft_compute, cmul_compute, abs_sq_compute 等 │
│ - ROM 系数读取 │
└─────────────────────────────────────────────────────┘
Stream 协议
def tick(self, data, valid_in, ready_in=True, **params) -> tuple[Optional[Output], bool, bool]:
"""
处理一个数据(Stream 协议)
Returns:
(output, valid_out, ready_out): 输出数据、有效标志、可接收标志
"""
数据流
雷达周期级:
MF → PP1 → BF → PP2 → Doppler → PP3 → ED
MF: Pipeline(FFT→CMUL→IFFT)
BF: 内部循环处理所有角度,累积 num_channels 个通道后输出
Doppler: SHIFT→CMUL→ACC,累积 num_pulses 个脉冲后输出
ED: Pipeline(|x|²)
声纳周期级:
MF → PP1 → BF → PP2 → IE
MF: Pipeline(FFT→CMUL)
BF: 内部循环处理所有角度,累积 num_channels 个通道后输出
IE: SHIFT→IFFT→|x|²
快速开始
安装依赖
pip install numpy matplotlib pytest
运行仿真
# 雷达仿真
python -m app.radar.algo_serial --no-plot
python -m app.radar.simulation --no-plot
# 声纳仿真
python -m app.sonar.algo_serial --no-plot
python -m app.sonar.simulation --no-plot
命令行参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--theta |
20 | 目标角度 (°) |
--range |
3000/30 | 目标距离 (m) |
--velocity |
10 | 目标速度 (m/s),仅雷达 |
--snr |
20 | 信噪比 (dB) |
--no-plot |
- | 不显示图像 |
配置示例
from app.radar.configs import RadarModuleConfigs
from app.radar.modules import MFConfig, BFConfig, DopplerConfig, EDConfig
configs = RadarModuleConfigs(
mf=MFConfig(parallelism=4),
bf=BFConfig(channel_parallelism=4, angle_parallelism=64),
doppler=DopplerConfig(parallelism=64, angle_parallelism=64),
ed=EDConfig(parallelism=64),
)
定点配置
from sim.types import FixedPointConfig, to_fixed, to_float
config = FixedPointConfig.default() # 16位整数 + 14位小数
signals_q = to_fixed(signals, config)
signals = to_float(signals_q, config)
延迟模型
| 模块 | 默认延迟 | 说明 |
|---|---|---|
| MatchedFilterStream | 25 | FFT(12) + CMUL(1) + IFFT(12) |
| MatchedFilterFreqStream | 19 | FFT(18) + CMUL(1) |
| TimeBeamformerStream | 累积 | 跨通道累加 |
| FreqBeamformerStream | 累积 | 跨通道累加 |
| DopplerStream | 累积 | 跨脉冲累加 |
| IFFTEnergyDetectionStream | 19 | IFFT(18) + ED(1) |
延迟参数可通过配置类调整。
测试
python -m pytest tests/ -v
测试覆盖:
- SDF 框架核心
- PingPong 双缓冲
- 定点数转换精度
- 各硬件单元正确性
- 雷达/声纳检测精度
- 算法级与周期级输出一致性
输出示例
======================================================================
主动声纳周期级仿真(SDF 框架)
======================================================================
系统参数:
通道数: 8
FFT点数: 4096
角度范围: [-60, 60]°, 121点
目标: 角度=20°, 距离=30m
======================================================================
检测结果
======================================================================
检测: 角度=20.0°, 距离=30.0m
目标: 角度=20°, 距离=30m
仿真耗时: 0.312s
总周期数: 156
许可证
MIT License