目录

信号处理仿真平台

脉冲多普勒雷达和主动声纳信号处理仿真平台,用于架构验证和硬件统计。

特性

  • 多层级仿真:算法级(验证算法)+ 周期级(模拟时序)
  • 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

关于
16.1 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802032778号