optical/NxFuncs/stadc/filter.c

156 lines
2.4 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#define _IN_FILTER_C
#include "filter.h"
//------------------------------------------------------
// һ<><D2BB><EFBFBD>ͺ<EFBFBD><CDBA>˲<EFBFBD><CBB2><EFBFBD>
#if (1)
int LPF1st(LPF1stData * pLpf1st, int newData)
{
int data = 0;
if (pLpf1st != NULL)
{
if (pLpf1st->f1value < 0)
{
pLpf1st->f1value = newData;
}
// һ<><D2BB><EFBFBD>ͺ<EFBFBD><CDBA>˲<EFBFBD>
pLpf1st->f1value = newData * pLpf1st->lowpassxs + pLpf1st->f1value * (1-pLpf1st->lowpassxs);
data = pLpf1st->f1value;
}
return data;
}
#endif
// <20><><EFBFBD><EFBFBD>IIR<49>˲<EFBFBD><CBB2><EFBFBD>
#if (1)
//------------------------------------------------------
int LPF2nd(LPF2ndData * pLpf2nd, int newData)
{
int data = 0;
if (pLpf2nd != NULL)
{
if (pLpf2nd->f2value < 0)
{
pLpf2nd->preout = newData;
pLpf2nd->lastout = newData;
}
// <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>IIR<49>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ:Y<><59>n)= b0*xn + b1*xn-1 + b2*xn-2 - (a1*xn-1 + a2*xn-2)
// <20>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b1 * xn-1 + b2 * xn-2 <20><>b1<62><31>b2<62><32>ϵ<EFBFBD><CFB5>Ϊ0
pLpf2nd->f2value = (newData * pLpf2nd->b0)+ (pLpf2nd->lastout * pLpf2nd->a1) - (pLpf2nd->preout * pLpf2nd->a2);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD>
pLpf2nd->preout = pLpf2nd->lastout;
pLpf2nd->lastout = pLpf2nd->f2value;
data = pLpf2nd->lastout;
}
return data;
}
#endif
//------------------------------------------------------
// <20><>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
#if (1)
// <20><><EFBFBD><EFBFBD>Ȩֵ
int WRAFilter(int * pBuff, int len)
{
float value = 0;
int i;
int coe, coesum;
if (pBuff == NULL || len <= 0)
{
return 0;
}
coe = 1; // Ȩֵ<C8A8><D6B5>1<EFBFBD><31>ʼ
coesum = 0;
for (i = 0; i < len; i++)
{
value += *pBuff++ * coe; // <20><>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD>
coesum += coe;
coe++; // Ȩֵ<C8A8><D6B5><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩֵ<C8A8><D6B5>
}
value /= coesum; // <20><>Ȩƽ<C8A8><C6BD>ֵ
return value;
}
#endif
//------------------------------------------------------
// <20><>λֵƽ<D6B5><C6BD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
#if (1)
int MAFilter(int * pBuff, int len)
{
int i;
s32 value = 0;
if (pBuff == NULL || len <= 0)
{
return 0;
}
if (len <= 5) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>٣<EFBFBD>ֱ<EFBFBD><D6B1>ȡƽ<C8A1><C6BD>ֵ
{
// ȡƽ<C8A1><C6BD><EFBFBD><EFBFBD>
for (i = 0; i < len; i++)
{
value += *pBuff++;
}
value /= len;
}
else
{
s32 min, max, temp;
min = max = *pBuff; // <20><>һ<EFBFBD><D2BB>ֵ
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ۼӺͲ<D3BA><CDB2>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
for (i = 0; i < len; i++)
{
temp = *pBuff++;
value += temp; // <20><><EFBFBD>ϵ<EFBFBD>ǰֵ
if (min > temp)
{
min = temp;
}
if (max < temp)
{
max = temp;
}
}
// <20>ۼӺͼ<D3BA>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
value -= min;
value -= max;
// ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ƽ<EFBFBD><C6BD>ֵ
value /= (len-2);
}
return value;
}
#endif
//------------------------------------------------------
//------------------------------------------------------