1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #include <fpa/Generic/PeakDetector.h>
9 // -------------------------------------------------------------------------
10 fpa::Generic::PeakDetector::
18 // -------------------------------------------------------------------------
19 fpa::Generic::PeakDetector::
24 // -------------------------------------------------------------------------
25 unsigned long fpa::Generic::PeakDetector::
26 GetKernelSize( ) const
31 // -------------------------------------------------------------------------
32 double fpa::Generic::PeakDetector::
38 // -------------------------------------------------------------------------
39 double fpa::Generic::PeakDetector::
45 // -------------------------------------------------------------------------
46 void fpa::Generic::PeakDetector::
47 SetKernelSize( unsigned long k )
53 // -------------------------------------------------------------------------
54 void fpa::Generic::PeakDetector::
55 SetThreshold( double t )
61 // -------------------------------------------------------------------------
62 void fpa::Generic::PeakDetector::
63 SetInfluence( double i )
69 // -------------------------------------------------------------------------
70 void fpa::Generic::PeakDetector::
78 this->m_Peaks.clear( );
83 // -------------------------------------------------------------------------
84 unsigned long fpa::Generic::PeakDetector::
85 GetNumberOfSamples( ) const
87 return( this->m_X.size( ) );
90 // -------------------------------------------------------------------------
91 fpa::Generic::PeakDetector::
92 TPeak fpa::Generic::PeakDetector::
93 AddValue( double x, double y )
95 this->m_X.push_back( x );
96 this->m_Y.push_back( y );
98 if( this->m_YF.size( ) < this->m_K )
100 double n = double( this->m_YF.size( ) + 1 );
101 this->m_YF.push_back( y );
102 this->m_Avg.push_back( double( 0 ) );
103 this->m_STD.push_back( double( 0 ) );
104 this->m_Peaks.push_back( Self::NoPeak );
105 if( n > double( 1 ) )
107 ( ( ( n - 2.0 ) / ( n - 1.0 ) ) * this->m_Vari ) +
108 ( ( ( y - this->m_Mean ) * ( y - this->m_Mean ) ) / n );
109 this->m_Mean += ( y - this->m_Mean ) / n;
110 if( this->m_YF.size( ) == this->m_K )
112 this->m_Avg.push_back( this->m_Mean );
113 this->m_STD.push_back( std::sqrt( this->m_Vari ) );
119 unsigned long i = this->m_X.size( ) - 1;
121 ( std::fabs( y - this->m_Avg[ i - 1 ] ) ) >
122 ( this->m_T * this->m_STD[ i - 1 ] )
125 this->m_Peaks.push_back(
126 ( y > this->m_Avg[ i - 1 ] )? Self::PosPeak: Self::NegPeak
128 this->m_YF.push_back(
129 ( this->m_I * y ) + ( ( 1.0 - this->m_I ) * this->m_YF[ i - 1 ] )
134 this->m_Peaks.push_back( Self::NoPeak );
135 this->m_YF.push_back( y );
139 double avg = double( 0 );
140 double var = double( 0 );
142 for( unsigned long j = i - this->m_K; j <= i; ++j, ++k )
144 double v = this->m_YF[ j ];
145 double n = double( k + 1 );
148 ( ( ( n - 2.0 ) / ( n - 1.0 ) ) * var ) +
149 ( ( ( v - avg ) * ( v - avg ) ) / n );
150 avg += ( v - avg ) / n;
153 this->m_Avg.push_back( avg );
154 this->m_STD.push_back( std::sqrt( var ) );
157 return( this->m_Peaks.back( ) );