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)(暂时不考虑):采用小波分析方法对信号进行变换,在滤波和降采样后,可提取出信号的高频部分和低频部分,可用于多尺度分析、信号处理及数据压缩等领域。
标签:采样,Filter,Arr,float,滤波,stm32,算法,adc From: https://www.cnblogs.com/Bingley-Z/p/17462858.html