常用的软件滤波方法

1. 平均滤波(Moving Average Filter)

平均滤波是最简单且常用的一种滤波方法。它的基本思想是对一段时间内的多个采样值取平均值,以平滑波动。

  • 简单平均滤波(Simple Moving Average, SMA):
    对最近N个采样值求平均。

    #define N 10
    int values[N];
    int sum = 0;
    for (int i = 0; i < N; i++)
    {
      sum += values[i];
    }
    int average = sum / N;

  • 加权平均滤波(Weighted Moving Average, WMA):
    对不同的采样值赋予不同的权重,通常是越新的数据权重越大。

    float weights[N] = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2};
    // 权重总和为1
    float weighted_sum = 0;
    for (int i = 0; i < N; i++)
    {
      weighted_sum += values[i] * weights[i];
    }
    float weighted_average = weighted_sum;

2. 递归平均滤波(Exponential Moving Average, EMA)

递归平均滤波是一种加权移动平均滤波,其中新的数据点权重较大,历史数据权重逐渐减小。该方法不需要存储大量的历史数据,计算效率高。

float alpha = 0.1; // 平滑因子,取值范围为0到1,越大表示越依赖新数据
float filtered_value = 0;
filtered_value = alpha * new_value + (1 - alpha) * filtered_value;

3. 中值滤波(Median Filter)

中值滤波是一种非线性滤波方法,通过对一组采样值排序并取中间值,以消除突发噪声。适用于存在尖峰噪声的情况。

#include <algorithm>
#define N 9
int values[N] = { /* 一组采样值 */ };
std::sort(values, values + N);
int median = values[N / 2];

4. 卡尔曼滤波(Kalman Filter)

卡尔曼滤波是一种自适应滤波算法,能根据系统的噪声特性自动调整滤波参数,提供对动态系统状态的最优估计。适用于实时系统和动态信号。

// 初始化卡尔曼滤波参数
float Q = 0.001;// 过程噪声协方差
float R = 0.1;// 测量噪声协方差
float P = 1, K = 0;
float X = 0; // 状态估计
// 卡尔曼滤波过程
void kalmanFilter(float measurement)
{
  // 预测更新
  P = P + Q;
  // 计算卡尔曼增益
  K = P / (P + R);
  // 更新估计值
  X = X + K * (measurement - X);
  // 更新误差协方差
  P = (1 - K) * P;
}

5. 低通滤波器(Low-Pass Filter)

低通滤波器通过阻止高频信号,只允许低频信号通过,从而平滑数据波动。   

  • 一阶低通滤波器:

    float alpha = 0.1; // 滤波系数,取值范围为0到1
    float filtered_value = 0;
    
    filtered_value = alpha * new_value + (1 - alpha) * filtered_value;

  • 二阶低通滤波器(巴特沃斯滤波器):

    void calculateButterworthCoefficients(float fs, float fc, float *a, float *b)
    {
     float omega = 2 * M_PI * fc / fs;
     float cos_omega = cos(omega);
     float sin_omega = sin(omega);
     float alpha = sin_omega / (2 * sqrt(2));
    
     float a0 = 1 + alpha;
     a[0] = -2 * cos_omega / a0;
     a[1] = (1 - alpha) / a0;
    
     b[0] = (1 - cos_omega) / 2 / a0;
     b[1] = (1 - cos_omega) / a0;
     b[2] = b[0];
    }
    float butterworthFilter(float *x, float *y, float *a, float *b)
    {
     float output = b[0] * x[0] + b[1] * x[1] + b[2] * x[2] - a[0] * y[0] - a[1] *   y[1];
    
     // 更新历史值
     x[2] = x[1];
     x[1] = x[0];
     y[1] = y[0];
     y[0] = output;
    
     return output;
    }

6. 高通滤波器(High-Pass Filter)

高通滤波器允许高频信号通过,阻止低频信号,从而去除直流分量和低频噪声。

  • 一阶高通滤波器:

    float alpha = 0.1; // 滤波系数,取值范围为0到1
    float prev_input = 0;
    float filtered_value = 0;
    
    void highPassFilter(float new_value) {
        filtered_value = alpha * (filtered_value + new_value - prev_input);
        prev_input = new_value;
    }
    

  • 二阶高通滤波器(巴特沃斯滤波器

    void calculateHighPassCoefficients(float fs, float fc, float *a, float *b) {
        float omega = 2 * M_PI * fc / fs;
        float cos_omega = cos(omega);
        float sin_omega = sin(omega);
        float alpha = sin_omega / (2 * sqrt(2));
        
        float a0 = 1 + alpha;
        a[0] = -2 * cos_omega / a0;
        a[1] = (1 - alpha) / a0;
        
        b[0] = (1 + cos_omega) / 2 / a0;
        b[1] = -(1 + cos_omega) / a0;
        b[2] = b[0];
    }
    
    float butterworthHighPassFilter(float *x, float *y, float *a, float *b) {
        float output = b[0] * x[0] + b[1] * x[1] + b[2] * x[2] - a[0] * y[0] - a[1] * y[1];
        
        // 更新历史值
        x[2] = x[1];
        x[1] = x[0];
        y[1] = y[0];
        y[0] = output;
        
        return output;
    }
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值