comparison Matcher.cpp @ 23:64c4c0cf80c9

Add alternate Matcher API calls to provide external feature data
author Chris Cannam
date Fri, 10 Oct 2014 16:27:45 +0100
parents b15106b0abcd
children 9f60d097f0b2
comparison
equal deleted inserted replaced
22:ac39717fc88d 23:64c4c0cf80c9
35 otherMatcher = p; // the first matcher will need this to be set later 35 otherMatcher = p; // the first matcher will need this to be set later
36 firstPM = (!p); 36 firstPM = (!p);
37 ltAverage = 0; 37 ltAverage = 0;
38 frameCount = 0; 38 frameCount = 0;
39 runCount = 0; 39 runCount = 0;
40 freqMapSize = 0;
41 externalFeatureSize = 0;
42 featureSize = 0;
40 blockSize = 0; 43 blockSize = 0;
41 scale = 90; 44 scale = 90;
42 45
43 blockSize = lrint(params.blockTime / params.hopTime); 46 blockSize = lrint(params.blockTime / params.hopTime);
44 #ifdef DEBUG_MATCHER 47 #ifdef DEBUG_MATCHER
49 bestPathCost = 0; 52 bestPathCost = 0;
50 distYSizes = 0; 53 distYSizes = 0;
51 distXSize = 0; 54 distXSize = 0;
52 55
53 initialised = false; 56 initialised = false;
54 57 }
55 } // default constructor 58
59 Matcher::Matcher(Parameters parameters, Matcher *p, int featureSize) :
60 params(parameters),
61 externalFeatureSize(featureSize)
62 {
63 #ifdef DEBUG_MATCHER
64 cerr << "Matcher::Matcher(" << params.sampleRate << ", " << p << ", " << featureSize << ")" << endl;
65 #endif
66
67 otherMatcher = p; // the first matcher will need this to be set later
68 firstPM = (!p);
69 ltAverage = 0;
70 frameCount = 0;
71 runCount = 0;
72 freqMapSize = 0;
73 featureSize = 0;
74 blockSize = 0;
75 scale = 90;
76
77 blockSize = lrint(params.blockTime / params.hopTime);
78 #ifdef DEBUG_MATCHER
79 cerr << "Matcher: blockSize = " << blockSize << endl;
80 #endif
81
82 distance = 0;
83 bestPathCost = 0;
84 distYSizes = 0;
85 distXSize = 0;
86
87 initialised = false;
88
89 }
56 90
57 Matcher::~Matcher() 91 Matcher::~Matcher()
58 { 92 {
59 #ifdef DEBUG_MATCHER 93 #ifdef DEBUG_MATCHER
60 cerr << "Matcher(" << this << ")::~Matcher()" << endl; 94 cerr << "Matcher(" << this << ")::~Matcher()" << endl;
83 { 117 {
84 if (initialised) return; 118 if (initialised) return;
85 119
86 initialised = true; 120 initialised = true;
87 121
88 freqMapSize = getFeatureSize(params); 122 if (externalFeatureSize == 0) {
89 123 freqMapSize = getFeatureSizeFor(params);
90 makeFreqMap(); 124 featureSize = freqMapSize;
91 125 makeFreqMap();
92 initVector<double>(prevFrame, freqMapSize); 126 } else {
93 initVector<double>(newFrame, freqMapSize); 127 featureSize = externalFeatureSize;
94 initMatrix<double>(frames, blockSize, freqMapSize); 128 }
129
130 initVector<double>(prevFrame, featureSize);
131 initVector<double>(newFrame, featureSize);
132 initMatrix<double>(frames, blockSize, featureSize);
95 initVector<double>(totalEnergies, blockSize); 133 initVector<double>(totalEnergies, blockSize);
96 134
97 int distSize = (params.maxRunCount + 1) * blockSize; 135 int distSize = (params.maxRunCount + 1) * blockSize;
98 136
99 distXSize = blockSize * 2; 137 distXSize = blockSize * 2;
122 160
123 void 161 void
124 Matcher::makeFreqMap() 162 Matcher::makeFreqMap()
125 { 163 {
126 initVector<int>(freqMap, params.fftSize/2 + 1); 164 initVector<int>(freqMap, params.fftSize/2 + 1);
165
127 if (params.useChromaFrequencyMap) { 166 if (params.useChromaFrequencyMap) {
128 #ifdef DEBUG_MATCHER 167 #ifdef DEBUG_MATCHER
129 cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl; 168 cerr << "makeFreqMap: calling makeChromaFrequencyMap" << endl;
130 #endif 169 #endif
131 makeChromaFrequencyMap(); 170 makeChromaFrequencyMap();
136 makeStandardFrequencyMap(); 175 makeStandardFrequencyMap();
137 } 176 }
138 } // makeFreqMap() 177 } // makeFreqMap()
139 178
140 int 179 int
141 Matcher::getFeatureSize(Parameters params) 180 Matcher::getFeatureSizeFor(Parameters params)
142 { 181 {
143 if (params.useChromaFrequencyMap) { 182 if (params.useChromaFrequencyMap) {
144 return 13; 183 return 13;
145 } else { 184 } else {
146 return 84; 185 return 84;
203 vector<double> processedFrame = 242 vector<double> processedFrame =
204 processFrameFromFreqData(reBuffer, imBuffer); 243 processFrameFromFreqData(reBuffer, imBuffer);
205 244
206 calcAdvance(); 245 calcAdvance();
207 246
208 if ((frameCount % 100) == 0) {
209 if (!silent) {
210 cerr << "Progress:" << frameCount << " " << ltAverage << endl;
211 }
212 }
213
214 return processedFrame; 247 return processedFrame;
248 }
249
250 void
251 Matcher::consumeFeatureVector(std::vector<double> feature)
252 {
253 if (!initialised) init();
254 int frameIndex = frameCount % blockSize;
255 frames[frameIndex] = feature;
256 calcAdvance();
215 } 257 }
216 258
217 vector<double> 259 vector<double>
218 Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer) 260 Matcher::processFrameFromFreqData(double *reBuffer, double *imBuffer)
219 { 261 {
272 vector<double> tmp = prevFrame; 314 vector<double> tmp = prevFrame;
273 prevFrame = newFrame; 315 prevFrame = newFrame;
274 newFrame = tmp; 316 newFrame = tmp;
275 317
276 frames[frameIndex] = processedFrame; 318 frames[frameIndex] = processedFrame;
319
320 if ((frameCount % 100) == 0) {
321 if (!silent) {
322 cerr << "Progress:" << frameCount << " " << ltAverage << endl;
323 }
324 }
277 325
278 return processedFrame; 326 return processedFrame;
279 } 327 }
280 328
281 void 329 void
415 int 463 int
416 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2) 464 Matcher::calcDistance(const vector<double> &f1, const vector<double> &f2)
417 { 465 {
418 double d = 0; 466 double d = 0;
419 double sum = 0; 467 double sum = 0;
420 for (int i = 0; i < freqMapSize; i++) { 468 for (int i = 0; i < featureSize; i++) {
421 d += fabs(f1[i] - f2[i]); 469 d += fabs(f1[i] - f2[i]);
422 sum += f1[i] + f2[i]; 470 sum += f1[i] + f2[i];
423 } 471 }
424 // System.err.print(" " + Format.d(d,3)); 472 // System.err.print(" " + Format.d(d,3));
425 if (sum == 0) 473 if (sum == 0)