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