递推平均滤波法

递推平均滤波法是一种数字信号处理方法,其原理是通过输入信号的平均值来减少噪声的影响。该方法通过维护一个固定长度的缓冲区,每次新来一个数据时,将最老的数据出队并将新数据入队,再计算当前缓冲区内所有数据的平均值并输出。这个输出值就是经过平滑处理后的信号输出。

递推平均滤波法的优点是占用的内存较小,且能够实现实时平滑处理,但缺点是滤波效果受到缓冲区长度的限制,当长度太短时,噪声减少的效果不太显著;当长度太长时,信号的变化被平滑处理的过度,可能导致一些细节信息的丢失。因此,选择合适的缓冲区长度是关键。

在这里插入图片描述

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

递推平均滤波法是一种数字滤波器,常用于信号处理中。它的基本思想是将一系列连续的采样值按照一定的权重进行平均化处理,从而去除噪声和抖动的影响。这里提供一个C语言实现的递推平均滤波器代码,供参考。

代码实现:

#define FILTER_N 10   // 滤波器窗口大小
float filter_buffer[FILTER_N];   // 滤波器缓存数组
float filter_sum = 0.0f;         // 滤波器累加和
int filter_head = 0;             // 缓存数组头部指针

/* 初始化滤波器 */
void filter_init(void)
{
    int i;
    for (i = 0; i < FILTER_N; i++) {
        filter_buffer[i] = 0.0f;
    }
}

/* 输入采样值并滤波 */
float filter_input(float value)
{
    float output;
    filter_sum -= filter_buffer[filter_head];   // 减去最老的采样值
    filter_buffer[filter_head] = value;         // 存储新的采样值
    filter_sum += filter_buffer[filter_head];   // 加上新的采样值
    filter_head = (filter_head + 1) % FILTER_N;  // 更新头部指针
    output = filter_sum / (float)FILTER_N;      // 计算平均值
    return output;
}

代码详解:

这里使用了一个长度为FILTER_N的缓存数组来存储连续的采样值,每次输入新的采样值时,缓存数组头部指针向前移动一位,并且旧的采样值被新的采样值所替代。同时,滤波器累加和也根据新旧采样值的差异做出了相应的更新,最后根据窗口大小FILTER_N来计算出平均值并输出。

使用方法:

使用这个滤波器非常简单,可以按照如下方式调用:

filter_init();       // 初始化滤波器
for (i = 0; i < N; i++) {
    result = filter_input(input_data[i]);   // 输入采样值并滤波
    // 对输出结果进行处理或处理
}

这里的input_data是一个长度为N的采样数据数组,需要逐一输入并进行滤波处理。result是一个float类型的变量,代表本次滤波的输出结果。

总结:

使用递推平均滤波法可以有效地去除信号的噪声和抖动,并且代码实现也相对简单。对于实时信号处理的场景,这种滤波方法可以立即生效并且延迟非常小,非常适合用于需要快速响应的应用中。

在这里插入图片描述

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

递推平均滤波法是一种数字信号处理技术,用于对离散信号进行滤波处理,常用于消除信号中的噪声或者平滑信号。递推平均滤波法是一种在线处理算法,可以动态地对信号进行处理,而不需要现有全部的信号数据。

下面是用 C++ 实现递推平均滤波法的示例代码:

#include <iostream>
#include <vector>

using namespace std;

/**
 * 递推平均滤波法
 * @param data 待滤波的数据
 * @param n 数据长度
 * @param m 滤波窗口大小
 * @return 滤波后的数据
 */
vector<double> moving_average_filter(double* data, int n, int m) {
    vector<double> result(n);
    double sum = 0;
    for (int i = 0; i < m; ++i) {
        sum += data[i];
        result[i] = sum / (i + 1);
    }
    for (int i = m; i < n; ++i) {
        sum += data[i] - data[i - m];
        result[i] = sum / m;
    }
    return result;
}

int main() {
    double data[] = {1, 3, 5, 4, 7, 9, 8, 6, 4, 2};
    int n = sizeof(data) / sizeof(data[0]);
    int m = 3;

    vector<double> filtered_data = moving_average_filter(data, n, m);
    for (int i = 0; i < n; ++i) {
        cout << filtered_data[i] << " ";
    }
    cout << endl;

    return 0;
}

代码中,moving_average_filter() 函数实现了递推平均滤波法的核心算法。该函数接收待滤波的数据 data,数据长度 n,滤波窗口大小 m,并返回滤波后的数据。函数中通过一个循环对滤波窗口内的数据进行累加求和,然后除以窗口大小得到每个点的平均值。然后,对于其余的数据点,每次循环更新滤波窗口内的数据,并重新计算窗口内数据的平均值。

main() 函数中,我们定义了一个待滤波的数据 data,数据长度 n,以及滤波窗口大小 m。然后调用 moving_average_filter() 函数对数据进行滤波,并输出滤波后的结果。

注:本例子中使用了 C++11 的标准之一:range-for 循环。如果您的 C++ 编译器不支持它,请改用传统的 for 循环。

在这里插入图片描述

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

递推平均滤波法是一种数字信号处理技术,可以用来平滑信号,去除噪声。它的基本思路是对连续的一段信号进行平均处理,来获得平滑的结果。这里提供使用 Java 实现递推平均滤波法的代码详解:

  1. 首先定义一个函数,来实现递推平均滤波法:
/**
 * 递推平均滤波法
 * @param data 原始数据
 * @param N 滤波器长度
 * @return 滤波后的数据
 */
public static double[] recursiveAverageFilter(double[] data, int N) {
    double[] result = new double[data.length];
    double sum = 0;
    for (int i = 0; i < data.length; i++) {
        sum += data[i];
        if (i < N - 1) { // 前 N-1 个点,滤波器长度不足
            result[i] = sum / (i + 1);
        } else {
            result[i] = sum / N;
            sum -= data[i - N + 1];
        }
    }
    return result;
}
  1. 代码解析:
  • 函数的参数包括原始数据 data 和滤波器长度 N
  • 函数返回一个长度与原始数据相同的数组 result,存储滤波后的数据。
  • 在循环中,首先计算当前点与前面所有点的和 sum
  • 如果当前点是前 N-1 个点,由于滤波器长度不足,所以直接求平均值即可。
  • 如果当前点是第 N 个点或之后的点,计算平均值时需要减去前面的第一个点,即 sum -= data[i - N + 1],再除以滤波器长度 N
  • 最后将平滑后的值存储在 result 数组中,并返回。
  1. 使用示例:
double[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int N = 3;
double[] result = recursiveAverageFilter(data, N);
System.out.println(Arrays.toString(result));

这里使用一个长度为 10 的数组 data 作为原始数据,滤波器长度为 3。打印出来的 result 数组为:

[1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

其中,第一个值为原始数据的第一个值,因为滤波器长度为 3,所以前两个点的平滑值只能是它们本身,所以第二个点的平滑值为 (1+2)/2 = 1.5,第三个点的平滑值为 (1+2+3)/3 = 2.0,依次类推。可以看到,滤波后的数据较原始数据更加平滑,且去除了部分噪声。

在这里插入图片描述

猜你喜欢

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