Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

第1B部分:单精度浮点FIR滤波器,使用C循环实现

第1A部分类似,第1B部分使用纯C循环编写的浮点逻辑来实现FIR滤波器。不同之处在于,第1B部分使用单精度浮点数(float)而不是第1A部分中的双精度浮点数(double)。

xcore.ai设备包括一个用于单精度浮点算术的标量浮点单元,包括乘法、加法和融合乘累加指令。双精度的相似操作需要显著的软件参与,因此速度较慢。在这个阶段,我们将看到通过有效利用FPU,我们可以获得很大的性能提升。

实现

part1B.c中的代码与part1A.c中的代码进行比较,我们可以看到唯一的区别是所有的double值都被替换为float值。

类似地,第1B部分应用程序包括filter_coef_float.c(而不是filter_coef_double.c),它将filter_coef[]定义为float值的向量。

由于第1B部分第1A部分非常相似,这里不会展示filter_task()rx_frame()tx_frame()的实现。

src/part1B/part1B.c
//将滤波器应用于生成单个输出样本
float filter_sample(
const float sample_history[TAP_COUNT])
{
// 计算sample_history[]和filter_coef[]的内积
float acc = 0.0;
for(int k = 0; k < TAP_COUNT; k++)
acc += sample_history[k] * filter_coef[k];
return acc;
}

在这里,我们可以看到第1B部分中的filter_sample()第1A部分中的函数完全相同,只是将double替换为float

结果

运行时间

时间类型测量时间
每个滤波器系数75.20 ns
每个输出样本77.00000 us
每帧19.77849200 ms

输出波形

第1B部分输出