PageRenderTime 467ms CodeModel.GetById 344ms app.highlight 4ms RepoModel.GetById 117ms app.codeStats 0ms

/external/pysoundtouch14/libsoundtouch/PeakFinder.h

http://echo-nest-remix.googlecode.com/
C++ Header | 93 lines | 31 code | 11 blank | 51 comment | 0 complexity | 4a45ccf46d1f9cc0760ed8736a75309d MD5 | raw file
 1////////////////////////////////////////////////////////////////////////////////
 2///
 3/// The routine detects highest value on an array of values and calculates the 
 4/// precise peak location as a mass-center of the 'hump' around the peak value.
 5///
 6/// Author        : Copyright (c) Olli Parviainen
 7/// Author e-mail : oparviai 'at' iki.fi
 8/// SoundTouch WWW: http://www.surina.net/soundtouch
 9///
10////////////////////////////////////////////////////////////////////////////////
11//
12// Last changed  : $Date: 2008-12-25 19:54:41 +0200 (Thu, 25 Dec 2008) $
13// File revision : $Revision: 4 $
14//
15// $Id: PeakFinder.h 43 2008-12-25 17:54:41Z oparviai $
16//
17////////////////////////////////////////////////////////////////////////////////
18//
19// License :
20//
21//  SoundTouch audio processing library
22//  Copyright (c) Olli Parviainen
23//
24//  This library is free software; you can redistribute it and/or
25//  modify it under the terms of the GNU Lesser General Public
26//  License as published by the Free Software Foundation; either
27//  version 2.1 of the License, or (at your option) any later version.
28//
29//  This library is distributed in the hope that it will be useful,
30//  but WITHOUT ANY WARRANTY; without even the implied warranty of
31//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
32//  Lesser General Public License for more details.
33//
34//  You should have received a copy of the GNU Lesser General Public
35//  License along with this library; if not, write to the Free Software
36//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
37//
38////////////////////////////////////////////////////////////////////////////////
39
40#ifndef _PeakFinder_H_

41#define _PeakFinder_H_

42
43namespace soundtouch
44{
45
46class PeakFinder
47{
48protected:
49    /// Min, max allowed peak positions within the data vector
50    int minPos, maxPos;
51
52    /// Calculates the mass center between given vector items.
53    double calcMassCenter(const float *data, ///< Data vector.
54                         int firstPos,      ///< Index of first vector item beloging to the peak.
55                         int lastPos        ///< Index of last vector item beloging to the peak.
56                         ) const;
57
58    /// Finds the data vector index where the monotoniously decreasing signal crosses the
59    /// given level.
60    int   findCrossingLevel(const float *data,  ///< Data vector.
61                            float level,        ///< Goal crossing level.
62                            int peakpos,        ///< Peak position index within the data vector.
63                            int direction       /// Direction where to proceed from the peak: 1 = right, -1 = left.
64                            ) const;
65
66    /// Finds the 'ground' level, i.e. smallest level between two neighbouring peaks, to right- 
67    /// or left-hand side of the given peak position.
68    int   findGround(const float *data,     /// Data vector.
69                     int peakpos,           /// Peak position index within the data vector.
70                     int direction          /// Direction where to proceed from the peak: 1 = right, -1 = left.
71                     ) const;
72
73    /// get exact center of peak near given position by calculating local mass of center
74    double getPeakCenter(const float *data, int peakpos);
75
76public:
77    /// Constructor. 
78    PeakFinder();
79
80    /// Detect exact peak position of the data vector by finding the largest peak 'hump'
81    /// and calculating the mass-center location of the peak hump.
82    ///
83    /// \return The location of the largest base harmonic peak hump.
84    double detectPeak(const float *data, /// Data vector to be analyzed. The data vector has
85                                        /// to be at least 'maxPos' items long.
86                     int minPos,        ///< Min allowed peak location within the vector data.
87                     int maxPos         ///< Max allowed peak location within the vector data.
88                     );
89};
90
91}
92
93#endif // _PeakFinder_H_