Mercurial > hg > qm-dsp
diff maths/MathUtilities.h @ 194:26daede606a8
Add L^p norms, doc, tests
author | Chris Cannam |
---|---|
date | Wed, 07 Oct 2015 11:14:16 +0100 |
parents | e4a57215ddee |
children |
line wrap: on
line diff
--- a/maths/MathUtilities.h Wed Oct 07 10:36:09 2015 +0100 +++ b/maths/MathUtilities.h Wed Oct 07 11:14:16 2015 +0100 @@ -73,15 +73,22 @@ */ static double mod( double x, double y); + /** + * The alpha norm is the alpha'th root of the mean alpha'th power + * magnitude. For example if alpha = 2 this corresponds to the RMS + * of the input data, and when alpha = 1 this is the mean + * magnitude. + */ static void getAlphaNorm(const double *data, int len, int alpha, double* ANorm); + + /** + * The alpha norm is the alpha'th root of the mean alpha'th power + * magnitude. For example if alpha = 2 this corresponds to the RMS + * of the input data, and when alpha = 1 this is the mean + * magnitude. + */ static double getAlphaNorm(const std::vector <double> &data, int alpha ); - static void circShift( double* data, int length, int shift); - - static int getMax( double* data, int length, double* max = 0 ); - static int getMax( const std::vector<double> &data, double* max = 0 ); - static int compareInt(const void * a, const void * b); - enum NormaliseType { NormaliseNone, NormaliseUnitSum, @@ -95,11 +102,34 @@ NormaliseType n = NormaliseUnitMax); /** + * Calculate the L^p norm of a vector. Equivalent to MATLAB's + * norm(data, p). + */ + static double getLpNorm(const std::vector<double> &data, + int p); + + /** + * Normalise a vector by dividing through by its L^p norm. If the + * norm is below the given threshold, the unit vector for that + * norm is returned. p may be 0, in which case no normalisation + * happens and the data is returned unchanged. + */ + static std::vector<double> normaliseLp(const std::vector<double> &data, + int p, + double threshold = 1e-6); + + /** * Threshold the input/output vector data against a moving-mean * average filter. */ static void adaptiveThreshold(std::vector<double> &data); + static void circShift( double* data, int length, int shift); + + static int getMax( double* data, int length, double* max = 0 ); + static int getMax( const std::vector<double> &data, double* max = 0 ); + static int compareInt(const void * a, const void * b); + /** * Return true if x is 2^n for some integer n >= 0. */