|
发表于 2017-3-8 19:44:16
|
显示全部楼层
本帖最后由 foxpro2005 于 2017-3-8 19:52 编辑
上面4楼与14楼的会比较费内存了, 不就为了实现滑动平均吗, 我来开源分享两个更省更精简的:
滤波器数据结构类型
- /* 滤波器数据结构类型 */
- typedef struct _filter_t {
- unsigned char chFinish;
- unsigned char chCount;
- unsigned short hwSum;
- unsigned short hwMin;
- unsigned short hwMax;
- unsigned short hwValue;
-
- } filter_t;
复制代码
1) 滑动平均值滤波(一阶滤波)
- void FLT_IIR(filter_t *ptObj, unsigned short hwNewValue, unsigned char n)
- {
- if (ptObj->chCount) {
- ptObj->hwSum += hwNewValue;
- }
- else {
- ptObj->hwSum = hwNewValue * n + (n >> 1);
- ptObj->chCount = 1;
- }
- ptObj->hwValue = ptObj->hwSum / n;
- ptObj->hwSum -= ptObj->hwValue;
- }
复制代码
2) 去极值平均值滤波
- void FLT_ExtremeAverage(filter_t *ptObj, unsigned short hwNewValue, unsigned char n)
- {
- if (0 == ptObj->chCount) {
- ptObj->hwMax = ptObj->hwMin = hwNewValue;
- ptObj->hwSum = hwNewValue + (n >> 1);
- ptObj->chCount++;
- }
- else {
- ptObj->hwSum += hwNewValue;
-
- if (ptObj->hwMin > hwNewValue) ptObj->hwMin = hwNewValue;
- if (ptObj->hwMax < hwNewValue) ptObj->hwMax = hwNewValue;
-
- if (++ptObj->chCount >= n) {
- ptObj->chCount = 0;
- if (2 < n) {
- ptObj->hwValue = (ptObj->hwSum - ptObj->hwMax - ptObj->hwMin) / (n - 2);
- }
- else {
- ptObj->hwValue = ptObj->hwSum / n;
- }
- ptObj->chFinish = 1;
- }
- }
- }
复制代码
这两个都是一直在用的, 这个滑动平均值滤波是改进过的,不会出现初始(窗口长度)n未满时, 缓慢上升变化的过程。
欢迎大家讨论...
|
|