annotate maths/MathUtilities.cpp @ 241:a98dd8ec96f8

* Move dsp/maths to maths ; bring PCA and HMM across from Soundbite
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 09 Jan 2008 10:31:29 +0000
parents
children c96785becf96
rev   line source
c@241 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@241 2
c@241 3 /*
c@241 4 QM DSP Library
c@241 5
c@241 6 Centre for Digital Music, Queen Mary, University of London.
c@241 7 This file copyright 2005-2006 Christian Landone.
c@241 8 All rights reserved.
c@241 9 */
c@241 10
c@241 11 #include "MathUtilities.h"
c@241 12
c@241 13 #include <iostream>
c@241 14 #include <cmath>
c@241 15
c@241 16
c@241 17 double MathUtilities::mod(double x, double y)
c@241 18 {
c@241 19 double a = floor( x / y );
c@241 20
c@241 21 double b = x - ( y * a );
c@241 22 return b;
c@241 23 }
c@241 24
c@241 25 double MathUtilities::princarg(double ang)
c@241 26 {
c@241 27 double ValOut;
c@241 28
c@241 29 ValOut = mod( ang + M_PI, -2 * M_PI ) + M_PI;
c@241 30
c@241 31 return ValOut;
c@241 32 }
c@241 33
c@241 34 void MathUtilities::getAlphaNorm(const double *data, unsigned int len, unsigned int alpha, double* ANorm)
c@241 35 {
c@241 36 unsigned int i;
c@241 37 double temp = 0.0;
c@241 38 double a=0.0;
c@241 39
c@241 40 for( i = 0; i < len; i++)
c@241 41 {
c@241 42 temp = data[ i ];
c@241 43
c@241 44 a += ::pow( fabs(temp), alpha );
c@241 45 }
c@241 46 a /= ( double )len;
c@241 47 a = ::pow( a, ( 1.0 / (double) alpha ) );
c@241 48
c@241 49 *ANorm = a;
c@241 50 }
c@241 51
c@241 52 double MathUtilities::getAlphaNorm( const std::vector <double> &data, unsigned int alpha )
c@241 53 {
c@241 54 unsigned int i;
c@241 55 unsigned int len = data.size();
c@241 56 double temp = 0.0;
c@241 57 double a=0.0;
c@241 58
c@241 59 for( i = 0; i < len; i++)
c@241 60 {
c@241 61 temp = data[ i ];
c@241 62
c@241 63 a += ::pow( fabs(temp), alpha );
c@241 64 }
c@241 65 a /= ( double )len;
c@241 66 a = ::pow( a, ( 1.0 / (double) alpha ) );
c@241 67
c@241 68 return a;
c@241 69 }
c@241 70
c@241 71 double MathUtilities::round(double x)
c@241 72 {
c@241 73 double val = (double)floor(x + 0.5);
c@241 74
c@241 75 return val;
c@241 76 }
c@241 77
c@241 78 double MathUtilities::median(const double *src, unsigned int len)
c@241 79 {
c@241 80 unsigned int i, j;
c@241 81 double tmp = 0.0;
c@241 82 double tempMedian;
c@241 83 double medianVal;
c@241 84
c@241 85 double* scratch = new double[ len ];//Vector < double > sortedX = Vector < double > ( size );
c@241 86
c@241 87 for ( i = 0; i < len; i++ )
c@241 88 {
c@241 89 scratch[i] = src[i];
c@241 90 }
c@241 91
c@241 92 for ( i = 0; i < len - 1; i++ )
c@241 93 {
c@241 94 for ( j = 0; j < len - 1 - i; j++ )
c@241 95 {
c@241 96 if ( scratch[j + 1] < scratch[j] )
c@241 97 {
c@241 98 // compare the two neighbors
c@241 99 tmp = scratch[j]; // swap a[j] and a[j+1]
c@241 100 scratch[j] = scratch[j + 1];
c@241 101 scratch[j + 1] = tmp;
c@241 102 }
c@241 103 }
c@241 104 }
c@241 105 int middle;
c@241 106 if ( len % 2 == 0 )
c@241 107 {
c@241 108 middle = len / 2;
c@241 109 tempMedian = ( scratch[middle] + scratch[middle - 1] ) / 2;
c@241 110 }
c@241 111 else
c@241 112 {
c@241 113 middle = ( int )floor( len / 2.0 );
c@241 114 tempMedian = scratch[middle];
c@241 115 }
c@241 116
c@241 117 medianVal = tempMedian;
c@241 118
c@241 119 delete [] scratch;
c@241 120 return medianVal;
c@241 121 }
c@241 122
c@241 123 double MathUtilities::sum(const double *src, unsigned int len)
c@241 124 {
c@241 125 unsigned int i ;
c@241 126 double retVal =0.0;
c@241 127
c@241 128 for( i = 0; i < len; i++)
c@241 129 {
c@241 130 retVal += src[ i ];
c@241 131 }
c@241 132
c@241 133 return retVal;
c@241 134 }
c@241 135
c@241 136 double MathUtilities::mean(const double *src, unsigned int len)
c@241 137 {
c@241 138 double retVal =0.0;
c@241 139
c@241 140 double s = sum( src, len );
c@241 141
c@241 142 retVal = s / (double)len;
c@241 143
c@241 144 return retVal;
c@241 145 }
c@241 146
c@241 147 void MathUtilities::getFrameMinMax(const double *data, unsigned int len, double *min, double *max)
c@241 148 {
c@241 149 unsigned int i;
c@241 150 double temp = 0.0;
c@241 151 double a=0.0;
c@241 152
c@241 153 *min = data[0];
c@241 154 *max = data[0];
c@241 155
c@241 156 for( i = 0; i < len; i++)
c@241 157 {
c@241 158 temp = data[ i ];
c@241 159
c@241 160 if( temp < *min )
c@241 161 {
c@241 162 *min = temp ;
c@241 163 }
c@241 164 if( temp > *max )
c@241 165 {
c@241 166 *max = temp ;
c@241 167 }
c@241 168
c@241 169 }
c@241 170 }
c@241 171
c@241 172 int MathUtilities::getMax( double* pData, unsigned int Length, double* pMax )
c@241 173 {
c@241 174 unsigned int index = 0;
c@241 175 unsigned int i;
c@241 176 double temp = 0.0;
c@241 177
c@241 178 double max = pData[0];
c@241 179
c@241 180 for( i = 0; i < Length; i++)
c@241 181 {
c@241 182 temp = pData[ i ];
c@241 183
c@241 184 if( temp > max )
c@241 185 {
c@241 186 max = temp ;
c@241 187 index = i;
c@241 188 }
c@241 189
c@241 190 }
c@241 191
c@241 192 *pMax = max;
c@241 193
c@241 194
c@241 195 return index;
c@241 196 }
c@241 197
c@241 198 void MathUtilities::circShift( double* pData, int length, int shift)
c@241 199 {
c@241 200 shift = shift % length;
c@241 201 double temp;
c@241 202 int i,n;
c@241 203
c@241 204 for( i = 0; i < shift; i++)
c@241 205 {
c@241 206 temp=*(pData + length - 1);
c@241 207
c@241 208 for( n = length-2; n >= 0; n--)
c@241 209 {
c@241 210 *(pData+n+1)=*(pData+n);
c@241 211 }
c@241 212
c@241 213 *pData = temp;
c@241 214 }
c@241 215 }
c@241 216
c@241 217 int MathUtilities::compareInt (const void * a, const void * b)
c@241 218 {
c@241 219 return ( *(int*)a - *(int*)b );
c@241 220 }
c@241 221