+ if( this->m_FilteredSignal.size( ) < this->m_SignalLag )
+ {
+ double v = double( this->m_Count );
+ double n = double( this->m_FilteredSignal.size( ) + 1 );
+ this->m_FilteredSignal.push_back( v );
+ this->m_SignalAverages.push_back( double( 0 ) );
+ this->m_SignalDeviations.push_back( double( 0 ) );
+ this->m_SignalPeaks.push_back( 0 );
+ if( n > double( 1 ) )
+ this->m_CurrentVariance =
+ ( ( ( n - 2.0 ) / ( n - 1.0 ) ) * this->m_CurrentVariance ) +
+ ( (
+ ( v - this->m_CurrentAverage ) *
+ ( v - this->m_CurrentAverage )
+ ) / n );
+ this->m_CurrentAverage += ( v - this->m_CurrentAverage ) / n;
+ if( this->m_FilteredSignal.size( ) == this->m_SignalLag )
+ {
+ this->m_SignalAverages.push_back( this->m_CurrentAverage );
+ this->m_SignalDeviations.push_back(
+ std::sqrt( this->m_CurrentVariance )
+ );
+
+ } // fi
+ }
+ else
+ {
+ unsigned long i = this->m_Signal.size( ) - 1;
+ double v = double( this->m_Count );
+ if(
+ ( std::fabs( v - this->m_SignalAverages[ i - 1 ] ) ) >
+ ( this->m_SignalThreshold * this->m_SignalDeviations[ i - 1 ] )
+ )
+ {
+ if( v > this->m_SignalAverages[ i - 1 ] )
+ this->m_SignalPeaks.push_back( 1 );
+ else
+ this->m_SignalPeaks.push_back( -1 );
+ this->m_FilteredSignal.push_back(
+ ( this->m_SignalInfluence * v ) +
+ (
+ ( 1.0 - this->m_SignalInfluence ) *
+ this->m_FilteredSignal[ i - 1 ]
+ )
+ );
+ }
+ else
+ {
+ this->m_SignalPeaks.push_back( 0 );
+ this->m_FilteredSignal.push_back( v );
+
+ } // fi
+
+ double avg = double( 0 );
+ double var = double( 0 );
+ unsigned long k = 0;
+ for( unsigned long j = i - this->m_SignalLag; j <= i; ++j, ++k )
+ {
+ double v = this->m_FilteredSignal[ j ];
+ double n = double( k + 1 );
+ if( k > 1 )
+ var =
+ ( ( ( n - 2.0 ) / ( n - 1.0 ) ) * var ) +
+ ( ( ( v - avg ) * ( v - avg ) ) / n );
+ avg += ( v - avg ) / n;
+
+ } // rof
+ this->m_SignalAverages.push_back( avg );
+ this->m_SignalDeviations.push_back( std::sqrt( var ) );
+
+ } // fi