🏠

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 个样本 更大/更小 足够验证功能,又不会占用过多内存
数据内容 预生成的随机数 数学函数生成 固定数据确保结果可重复

注意事项

  1. 大小匹配cint16Input 有 2048 个元素,但 host.cpp 只使用前 256 个(128 个复数样本)
  2. 类型转换:比较时需要将 uint32_t* 映射转换为有符号整数
  3. 数据对齐:实际使用时需要确保 4KB 对齐以获得最佳 DMA 性能
On this page