Mercurial > hg > qm-dsp
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 } |