comparison dsp/onsets/PeakPicking.cpp @ 0:d7116e3183f8

* Queen Mary C++ DSP library
author cannam
date Wed, 05 Apr 2006 17:35:59 +0000
parents
children da277e8b5244
comparison
equal deleted inserted replaced
-1:000000000000 0:d7116e3183f8
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 copyright 2005-2006 Christian Landone.
8 All rights reserved.
9 */
10
11 #include "PeakPicking.h"
12 #include "dsp/maths/Polyfit.h"
13
14
15 //////////////////////////////////////////////////////////////////////
16 // Construction/Destruction
17 //////////////////////////////////////////////////////////////////////
18
19 PeakPicking::PeakPicking( PPickParams Config )
20 {
21 m_workBuffer = NULL;
22 initialise( Config );
23 }
24
25 PeakPicking::~PeakPicking()
26 {
27 deInitialise();
28 }
29
30 void PeakPicking::initialise( PPickParams Config )
31 {
32 m_DFLength = Config.length ;
33 Qfilta = Config.QuadThresh.a ;
34 Qfiltb = Config.QuadThresh.b ;
35 Qfiltc = Config.QuadThresh.c ;
36
37 m_DFProcessingParams.length = m_DFLength;
38 m_DFProcessingParams.LPOrd = Config.LPOrd;
39 m_DFProcessingParams.LPACoeffs = Config.LPACoeffs;
40 m_DFProcessingParams.LPBCoeffs = Config.LPBCoeffs;
41 m_DFProcessingParams.winPre = Config.WinT.pre;
42 m_DFProcessingParams.winPost = Config.WinT.post;
43 m_DFProcessingParams.AlphaNormParam = Config.alpha;
44 m_DFProcessingParams.isMedianPositive = false;
45
46 m_DFSmoothing = new DFProcess( m_DFProcessingParams );
47
48 m_workBuffer = new double[ m_DFLength ];
49 memset( m_workBuffer, 0, sizeof(double)*m_DFLength);
50 }
51
52 void PeakPicking::deInitialise()
53 {
54 delete [] m_workBuffer;
55 delete m_DFSmoothing;
56 m_workBuffer = NULL;
57 }
58
59 void PeakPicking::process( double* src, unsigned int len, vector<int> &onsets )
60 {
61 vector <double> m_maxima;
62
63 // Signal conditioning
64 m_DFSmoothing->process( src, m_workBuffer );
65
66 for( unsigned int u = 0; u < len; u++)
67 {
68 m_maxima.push_back( m_workBuffer[ u ] );
69 }
70
71 quadEval( m_maxima, onsets );
72
73 for( int b = 0; b < m_maxima.size(); b++)
74 {
75 src[ b ] = m_maxima[ b ];
76 }
77 }
78
79 int PeakPicking::quadEval( vector<double> &src, vector<int> &idx )
80 {
81 unsigned int maxLength;
82
83 vector <int> m_maxIndex;
84 vector <int> m_onsetPosition;
85
86 vector <double> m_maxFit;
87 vector <double> m_poly;
88 vector <double> m_err;
89
90 double p;
91
92 m_poly.push_back(0);
93 m_poly.push_back(0);
94 m_poly.push_back(0);
95
96 for( int t = -2; t < 3; t++)
97 {
98 m_err.push_back( (double)t );
99 }
100 for( unsigned int i = 2; i < src.size() - 2; i++)
101 {
102 if( (src[ i ] > src[ i - 1 ]) && (src[ i ] > src[ i + 1 ]) && (src[ i ] > 0) )
103 {
104 m_maxIndex.push_back( i + 1 );
105 }
106 }
107
108 maxLength = m_maxIndex.size();
109
110 double selMax = 0;
111
112 for( unsigned int j = 0; j < maxLength ; j++)
113 {
114 for( int k = -3; k < 2; k++)
115 {
116 selMax = src[ m_maxIndex[j] + k ] ;
117 m_maxFit.push_back(selMax);
118 }
119
120 p = TPolyFit::PolyFit2( m_err, m_maxFit, m_poly);
121
122 double f = m_poly[0];
123 double g = m_poly[1];
124 double h = m_poly[2];
125
126 int kk = m_poly.size();
127
128 if( h < -Qfilta || f > Qfiltc)
129 {
130 idx.push_back( m_maxIndex[j] );
131 }
132
133 m_maxFit.erase( m_maxFit.begin(), m_maxFit.end() );
134 }
135
136 return 1;
137 }