test: add board FFT validation and VCD capture
This commit is contained in:
@@ -15,6 +15,8 @@ unsigned long CORE_CLOCKS_PER_SEC = 33000000L;
|
||||
|
||||
const float PI = 3.14159265358979323846;
|
||||
|
||||
#define FFT_MAX_ABS_ERROR_LIMIT 8
|
||||
|
||||
// 读取定时器的当前Tick
|
||||
unsigned int get_timer_ticks() {
|
||||
return RegRead(CONFREG_TIMER_BASE);
|
||||
@@ -139,14 +141,35 @@ int main(int argc, char** argv)
|
||||
}
|
||||
|
||||
printf("\n--- Verification (Only showing Bins with energy > 10) ---\n");
|
||||
int max_abs_err_re = 0;
|
||||
int max_abs_err_im = 0;
|
||||
for (int i = 0; i < FFT_POINT_NUM; i++) {
|
||||
int sw_re = (int)sw_in_re[i] / FFT_POINT_NUM;
|
||||
int sw_im = (int)sw_in_im[i] / FFT_POINT_NUM;
|
||||
int err_re = hw_out_re[i] - sw_re;
|
||||
int err_im = hw_out_im[i] - sw_im;
|
||||
|
||||
if (err_re < 0) err_re = -err_re;
|
||||
if (err_im < 0) err_im = -err_im;
|
||||
if (err_re > max_abs_err_re) max_abs_err_re = err_re;
|
||||
if (err_im > max_abs_err_im) max_abs_err_im = err_im;
|
||||
|
||||
if (fabs(hw_out_re[i]) > 10 || fabs(hw_out_im[i]) > 10) {
|
||||
printf("Bin [%4d] Hz: HW(Re:%6d, Im:%6d) | SW(Re:%6d, Im:%6d)\n",
|
||||
i,
|
||||
hw_out_re[i], hw_out_im[i],
|
||||
(int)sw_in_re[i] / FFT_POINT_NUM, (int)sw_in_im[i] / FFT_POINT_NUM);
|
||||
sw_re, sw_im);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
int passed = max_abs_err_re <= FFT_MAX_ABS_ERROR_LIMIT &&
|
||||
max_abs_err_im <= FFT_MAX_ABS_ERROR_LIMIT;
|
||||
printf("Max Abs Error : Re=%d, Im=%d\n", max_abs_err_re, max_abs_err_im);
|
||||
printf("FFT_MAX_ABS_ERROR_RE=%d\n", max_abs_err_re);
|
||||
printf("FFT_MAX_ABS_ERROR_IM=%d\n", max_abs_err_im);
|
||||
printf("FFT_ERROR_LIMIT=%d\n", FFT_MAX_ABS_ERROR_LIMIT);
|
||||
printf("FFT_RESULT=%s\n", passed ? "PASS" : "FAIL");
|
||||
printf("FFT_DONE\n");
|
||||
|
||||
return passed ? 0 : 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user