目录
一、FIR 低通、高通、带通、带阻
1、FIR滤波器特点
2、滤波器结构
3、滤波器系数
4、滤波实现
5、FIR 滤波后的群延迟
二、IIR 低通、高通、带通、带阻
1、IIR滤波器特点
2、滤波器结构
3、滤波器系数
4、滤波实现
5、IIR滤波后的群延迟
三、中值滤波
1、中值滤波特点
2、MidFilterBlock
3、MidFilterRT
四、自适应滤波
1、自适应滤波特点
2、滤波器结构
3、滤波实现
五、样条插补
1、样条插补特点
2、样条函数初始化
3、样条插补实现
一、FIR 低通、高通、带通、带阻
1、FIR滤波器特点
- FIR 滤波器永远是稳定的(系统只有零点);
- FIR 滤波器的冲激响应是有限长序列;
- FIR 滤波器的系统函数为多项式;
- FIR 滤波器具有线性相位。
2、滤波器结构
void arm_fir_init_f32(arm_fir_instance_f32 * S,uint16_t numTaps,const float32_t * pCoeffs,float32_t * pState,uint32_t blockSize
);
最终实现的是低通、高通、带通、带阻只和滤波器系数有关。
3、滤波器系数
点击 Design Filter 按钮以后就生成了所需的滤波器系数,生成滤波器系数以后点击 filterDesigner 界面上的菜单 Targets->Generate C header ,打开后显示如下界面:
4、滤波实现
实现单点或数组格式的滤波。
void arm_fir_f32(const arm_fir_instance_f32 * S,const float32_t * pSrc,float32_t * pDst,uint32_t blockSize
)
5、FIR 滤波后的群延迟
波形经过 FIR 滤波器后,输出的波形会有一定的延迟。对于线性相位的 FIR,这个群延迟就是一个常数。但是实际应用中这个群延迟是多少呢? 关于群延迟的数值, filterDesigner 工具箱会根据用户的配置计算好。
二、IIR 低通、高通、带通、带阻
1、IIR滤波器特点
IIR 滤波器与 FIR 滤波器相比,具有相位特性差的缺点,但它的的结构简单、运算量小,具有经济、高效的特点,并且可以用较少的阶数获得很高的选择性。因此也得到了广泛应用。
2、滤波器结构
void arm_biquad_cascade_df1_init_f32(arm_biquad_casd_df1_inst_f32 * S,uint8_t numStages,const float32_t * pCoeffs,float32_t * pState
)
最终实现的是低通、高通、带通、带阻只和滤波器系数有关。
3、滤波器系数
点击 Design Filter 按钮以后就生成了所需的滤波器系数,生成滤波器系数以后点击 filterDesigner 界面上的菜单 Targets->Generate C header ,打开后显示如下界面:
4、滤波实现
实现单点或数组格式的滤波。
void arm_biquad_cascade_df1_f32(const arm_biquad_casd_df1_inst_f32 * S,float32_t * pSrc,float32_t * pDst,uint32_t blockSize
)
5、IIR滤波后的群延迟
波形经过 IIR 滤波器后,输出的波形会有一定的延迟。对于线性相位的 IIR ,这个群延迟就是一个常数。但是实际应用中这个群延迟是多少呢? 关于群延迟的数值, filterDesigner 工具箱会根据用户的配置计算好。
三、中值滤波
1、中值滤波特点
将滤波阶数设置为 5,即 y = medfilt1(x, 5),表示每 5 个采样值求一次中值。原理和实现如下:函数是取 x(k-2), x(k-1), x(k), x(k+1), x(k+2)的中值作为输出 y(k)。 对于 y(1),只有 x(1), x(2), x(3)存在数值,之前的不存在,对于不存在的补 0。 每 5 个数按从小到大排列后取中值有。
2、MidFilterBlock
实现数组形式的一段数据的中值滤波。
void MidFilter(float32_t *pSrc, float32_t *pDst, uint32_t blockSize, uint32_t order)
3、MidFilterRT
实现变量形式的单个数据的中值滤波。
void MidFilterRT(float32_t *pSrc, float32_t *pDst, uint8_t ucFlag, uint32_t order)
四、自适应滤波
1、自适应滤波特点
自适应滤波器能够根据输入信号自动调整滤波系数进行数字滤波。作为对比,非自适应滤波器有静态的滤波器系数,这些静态系数一起组成传递函数。
对于一些应用来说,由于事先并不知道需要进行操作的参数,例如一些噪声信号的特性,所以要求使用自适应的系数进行处理。在这种情况下,通常使用自适应滤波器,自适应滤波器使用反馈来调整滤波器系数以及频率响应。
随着处理器性能的增强,自适应滤波器的应用越来越常见,时至今日它们已经广泛地用于手机以及其它通信设备、数码录像机和数码照相机以及医疗监测设备中
2、滤波器结构
重点是滤波的步长。
void arm_lms_norm_init_f32(arm_lms_norm_instance_f32 * S,uint16_t numTaps,float32_t * pCoeffs,float32_t * pState,float32_t mu,uint32_t blockSize
);
3、滤波实现
步长越大,抖动越大,但是平稳速度越快;步长越小,抖动越小,但是平稳速度越慢。
五、样条插补
1、样条插补特点
DSP 库支持了样条插补,双线性插补和线性插补,我们这里主要介绍样条插补的实现。低阶的样条插值还具有“保凸”的重要性质。在计算机科学的计算机辅助设计和计算机图形学中,样条通常是指分段定义的多项式参数曲线。
2、样条函数初始化
void arm_spline_init_f32(arm_spline_instance_f32 * S,arm_spline_type type,const float32_t * x,const float32_t * y,uint32_t n,float32_t * coeffs,float32_t * tempBuffer
)
3、样条插补实现
void arm_spline_f32(arm_spline_instance_f32 * S,const float32_t * xq,float32_t * pDst,uint32_t blockSize
)
样条插补的主要作用是使得波形更加平滑。比如一帧是128点,步大小是8个像素,我们可以通过插补实现步长为1, 1024点的波形,本质是你的总步长大小不能变,我们这里都是1024,这个不能变,在这个基础上做插补,效果就出来了。