data.h 数据定义模块
概述
data.h 是主机应用程序的测试数据集,包含输入信号样本和期望的输出参考(golden 数据)。它是验证 AIE 处理链正确性的基准。
数据结构
输入数据:cint16Input
int16_t cint16Input[2048] = {
-4751 , -2855 ,
-1107 , -5121 ,
// ... 共 1024 个复数样本(2048 个 int16_t)
};
- 类型:
int16_t数组,每两个元素组成一个复数(实部, 虚部) - 大小:2048 个元素 = 1024 个
cint16复数样本 - 用途:作为
fir_27t_sym_hb_2i插值滤波器的输入
期望输出:golden
int golden[1024] = {
1, 1, 1, 1, ..., // 前 64 个为 1
2, 3, 1, 1, ..., // 第 65 个为 2,第 66 个为 3
// ... 其余大部分为 1
};
- 类型:
int数组 - 大小:1024 个元素
- 含义:
classifier核输出的象限索引(0-3)
数据生成逻辑
为什么 golden 数据大部分是 1?
查看 classifier 核的逻辑:
void classifier(input_stream_cint16 * input, output_buffer<int32> & __restrict output) {
for (unsigned l=0;l<output_samples;l++) {
cint16 sample = readincr(input);
if (sample.real >= 0) {
if (sample.imag > 0)
*OutIter++ = 0; // 第一象限
else
*OutIter++ = 1; // 第四象限 ← 大部分样本落在这里
} else {
if (sample.imag > 0)
*OutIter++ = 2; // 第二象限
else
*OutIter++ = 3; // 第三象限
}
}
}
输入数据的统计特性导致大部分样本落在第四象限(实部 ≥ 0,虚部 ≤ 0),因此 golden 数据中大部分是 1。
那为什么会出现在其他象限的值?
polar_clip 核会对超过阈值的信号进行限幅处理,这会改变信号的相位特性,导致部分样本落入其他象限。
使用方式
在 host.cpp 中:
#include "data.h"
// 复制输入数据到设备缓冲区
memcpy(in_bomapped, cint16Input, sizeIn * sizeof(int16_t) * 2);
// 验证输出
for (int i = 0; i < sizeOut; i++) {
if ((signed)out_bomapped[i] != golden[i]) {
printf("Error found @ %d, %d != %d\n", i, out_bomapped[i], golden[i]);
errorCount++;
}
}
设计权衡
| 方面 | 当前设计 | 替代方案 | 说明 |
|---|---|---|---|
| 数据存储 | 静态数组编译进可执行文件 | 运行时从文件读取 | 静态数组适合嵌入式部署,无需文件系统 |
| 数据量 | 1024 个样本 | 更大/更小 | 足够验证功能,又不会占用过多内存 |
| 数据内容 | 预生成的随机数 | 数学函数生成 | 固定数据确保结果可重复 |
注意事项
- 大小匹配:
cint16Input有 2048 个元素,但host.cpp只使用前 256 个(128 个复数样本) - 类型转换:比较时需要将
uint32_t*映射转换为有符号整数 - 数据对齐:实际使用时需要确保 4KB 对齐以获得最佳 DMA 性能