Farrow 基线实现 (farrow_baseline_graph)
概述
这是 Farrow 滤波器的初始实现版本,位于 aie/farrow_initial/ 目录。设计目标是建立一个功能正确的参考模型,为后续优化提供基准。
核心组件
farrow_kernel.h
定义了 farrow_kernel 类,包含:
- 四个独立的状态数组:
f3_state,f2_state,f1_state,f0_state - 四个独立的系数数组:
f3_taps,f2_taps,f1_taps,f0_taps - 类型定义:
TT_SIG=cint16,TT_DEL=int32,TT_ACC=cacc48
farrow_kernel.cpp
实现了完整的 Farrow 滤波算法:
// FIR 计算阶段
acc_f3 = aie::sliding_mul_sym_xy_ops<8,8,1,1,int16,cint16>::mul_antisym(f3_coeffs,0,v_buff3,9);
acc_f2 = aie::sliding_mul_sym_xy_ops<8,8,1,1,int16,cint16>::mul_sym(f2_coeffs,0,v_buff2,9);
acc_f1 = aie::sliding_mul_sym_xy_ops<8,8,1,1,int16,cint16>::mul_antisym(f1_coeffs,0,v_buff1,9);
acc_f0 = aie::sliding_mul_sym_xy_ops<8,8,1,1,int16,cint16>::mul_sym(f0_coeffs,0,v_buff0,9);
// Horner 级联阶段
acc_x = aie::mul(y3,del);
z2 = aie::add(acc_x.to_vector<TT_SIG>(DNSHIFT),y2);
acc_y = aie::mul(z2,del);
z1 = aie::add(acc_y.to_vector<TT_SIG>(DNSHIFT),y1);
acc_z = aie::mul(z1,del);
*sig_o = aie::add(y0,acc_z.to_vector<TT_SIG>(DNSHIFT));
farrow_graph.h
单核图结构,包含一个 farrow_kernel 实例。
关键设计决策
- 分离缓冲区:每个子滤波器拥有独立的状态和输入缓冲区,代码清晰但资源利用率低
filter_even提取延迟值:从int32向量中提取偶数位置的int16,增加额外周期- 单循环结构:所有计算在一个大循环内完成,寄存器压力大
性能指标
| 指标 | 数值 |
|---|---|
| Initiation Interval (II) | 123 周期 |
| 原始吞吐量 | ~205 MSPS |
| 状态 | 功能正确,性能未达标 |
使用方式
cd aie/farrow_initial
make x86all # x86 功能仿真
make all # AIE 仿真 + II 分析