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

简介: 嵌入式常用的算法 - 简易滤波

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

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

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

/**
 * @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;

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

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

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

目录
相关文章
|
9月前
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
226 0
|
9月前
|
算法
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
332 1
|
9月前
|
算法 C语言 C++
嵌入式PID算法理论+实践分析
嵌入式PID算法理论+实践分析
150 0
|
9月前
|
算法
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
197 0
|
9月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
机器学习/深度学习 算法 搜索推荐
基于FPGA的中值滤波算法的实现
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
|
9月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
125 2
|
9月前
|
算法
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
158 0
|
9月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
181 1
|
9月前
|
算法
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
319 0