加权递推平均滤波法

加权递推平均滤波法是一种数字滤波方法,它的原理是将当前样本值与前几个样本值加权平均得到滤波结果。

具体来说,假设当前样本值为x(n),前k个样本值为x(n-1), x(n-2),…,x(n-k),则加权递推平均滤波法的计算公式为:

y(n) = (1-a)x(n) + a*y(n-1)

其中,y(n)为滤波后的结果,a是滤波系数,通常取值为0.8~0.99之间。根据计算公式可以看出,滤波结果是当前样本值和前一次滤波结果的加权平均。

由于加权递推平均滤波法考虑了多个样本值的加权平均,因此对于周期性噪声有较好的抑制效果。同时由于只需要保存前一次滤波结果,因此存储空间较小,适合于嵌入式系统等资源受限的环境下使用。

在这里插入图片描述

一、C 实现加权递推平均滤波法及代码详解

加权递推平均滤波法(Weighted Recursive Averaging Filter)是数字信号处理中常用的一种滤波方法,它针对一段连续的信号进行平滑处理。该方法能够有效地消除信号中的噪声和不良波动,使信号更加准确、平稳。

实现原理

加权递推平均滤波法使用一个固定长度的滑动窗口(N个数据),在每次输入新的数据时,将窗口内的数据按照一定的权重进行加权平均,并输出平均值。在下一次输入新的数据时,窗口向右移动一位,将新的数据加入到窗口的末尾,并将窗口的前端丢弃掉。通过这种方式,不断对信号进行平滑处理,以达到降噪的目的。

加权递推平均滤波法的具体计算公式如下所示:

Y k = ( 1 − α ) Y k − 1 + α X k Y_k = (1-\alpha)Y_{k-1}+\alpha X_k Yk=(1α)Yk1+αXk

其中, X k X_k Xk为当前输入的数据, Y k Y_k Yk为输出的平均值, Y k − 1 Y_{k-1} Yk1为上一次的平均值, α \alpha α为平滑系数, 0 < α < 1 0<\alpha<1 0<α<1。实际上, α \alpha α 和滑动窗口的长度 N N N 可以互相转换,即 α = 2 / ( N + 1 ) \alpha=2/(N+1) α=2/(N+1)

代码实现

下面是在 C 语言中实现加权递推平均滤波法的示例代码:

#define N 10  // 窗口长度

float weighted_recursive_averaging_filter(float x)
{
    
    
    static float sum = 0;  // 窗口内数据的和
    static float buf[N];   // 窗口数据缓存
    static int index = 0;  // 窗口当前位置

    // 新数据加入
    sum -= buf[index];    // 减去最早的数据
    sum += x;             // 加入新的数据
    buf[index] = x;       // 存储新的数据

    // 窗口移动
    index++;
    if (index >= N) {
    
    
        index = 0;
    }

    // 加权平均
    return sum * 2 / (N + 1);
}

在上面的代码中,我们使用了一个静态变量来保存窗口内数据的和和当前的位置。在每次输入新的数据时,先将最早的数据从和中减去,然后将新的数据加入和中,并存储到窗口的缓存中。之后,窗口向右移动一位,如果窗口的末尾已经达到了数组的末尾,则将位置重置为 0。最后,通过计算窗口内数据的加权平均值来输出结果。

使用方法

在使用加权递推平均滤波法时,需要确定窗口的长度和平滑系数。一般来说,窗口长度越长,平滑效果越好,但响应速度也会越慢;平滑系数越大,平滑效果越好,但会导致平移量越大。

下面是一个使用加权递推平均滤波法的示例:

#include <stdio.h>

float weighted_recursive_averaging_filter(float x);

int main()
{
    
    
    float data[] = {
    
    10, 11, 12, 13, 14, 15, 14, 18, 16, 17};
    int len = sizeof(data) / sizeof(float);

    printf("Original data: ");
    for (int i = 0; i < len; i++) {
    
    
        printf("%.1f ", data[i]);
    }
    printf("\n");

    printf("Filtered data: ");
    for (int i = 0; i < len; i++) {
    
    
        printf("%.1f ", weighted_recursive_averaging_filter(data[i]));
    }
    printf("\n");

    return 0;
}

在上面的示例中,我们输入了一组原始的数据,然后对它们进行平滑处理。可以看到,输出的结果相比原始数据更加平稳、准确。

总结

加权递推平均滤波法是一种实用的数字信号处理方法,它能够有效地消除信号中的噪声和不良波动,使信号更加准确、平稳。在实际应用中,可以根据需要调整窗口长度和平滑系数来适配不同的输入信号。

在这里插入图片描述

二、C++ 实现加权递推平均滤波法及代码详解

加权递推平均滤波法是一种数字信号处理方法,用于平滑噪声信号以减少噪声的影响。它是在递推平均滤波法的基础上增加了加权处理,使得滤波效果更加稳定。以下是C++实现加权递推平均滤波法的代码及详解。

  1. 加权递推平均滤波法原理

加权递推平均滤波法是在递推平均滤波法的基础上增加了加权处理。它的原理是对当前的数据进行加权平均处理,然后再将处理结果作为下一个数据的预测值。具体过程如下:

  • 初始化:设置权值系数w和初始值y(0)。
  • 加权平均处理:根据当前数据和之前的预测值y(k-1),计算新的预测值y(k)。加权平均计算公式为:y(k) = w * x(k) + (1-w) * y(k-1),其中x(k)为当前的数据,w为权值系数,y(k-1)为之前的预测值。
  • 迭代处理:重复以上步骤,直到所有数据都被处理完毕。
  1. C++实现加权递推平均滤波法代码

下面是C++实现加权递推平均滤波法的代码:

#include <iostream>
#include <vector>

using namespace std;

vector<double> weighted_recursive_average_filter(vector<double> data, double w, double y0) {
    vector<double> result(data.size());
    double y = y0;
    for (int i = 0; i < data.size(); i++) {
        y = w * data[i] + (1 - w) * y;
        result[i] = y;
    }
    return result;
}

int main() {
    // 测试数据
    vector<double> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    double w = 0.5;
    double y0 = 0;

    // 调用函数
    vector<double> result = weighted_recursive_average_filter(data, w, y0);

    // 输出结果
    for (double item : result) {
        cout << item << " ";
    }
    cout << endl;

    return 0;
}
  1. 代码详解
  • 函数weighted_recursive_average_filter:实现加权递推平均滤波法。
  • 参数data:待处理的数据。
  • 参数w:权值系数,取值范围为0~1之间。
  • 参数y0:初始值,即预测值的初始值。
  • 返回值:返回处理后的数据。

在函数中,首先定义了一个vector类型的变量result,用于存储处理后的数据。然后定义了一个变量y,用于存储预测值。接着使用for循环遍历待处理的数据。在循环中,根据加权平均公式计算出新的预测值y,并将其存储到result中。最后返回result作为处理结果。

在主函数中,定义了测试数据data、权值系数w和初始预测值y0。然后调用weighted_recursive_average_filter函数进行处理,并将处理结果存储到result中。最后使用for循环输出处理结果。

  1. 总结

加权递推平均滤波法是一种有效的数字信号处理方法,能够平滑噪声信号并减少噪声的影响。通过使用C++实现加权递推平均滤波法的代码,我们可以更加深入地理解这种方法的实现原理,从而更好地应用于实际问题中。

在这里插入图片描述

三、Java 实现加权递推平均滤波法及代码详解

加权递推平均滤波法是一种基于加权的平均滤波方法,可以有效地去除信号中的噪声,保留信号的主要特征。下面是Java实现加权递推平均滤波法的代码及详解。

代码:

public class WeightedRecursionAveragingFilter {
    
    
    private double lastResult = 0;
    private double lastData = 0;
    private double weight = 0.5;

    public double filter(double data) {
    
    
        double result = weight * data + (1 - weight) * lastResult;
        lastResult = result;
        lastData = data;
        return result;
    }

    public void setWeight(double weight) {
    
    
        this.weight = weight;
    }

    public double getLastData() {
    
    
        return lastData;
    }
}

详解:

首先,定义了一个类WeightedRecursionAveragingFilter,其中包含了三个成员变量:lastResultlastDataweightlastResult表示上一次滤波的结果,lastData表示上一次输入的数据,weight表示加权系数。

其中,filter方法是滤波的核心方法,它接收当前的数据,返回滤波后的结果。具体实现如下:

double result = weight * data + (1 - weight) * lastResult;
lastResult = result;
lastData = data;
return result;

这里采用加权递推平均滤波法的公式,计算得到滤波后的结果。将本次的结果保存到lastResult中,以便下一次使用。

而加权系数weight可以通过setWeight方法进行设置,getLastData方法可以获取上一次输入的数据。

使用方法:

WeightedRecursionAveragingFilter filter = new WeightedRecursionAveragingFilter();
filter.setWeight(0.6);
double result = filter.filter(data);

创建一个WeightedRecursionAveragingFilter对象,通过setWeight方法设置加权系数,然后调用filter方法进行滤波,返回滤波后的结果result

最后,需要说明的是,加权递推平均滤波法是一种滞后滤波,对于快速变化的信号可能会出现较大的滞后,因此需要根据实际需要进行选择。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47225948/article/details/133126449