🏠

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 实例。

关键设计决策

  1. 分离缓冲区:每个子滤波器拥有独立的状态和输入缓冲区,代码清晰但资源利用率低
  2. filter_even 提取延迟值:从 int32 向量中提取偶数位置的 int16,增加额外周期
  3. 单循环结构:所有计算在一个大循环内完成,寄存器压力大

性能指标

指标 数值
Initiation Interval (II) 123 周期
原始吞吐量 ~205 MSPS
状态 功能正确,性能未达标

使用方式

cd aie/farrow_initial
make x86all    # x86 功能仿真
make all       # AIE 仿真 + II 分析
On this page