esp32-ogn-tracker/main/slope.h

45 wiersze
894 B
C++

#include <stdint.h>
template <class Int>
class SlopePipe
{ public:
Int Data[4];
uint8_t Ptr;
Int Aver, Slope; // [1/ 4 Inp ] Average and Slope estimate
Int Noise; // [1/16 Inp^2] Average squared residue
public:
void Clear(Int Inp=0)
{ for(Ptr=0; Ptr<4; Ptr++)
Data[Ptr]=Inp;
Ptr=0; }
void Input(Int Inp)
{ Data[Ptr++]=Inp; Ptr&=3; }
void FitSlope(void)
{ Int A =Data[Ptr++]; Ptr&=3;
Int B =Data[Ptr++]; Ptr&=3;
Int C =Data[Ptr++]; Ptr&=3;
Int D =Data[Ptr++]; Ptr&=3;
Aver = A+B+C+D;
Slope = (C+D)-(A+B)+((D-A)<<1);
Slope = ((Slope<<1))/5;
}
void CalcNoise(void)
{ Int Extr, Diff;
Extr = Aver-Slope-(Slope>>1);
Noise=0;
for(uint8_t Idx=0; Idx<4; Idx++)
{ Diff = (Data[Ptr++]<<2)-Extr; Ptr&=3;
Noise+=Diff*Diff;
Extr+= Slope; }
Noise=(Noise+2)>>2;
}
} ;