annotate dsp/maths/MathUtilities.cpp @ 7:85a9e268a8c4

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