算法与定点数据
统一参数与环境 → 拍频建模 → 补零、加窗等频谱实验 → Q15 量化与文件往返。
出口:理论峰位可预测,曲线可解释,输入文件整数逐值一致。
建立 Python 建模、Q15 输入、FFT 运算、功率计算与峰值测距的完整处理链路,并用板上回传数据核对电路仿真。
峰位示意 / 两种输入分别回放
项目目标:将模拟 FMCW 拍频 I/Q 数据送入 Zynq-7020,输出距离功率谱与峰值距离格,以可重复实验验证数据、数值和接口的正确性。
统一参数与环境 → 拍频建模 → 补零、加窗等频谱实验 → Q15 量化与文件往返。
出口:理论峰位可预测,曲线可解释,输入文件整数逐值一致。
AXI 握手、功率与最大峰模块 → FFT IP 标准向量 → 全通路自动比较及随机反压。
出口:数值、索引和帧边界正确,停顿与异常有回归证据。
核对器件和约束 → 实现与下载 → 固定向量回放 → 回传比较、资源时序与性能记录。
出口:板上输出与仿真一致,并记录延迟、吞吐和实现资源。
首版主线:单通道、静止点目标、500 个有效点 + 12 个零、512 点 FFT、16 位 I/Q、矩形窗基线、完整功率谱与最大峰/门限判定。主线稳定后扩展双目标与 Hann;M8 再选择 DMA、硬件加窗或 AI 对比。不要求购买射频前端或从零编写 FFT。
我们目前的位置:已打通两种单目标的板上回放,并逐值核对 RTL;算法边界、官方位准确参考、随机协议回归、门限及性能记录仍需补齐。已上板不代表 A/B/C 全部验收完成。
| 里程碑 | 任务 | 建议投入 | 验收出口 |
|---|---|---|---|
| M0 | 环境、板卡资料、参数约定 | 半天 | 环境清单、最小仿真可运行 |
| M1 | 拍频建模、距离坐标 | 半天至 1 天 | 5 m / 12 m 峰位可手算并验证 |
| M2 | FFT、补零、窗函数实验 | 半天至 1 天 | 单因素对照与解释 |
| M3 | Q15 与测试向量 | 半天至 1 天 | 文件往返一致、格式规范 |
| M4 | AXI 握手、功率与最大峰模块 | 1—2 天 | 独立模块通过随机停顿测试 |
| M5 | FFT IP 配置与标准向量 | 1—2 天 | FFT 独立仿真正确 |
| M6 | 全通路验证及双目标扩展 | 1—2 天 | 自动比较与回归测试通过 |
| M7 | 固定数据上板与性能记录 | 1—2 天 | 板上结果与仿真一致,性能可量化 |
| M8 | DMA、硬件加窗或 AI 前置实验 | 另行安排 | 一个独立扩展成果 |
依据《FMCW雷达距离维处理项目指导书》v1.0(2026-09-12)第 2、4 节整理。主线建议约 8—12 个集中工作日,遇到工具或板卡问题可分散到 2—4 周;以验收推进,不以日历强行推进。这是原始规划,不是本项目已经投入的时间。
在两个规定测试输入下,FPGA 回传的全部 512 个复数频点与功率值,与 RTL 仿真逐值一致。 当前成果是模拟回波的硬件回放原型,完整指导书验收仍待补齐。
点击各条目展开代码与证据;点击图片查看大图。“汇报模式”隐藏目录并放大正文;“打印 / PDF”自动展开所有详情。页面无外部字体或脚本依赖,断网也能使用。
从静止点目标出发,先建立可预测的参考,再观察采样、补零和多个目标对频谱的影响。
同时加入 5 m / 幅度 0.5 与 12 m / 幅度 0.25 两个目标。对复数信号逐点相加后做 FFT,局部峰规则找到 k=34、82;只用一次 argmax 则只能返回最强峰。
严格矩形窗会产生无限延伸的旁瓣;“采样率足够时无混叠”的理想论断需结合带限假设理解。上述图用于解释概念,尚不构成噪声、近邻目标和窗函数的完整验收。
当前上板输入为无噪声复数拍频;先量化 500 个有效点,再在预置为零的数组末尾保留 12 个零。代码摘自现有实现,省略参数检查等外围语句。
t = np.arange(count) / config['sample_rate_hz']
i = np.zeros((2, nfft), dtype=np.int64)
q = np.zeros_like(i)
fb = 2 * slope * case['range_m'] / config['c_m_s']
z = case['amplitude'] * np.exp(2j * np.pi * fb * t)
for dest, component in ((i, z.real), (q, z.imag)):
rounded = np.rint(component * 2**15)
if np.any(rounded < -32768) or np.any(rounded > 32767):
raise ValueError('Q15 saturation in generated input')
dest[case_id, :count] = np.clip(rounded, -32768, 32767).astype(np.int64)
words = ((q & 0xffff) << 16) | (i & 0xffff)
ref = np.fft.fft(i + 1j*q, axis=1) / 2**config['fft_shift_bits']高 16 位存 Q,低 16 位存 I;当前信号生成器遇到饱和输入会报错,不会默默回绕。这个 NumPy 参考包含输入量化和总缩放,但不模拟 FFT 各级定点舍入。
FFT 由 Xilinx IP 实现;自行编写数据回放、接口控制、功率流水线、结果存储和最大峰搜索逻辑。
FPGA 负责:ROM 回放、FFT、功率与峰值,保留全部 512 个复数频点和功率以供检查。
ARM / 电脑负责:ARM 通过寄存器读取结果并以 115200 波特率传送;Python 验证后将峰值格换算为距离。
先通过 LED 闪烁确认下载与时钟;再用板内 I/Q 输入驱动平方与求和,逐步打通 PS 初始化、PL 复位、结果寄存器和串口。
| 验证对象 | 结果与依据 |
|---|---|
| 功率算术仿真 | 1007 组输入,包含符号、端点、随机数、流水延迟与复位检查。 |
| 固定输入上板 | I=16384,Q=8192 → P=335544320 → 物理功率 0.3125,保存了 5 帧正确串口结果。 |
| 最大功率边界 | (−32768)² + (−32768)² = 2³¹,必须用 32 位无符号结果保存。 |
selftest_verified 为 false,因此本页不把它计作“已保存完整板上启动边界自检证据”。算术边界通过的证据来自 RTL 仿真。| 配置 | 当前雷达回放实现 | 意义 |
|---|---|---|
| 器件 / IP | XC7Z020-2CLG400 / XFFT 9.0 | 使用本地 Vivado 2017.4 生成的接口 |
| 架构 / 点数 | Radix-2 Burst / 固定 512 点 | 区别于指导书建议的 Pipelined Streaming |
| 格式 / 顺序 | 16 位定点 / 自然顺序 | 输出 bin 可直接对应频率格 |
| 舍入 / 流控 | Convergent Rounding / Non-Realtime | 允许按 valid/ready 停顿 |
| 雷达版本缩放 | 2 + 1 × 8 = 10 位 | 整体幅度缩放 1/1024;功率再平方 |
此前独立标准实验输入完整 512 点、恰好 32 周期的正复指数,已验证峰值 k=32。该实验总右移 9 位,峰值功率为 0.25;与当前雷达版本的 10 位缩放不同,不能混用幅值。
// Radix-2:首级右移 2 位,其余 8 级各右移 1 位
// FWD_INV 在 bit0;SCALE_SCH 紧接其后
.s_axis_config_tdata(24'h02aaad),
.s_axis_config_tvalid(state == CONFIGURE),
.s_axis_config_tready(config_ready),
.s_axis_data_tdata(source_data),
.s_axis_data_tvalid(state == SEND),
.s_axis_data_tready(input_ready),
.s_axis_data_tlast(sample_index == 511),CONFIGURE: if (config_ready) state <= FETCH;
FETCH: state <= SEND;
SEND: if (input_ready) begin
input_count <= input_count + 1'b1;
if (sample_index == 511) state <= DRAIN;
else begin
sample_index <= sample_index + 1'b1;
state <= FETCH;
end
end发送状态 SEND 对应有效数据;接收方未准备好时,状态、数据与索引保持。最后一个输入字携带 TLAST。仿真已检查等待期间数据/last 稳定,当前输出反压是固定周期模式,尚未替代随机停顿回归。
FFT 实部、虚部先平方,下一拍求和,再写入功率存储并比较峰值。有效标志、bin 和 last 与数据一起经过寄存器,避免结果错位。
wire signed [15:0] fft_i = output_data[15:0];
wire signed [15:0] fft_q = output_data[31:16];
reg [31:0] i_square, q_square, power_value;
// 在各自有效的流水级执行
i_square <= fft_i * fft_i;
q_square <= fft_q * fft_q;
power_value <= i_square + q_square;
if (power_valid) begin
spectrum_power[power_index] <= power_value;
if (power_index >= 1 && power_index <= 255
&& power_value > peak_power) begin
peak_power <= power_value;
peak_index <= power_index;
end
end摘录合并展示多个流水级,完整时序以源文件为准。搜索排除 DC 与负频率半区;相同功率时不覆盖已有峰,所以自然顺序下保留较小 bin。当前尚无门限或 hit 标志,不能将最大峰自动解释为“存在目标”。
两帧各含一个静止目标,幅度均为 0.5,初相 0、无噪声、矩形窗。不是两个目标同时输入硬件。
| 模拟距离 | 板上峰值 k | 换算距离 | 距离误差 | 相对 RTL |
|---|---|---|---|---|
| 5 m | 34 | 4.98046875 m | −1.953125 cm | 逐值一致 |
| 12 m | 82 | 12.01171875 m | +1.171875 cm | 逐值一致 |
每帧逐点比较 I、Q、I²+Q²,核对峰值与帧计数。
每帧输入和输出各 512 点,未出现意外 TLAST 或索引错误。
两帧合计;固定周期反压模式,不代表随机回归已完成。
| 比较对象 | 当前结果 | 解释 |
|---|---|---|
| 板上输出 ↔ RTL 仿真 | 两种输入逐值一致 | 两种输入的全部 512 个 I/Q 与功率值完全一致。 |
| RTL ↔ 量化输入 NumPy FFT | 最大实/虚分量误差:1.314、1.165 个 Q15 整数单位 | 允许 8 个整数单位容差;诊断定点内部舍入影响,不是位准确模型。 |
| FFT ↔ 官方位准确 C 模型 | 尚未完成 | 后续需匹配 IP 版本、架构、缩放与舍入后逐位比较。 |
最近一次迁移后验证保留了两帧完整记录。帧号较大表示板上计数器持续运行;这份记录只验证了捕获的两帧,不代表做完了一万多帧回归。
# rows 包含 k、I、Q、P 四列,全部 512 格
if not np.array_equal(np.asarray(rows),
np.asarray(simulated[case_id + 1])):
raise ValueError("Hardware spectrum is not bit-for-bit equal to RTL simulation")
# int64 整数运算核对功率;正频率区搜索峰值
if not np.array_equal(power, i*i + q*q):
raise ValueError('Power pipeline disagrees with complex output')
peak = int(np.argmax(power[1:nfft//2])) + 1
spacing = config['c_m_s'] * fs / (2*slope*nfft)
estimated = peak * spacing理论连续格号分别为 34.1333 与 81.92。当前仅取整数峰值格,得到 34 与 82,因此产生约 −1.95 cm 和 +1.17 cm 的估计误差。在这里规定的孤立、无噪声单目标条件下,两者均小于半个距离格(约 7.32 cm)。
这不是任意目标或噪声环境下的精度保证,也不等于双目标分辨率。此次还没有使用谱峰插值。
统计对象为当前完整 PL 设计,包含 FFT、ROM、功率、谱存储和接口逻辑;不单独等同于 FFT IP 成本。
正式工程位于 D:\CODE\FMCW_RangeFFT。源码与工程位于同一个实验目录;Vivado 中看到的可编辑 RTL 就是该目录中的文件。
FMCW_RangeFFT/
├─ python/ 拍频、单目标、双目标与频谱图
├─ led_blink/ LED 与板卡连通性
├─ iq_power_uart/ I/Q 定点功率与串口
├─ fft512_demo/ k=32 标准 FFT 测试
├─ range_fft/ 当前 500+12 点雷达回放
│ ├─ fft_demo.v 核心数据通路
│ ├─ tb_fft_demo.v 仿真平台
│ ├─ project/fmcw_range_fft.xpr
│ └─ results/ 板上记录与实现报告
└─ report/ 本次组会汇报及证据快照本汇报目录内的代码与结果是 2026-09-17 快照;后续开发应修改上级工程目录中的源文件。LED 历史实验使用内存工程构建,没有单独的 .xpr。汇报页面只展示证据,不会连接板卡或运行代码。
当前已有硬件回放成果,但指导书 A / B / C 各级的全部验收条件尚未逐项完成。
AC7020C、JTAG、串口、PS 时钟与 PL 复位已用于实际回放。
已有单/双目标软件实验和 Q15 雷达向量;Hann、噪声、初相、近邻目标、格式往返与饱和测试仍需系统整理。
功率与两种单目标回放已核对;独立流式模块、hit/门限、完整标准向量、官方 C 模型和随机异常回归仍待完成。
两种单目标与 RTL 完全一致;输入等待、首输出延迟、帧完成延迟和稳态吞吐量尚未测量。
硬件 Hann、位宽比较、DMA、CFAR 或 AI 对比;当前不把这些扩展当作首版全部必做项。
目前是模拟拍频数据在 FPGA 上回放,验证数字处理链路。没有连接射频收发与 ADC,不能把这些结果称为真实外部目标测距。
FFT 运算使用 Xilinx FFT IP。自行编写和验证的是数据回放、IP 驱动、功率、峰值、结果存储与板上回传通路。
当前先建立可复现的传统处理基线。下一步重点是数值、接口与性能验收,后续再据具体瓶颈选择传输或算法扩展。
只能证明这两组规定输入在现有配置下通过核对。泛化到其他输入、停顿模式或复位异常,需要补充标准向量、随机回归和位准确模型验证。