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; }