cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: /* cannam@0: QM DSP Library cannam@0: cannam@0: Centre for Digital Music, Queen Mary, University of London. cannam@0: This file copyright 2005-2006 Christian Landone. cannam@0: All rights reserved. cannam@0: */ cannam@0: cannam@0: #include "MathUtilities.h" cannam@0: cannam@0: #include cannam@0: #include cannam@0: cannam@0: cannam@0: double MathUtilities::mod(double x, double y) cannam@0: { cannam@0: double a = floor( x / y ); cannam@0: cannam@0: double b = x - ( y * a ); cannam@0: return b; cannam@0: } cannam@0: cannam@0: double MathUtilities::princarg(double ang) cannam@0: { cannam@0: double ValOut; cannam@0: cannam@0: ValOut = mod( ang + M_PI, -2 * M_PI ) + M_PI; cannam@0: cannam@0: return ValOut; cannam@0: } cannam@0: cannam@0: void MathUtilities::getAlphaNorm(const double *data, unsigned int len, unsigned int alpha, double* ANorm) cannam@0: { cannam@0: unsigned int i; cannam@0: double temp = 0.0; cannam@0: double a=0.0; cannam@0: cannam@0: for( i = 0; i < len; i++) cannam@0: { cannam@0: temp = data[ i ]; cannam@0: cannam@0: a += ::pow( fabs(temp), alpha ); cannam@0: } cannam@0: a /= ( double )len; cannam@0: a = ::pow( a, ( 1.0 / (double) alpha ) ); cannam@0: cannam@0: *ANorm = a; cannam@0: } cannam@0: cannam@0: double MathUtilities::getAlphaNorm( const std::vector &data, unsigned int alpha ) cannam@0: { cannam@0: unsigned int i; cannam@0: unsigned int len = data.size(); cannam@0: double temp = 0.0; cannam@0: double a=0.0; cannam@0: cannam@0: for( i = 0; i < len; i++) cannam@0: { cannam@0: temp = data[ i ]; cannam@0: cannam@0: a += ::pow( fabs(temp), alpha ); cannam@0: } cannam@0: a /= ( double )len; cannam@0: a = ::pow( a, ( 1.0 / (double) alpha ) ); cannam@0: cannam@0: return a; cannam@0: } cannam@0: cannam@0: double MathUtilities::round(double x) cannam@0: { cannam@0: double val = (double)floor(x + 0.5); cannam@0: cannam@0: return val; cannam@0: } cannam@0: cannam@0: double MathUtilities::median(const double *src, unsigned int len) cannam@0: { cannam@0: unsigned int i, j; cannam@0: double tmp = 0.0; cannam@0: double tempMedian; cannam@0: double medianVal; cannam@0: cannam@0: double* scratch = new double[ len ];//Vector < double > sortedX = Vector < double > ( size ); cannam@0: cannam@0: for ( i = 0; i < len; i++ ) cannam@0: { cannam@0: scratch[i] = src[i]; cannam@0: } cannam@0: cannam@0: for ( i = 0; i < len - 1; i++ ) cannam@0: { cannam@0: for ( j = 0; j < len - 1 - i; j++ ) cannam@0: { cannam@0: if ( scratch[j + 1] < scratch[j] ) cannam@0: { cannam@0: // compare the two neighbors cannam@0: tmp = scratch[j]; // swap a[j] and a[j+1] cannam@0: scratch[j] = scratch[j + 1]; cannam@0: scratch[j + 1] = tmp; cannam@0: } cannam@0: } cannam@0: } cannam@0: int middle; cannam@0: if ( len % 2 == 0 ) cannam@0: { cannam@0: middle = len / 2; cannam@0: tempMedian = ( scratch[middle] + scratch[middle - 1] ) / 2; cannam@0: } cannam@0: else cannam@0: { cannam@0: middle = ( int )floor( len / 2.0 ); cannam@0: tempMedian = scratch[middle]; cannam@0: } cannam@0: cannam@0: medianVal = tempMedian; cannam@0: cannam@0: delete [] scratch; cannam@0: return medianVal; cannam@0: } cannam@0: cannam@0: double MathUtilities::sum(const double *src, unsigned int len) cannam@0: { cannam@0: unsigned int i ; cannam@0: double retVal =0.0; cannam@0: cannam@0: for( i = 0; i < len; i++) cannam@0: { cannam@0: retVal += src[ i ]; cannam@0: } cannam@0: cannam@0: return retVal; cannam@0: } cannam@0: cannam@0: double MathUtilities::mean(const double *src, unsigned int len) cannam@0: { cannam@0: double retVal =0.0; cannam@0: cannam@0: double s = sum( src, len ); cannam@0: cannam@0: retVal = s / (double)len; cannam@0: cannam@0: return retVal; cannam@0: } cannam@0: cannam@0: void MathUtilities::getFrameMinMax(const double *data, unsigned int len, double *min, double *max) cannam@0: { cannam@0: unsigned int i; cannam@0: double temp = 0.0; cannam@0: double a=0.0; cannam@0: cannam@0: *min = data[0]; cannam@0: *max = data[0]; cannam@0: cannam@0: for( i = 0; i < len; i++) cannam@0: { cannam@0: temp = data[ i ]; cannam@0: cannam@0: if( temp < *min ) cannam@0: { cannam@0: *min = temp ; cannam@0: } cannam@0: if( temp > *max ) cannam@0: { cannam@0: *max = temp ; cannam@0: } cannam@0: cannam@0: } cannam@0: }