Merge branch 'master' into cairocanvas
[ardour.git] / libs / qm-dsp / maths / MathUtilities.h
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2
3 /*
4     QM DSP Library
5
6     Centre for Digital Music, Queen Mary, University of London.
7     This file 2005-2006 Christian Landone.
8
9     This program is free software; you can redistribute it and/or
10     modify it under the terms of the GNU General Public License as
11     published by the Free Software Foundation; either version 2 of the
12     License, or (at your option) any later version.  See the file
13     COPYING included with this distribution for more information.
14 */
15
16 #ifndef MATHUTILITIES_H
17 #define MATHUTILITIES_H
18
19 #include <vector>
20
21 #include "nan-inf.h"
22
23 class MathUtilities  
24 {
25 public: 
26     static double round( double x );
27
28     static void   getFrameMinMax( const double* data, unsigned int len,  double* min, double* max );
29
30     static double mean( const double* src, unsigned int len );
31     static double mean( const std::vector<double> &data,
32                         unsigned int start, unsigned int count );
33     static double sum( const double* src, unsigned int len );
34     static double median( const double* src, unsigned int len );
35
36     static double princarg( double ang );
37     static double mod( double x, double y);
38
39     static void   getAlphaNorm(const double *data, unsigned int len, unsigned int alpha, double* ANorm);
40     static double getAlphaNorm(const std::vector <double> &data, unsigned int alpha );
41
42     static void   circShift( double* data, int length, int shift);
43
44     static int    getMax( double* data, unsigned int length, double* max = 0 );
45     static int    getMax( const std::vector<double> &data, double* max = 0 );
46     static int    compareInt(const void * a, const void * b);
47
48     enum NormaliseType {
49         NormaliseNone,
50         NormaliseUnitSum,
51         NormaliseUnitMax
52     };
53
54     static void   normalise(double *data, int length,
55                             NormaliseType n = NormaliseUnitMax);
56
57     static void   normalise(std::vector<double> &data,
58                             NormaliseType n = NormaliseUnitMax);
59
60     // moving mean threshholding:
61     static void adaptiveThreshold(std::vector<double> &data);
62
63     static bool isPowerOfTwo(int x);
64     static int nextPowerOfTwo(int x); // e.g. 1300 -> 2048, 2048 -> 2048
65     static int previousPowerOfTwo(int x); // e.g. 1300 -> 1024, 2048 -> 2048
66     static int nearestPowerOfTwo(int x); // e.g. 1300 -> 1024, 1700 -> 2048
67 };
68
69 #endif