optical/NxFuncs/stadc/filter.c
2025-09-04 09:45:08 +08:00

156 lines
2.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define _IN_FILTER_C
#include "filter.h"
//------------------------------------------------------
// 一阶滞后滤波器
#if (1)
int LPF1st(LPF1stData * pLpf1st, int newData)
{
int data = 0;
if (pLpf1st != NULL)
{
if (pLpf1st->f1value < 0)
{
pLpf1st->f1value = newData;
}
// 一阶滞后滤波
pLpf1st->f1value = newData * pLpf1st->lowpassxs + pLpf1st->f1value * (1-pLpf1st->lowpassxs);
data = pLpf1st->f1value;
}
return data;
}
#endif
// 二阶IIR滤波器
#if (1)
//------------------------------------------------------
int LPF2nd(LPF2ndData * pLpf2nd, int newData)
{
int data = 0;
if (pLpf2nd != NULL)
{
if (pLpf2nd->f2value < 0)
{
pLpf2nd->preout = newData;
pLpf2nd->lastout = newData;
}
// 对于二阶IIR滤波器输出公式:Yn)= b0*xn + b1*xn-1 + b2*xn-2 - (a1*xn-1 + a2*xn-2)
// 此处忽略了b1 * xn-1 + b2 * xn-2 b1和b2的系数为0
pLpf2nd->f2value = (newData * pLpf2nd->b0)+ (pLpf2nd->lastout * pLpf2nd->a1) - (pLpf2nd->preout * pLpf2nd->a2);
// 更新数值,留待下次运算
pLpf2nd->preout = pLpf2nd->lastout;
pLpf2nd->lastout = pLpf2nd->f2value;
data = pLpf2nd->lastout;
}
return data;
}
#endif
//------------------------------------------------------
// 加权递推平均滤波器
#if (1)
// 线性权值
int WRAFilter(int * pBuff, int len)
{
float value = 0;
int i;
int coe, coesum;
if (pBuff == NULL || len <= 0)
{
return 0;
}
coe = 1; // 权值从1开始
coesum = 0;
for (i = 0; i < len; i++)
{
value += *pBuff++ * coe; // 加权求和
coesum += coe;
coe++; // 权值增加,后面的数据权值大
}
value /= coesum; // 加权平均值
return value;
}
#endif
//------------------------------------------------------
// 中位值平均滤波器
#if (1)
int MAFilter(int * pBuff, int len)
{
int i;
s32 value = 0;
if (pBuff == NULL || len <= 0)
{
return 0;
}
if (len <= 5) // 数量较少,直接取平均值
{
// 取平均数
for (i = 0; i < len; i++)
{
value += *pBuff++;
}
value /= len;
}
else
{
s32 min, max, temp;
min = max = *pBuff; // 第一个值
// 取得所有值的累加和并得到最大最小值
for (i = 0; i < len; i++)
{
temp = *pBuff++;
value += temp; // 加上当前值
if (min > temp)
{
min = temp;
}
if (max < temp)
{
max = temp;
}
}
// 累加和减去最大最小值
value -= min;
value -= max;
// 剩余数据的平均值
value /= (len-2);
}
return value;
}
#endif
//------------------------------------------------------
//------------------------------------------------------