FIR 滤波器之输出舍入处理(Output Rounding)

本文探讨了FIR滤波器输出位宽的优化策略,包括全精度、截断、非对称舍入、对称舍入、向零舍入及收敛舍入等方法,旨在实现精度与资源的平衡。

对滤波器的输出位宽进行限制可以节省资源,FIR 核提供了一些策略供用户选择以实现精度与资源之间的折中处理。

在下面的描述中,x表示被舍入的小数,n表示输出位宽,m表示LSB(累加器位宽与输出位宽之差); 

(1)全精度 m=0 默认选项

(2)截断

在累加器的输出结果上舍弃m位,效果类似matlab中的floor函数,但是舍入偏差可以达到0.5;

(3) 正向非对称舍入

在累加器的输出结果上加0.5再舍弃m位,缺点是会引入正向偏差;

(4)负向非对称舍入

 

在累加器的输出结果上先减去0.499...,缺点是会引入负向偏差,偏差精度如上;

(5)向最大绝对值对称舍入

非对称舍入总是会引入固定方向的偏差 ,在对称舍入下,将0.499加到累加器输出结果上,但是在舍去m位之前将表示累加器输出结果的符号位翻转并加到结果上,这样在两个方向都不会有偏差,这种方法类似于matlab中的round函数;

(6)向零舍入

向零舍入的好处是不会发生溢出; 

(7)收敛舍入

### STM32F4 实现 FIR 滤波器 示例代码教程 #### 一、初始化环境配置 为了确保开发环境中能够顺利调用DSP库函数,在项目设置里需加入特定宏定义来启用CMSIS-DSP功能。这可以通过在项目的预处理器选项中添加如下几个宏定义完成[^4]: ```c #define ARM_MATH_CM4 #define __CC_ARM #define ARM_MATH_MATRIX_CHECK #define ARM_MATH_ROUNDING ``` #### 二、准备滤波器参数与状态变量 创建一个长度为`NUM_TAPS=32`的浮点型数组用于存储预先计算得到的FIR滤波器系数,并声明一个`arm_fir_instance_f32`类型的实例对象用来保存滤波器的具体配置信息。 ```c #include "arm_math.h" // 定义抽头数以及分配空间给滤波器系数 #define NUM_TAPS 32 float32_t firCoeffs[NUM_TAPS] = { /* ... */ }; // 此处应填入实际计算得出的系数值 // 创建并初始化FIR滤波器的状态向量 static float32_t firState[NUM_TAPS + BLOCK_SIZE - 1]; // 声明FIR滤波器实例 arm_fir_instance_f32 firInstance; ``` #### 三、执行初始化操作 利用`arm_fir_init_f32()`函数对之前定义好的FIR滤波器实例进行必要的初始化工作,传入相应的参数包括但不限于抽头数量(`NUM_TAPS`)、指向系数表起始位置的指针(`firCoeffs`)、指向状态缓冲区首地址的指针(`firState`)还有处理的数据块大小(`BLOCK_SIZE`)等。 ```c int main(void){ // 初始化系统时钟及其他外设... // 对FIR滤波器做初始化设定 arm_fir_init_f32(&firInstance, NUM_TAPS, firCoeffs, firState, BLOCK_SIZE); } ``` #### 四、数据流处理流程 当接收到新的输入样本后,可以调用`arm_fir_f32()`来进行一次完整的有限脉冲响应运算过程,从而获得经过该线性相位数字滤波后的输出结果。 ```c void processAudioSample(float32_t *inputBuffer, uint32_t numSamples) { for(uint32_t i = 0; i < numSamples / BLOCK_SIZE; ++i) { // 执行FIR滤波 arm_fir_f32(&firInstance, &inputBuffer[i * BLOCK_SIZE], outputBuffer, BLOCK_SIZE); // 处理outputBuffer中的已过滤音频帧... } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值