嵌入式常用的算法 – 简易滤波

  • Post author:
  • Post category:其他


简易滤波是一种数字信号处理技术,用于对数字信号进行预处理。它的主要目的是减少信号中的噪声并增加信号的信噪比。简易滤波的方式有很多种,我这里只是抛砖引玉介绍其中一种组合。

简单滤波主要有两种类型,分别是线性滤波和非线性滤波。线性滤波是基于线性运算的,主要有平均滤波和卷积滤波。平均滤波是通过将一段信号平均分割成若干部分来减少噪声。而卷积滤波是通过将信号和一个卷积核进行卷积来减少噪声。

非线性滤波则是基于非线性运算的,主要有中值滤波和滤波器滤波。中值滤波是通过将一段信号排序并取中间值来减少噪声。而滤波器滤波则是通过将信号与一个滤波器进行卷积来减少噪声。

/**
 * @brief			简单滤波
 * @param[out]		lpf : 滤波结构数据指针
 * @param[in]		rawData : 原始数据
 */
void SimpleFilter(LpfSimple_t* lpf, int16_t rawData)
{
	int16_t FilterBuffSort[SimpleFilterDepth] = {0};	// 暂存排序值

    lpf->OriginData = rawData;
    // 滑动递推更新旧值
    for (uint16_t i = 1; i < SimpleFilterDepth; i ++ ) {
    	lpf->FilterBuff[i] = lpf->FilterBuff[i - 1];
    }
	// 简单强制消抖 加权存入新值
    if ((fabs(lpf->OriginData - lpf->FilterBuff[0])) < 2.0f) {
    	lpf->FilterBuff[0] = lpf->OriginData * 0.70f + lpf->FilterBuff[0] * 0.30f;
    } else {
    	lpf->FilterBuff[0] = lpf->OriginData;
    }
	// 存储待排序值
	memcpy(FilterBuffSort, lpf->FilterBuff, sizeof(lpf->FilterBuff));
	// 升序排序
	Quick_Sort(FilterBuffSort, 0, sizeof(lpf->FilterBuff) - 1, 0);
	// 中值滤波
	lpf->FilterBuff[0] = 0;    // 先清零
	for (uint16_t i = 2; i < (SimpleFilterDepth - 2); i ++ ) {
		lpf->FilterBuff[0] += FilterBuffSort[i];
	}
	lpf->FilterBuff[0] = lpf->FilterBuff[0] / (SimpleFilterDepth - 4);	// 去除四个极值再计算均值
}

这是一种简单易懂,实现简单的信号预处理技术,它主要用于去除噪声并增加信噪比。但是在处理复杂噪声和对信号时域性能要求较高的场合中,简单滤波的效果会变得不如其他复杂的滤波算法,需要根据具体应用场景进行权衡。

其中,中位滤波是通过将信号排序并取中间值来减少噪声。而滤波器滤波则是通过将信号与一个滤波器进行卷积来减少噪声。

上面代码对应的.h文件的结构体的内容如下

#define SimpleFilterDepth 10
typedef struct {
	int16_t OriginData;
	int16_t FilterBuff[SimpleFilterDepth];
} LpfSimple_t;

简单滤波的优点是简单易懂,实现简单。但是它的缺点是对于复杂噪声的消除效果较差。而且它可能会导致信号的时域性能变差。

在实际应用中,简单滤波算法可能并不能完全满足需求,需要结合其他的滤波算法来提高信号处理的效果。例如,在信号处理中,可以先使用简单滤波算法进行噪声消除,再使用其他复杂滤波算法进行信号增强。

滤波是信号处理中重要的一环,它可以有效减少噪声并提高信噪比,但是在处理复杂噪声和对信号时域性能要求较高的场合中,需要结合其他的滤波算法来获得更好的处理效果。



版权声明:本文为sorcererr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。