1、简单移动平均滤波算法(SMA):采样数据作为滤波器的输入,输出为移动平均值,即取最近一段采样值的平均值作为输出。简单移动平均滤波算法实现简单,计算速度快,但只适用于信号变化缓慢的场合。

// 简单移动平均滤波算法
#define N 10 // 采样点数
float Filter_Arr[N]; // 保存过去N个采样值
float SMA_Filter(float Input)
{
    int i;
    float output = 0;
    for (i = 0; i < N - 1; i++)
    {
        Filter_Arr[i] = Filter_Arr[i + 1];
        output += Filter_Arr[i];
    }
    Filter_Arr[N - 1] = Input;
    output += Input;
    output /= N;
    return output;
}

 

时间复杂度:O(N),N为采样点数,遍历整个滤波器数组虚N-1次,加上一次采样值的计算,总计算次数为N

空间复杂度:O(N),需要保存过去N个采样值

 

 

2、指数移动平均滤波算法(EMA):与简单移动平均滤波算法类似,但在计算滤波值时,除了最近的采样点外,还考虑了历史上的采样值,采用加权平均法计算滤波值,权重随时间指数减小。指数移动平均滤波算法适用于采样信号随时间发生改变的场合。

// 指数移动平均滤波算法
#define Alpha 0.8  // 滤波系数
float EMA_Filter(float Input)
{
    static float output = 0;
    output = Alpha * Input + (1 - Alpha) * output;
    return output;
}

时间复杂度:O(1),只有一次加法、一次乘法和一次减法运算。

空间复杂度O(1),只需要保存上一次的输出值

 

3、中值滤波算法(MedFilter):对连续采样的数据进行排序,取中间值作为滤波结果,中值滤波算法适用于信号中存在突发性噪声的场合

// 中值滤波算法
#define N 10 // 采样点数
float Filter_Arr[N]; // 保存过去N个采样值
float MedFilter(float Input)
{
    int i, j;
    float temp;
    // 将新采样值插入有序序列
    for (i = 0; i < N - 1; i++)
    {
        if (Input < Filter_Arr[i])
        {
            temp = Input;
            Input = Filter_Arr[i];
            Filter_Arr[i] = temp;
        }
    }
    Filter_Arr[N - 1] = Input;
    // 取中间值作为滤波结果
    if (N % 2 == 0)
    {
        return (Filter_Arr[N / 2] + Filter_Arr[N / 2 - 1]) / 2;
    }
    else
    {
        return Filter_Arr[N / 2];
    }
}

时间复杂度:O(N^2),其中N是采样点数,需要对采样值进行N-1个排序,每次排序需要O(N)的时间复杂度

空间复杂度:O(N),需要保存过去N个采样值。

====================================================================================

 

4、卡尔曼滤波算法(暂时不考虑)

采用概率论和线性系统理论对系统进行建模,通过系统状态及其不确定性的迭代推算,对测量值进行滤波。卡尔曼滤波算法适用于包含随机噪声及测量误差的系统。

 

 

 

 

 

====================================================================================

5、无限脉冲响应滤波算法(IIR)(暂时不考虑):仅滤波器输出和滤波器输入的线性组合作为输出,具有简单快速、灵敏度高等特点,但容易出现不稳定性。

 

6、有限脉冲响应滤波算法(FIR)(暂时不考虑):仅使用当前和有限长度的历史输入,不需要反馈,具有稳定性、可控性好、满足线性相位等特点,但计算复杂度较大,常用于数字信号处理。

 

7、小波变换滤波算法(Wavelet Transformation)(暂时不考虑):采用小波分析方法对信号进行变换,在滤波和降采样后,可提取出信号的高频部分和低频部分,可用于多尺度分析、信号处理及数据压缩等领域。