comparison Matcher.cpp @ 16:4c8526c5bf58

Implement features outputs
author Chris Cannam
date Fri, 10 Oct 2014 13:16:54 +0100
parents a82276091bbd
children 47f98349aa17
comparison
equal deleted inserted replaced
15:a82276091bbd 16:4c8526c5bf58
17 #include "Matcher.h" 17 #include "Matcher.h"
18 18
19 #include <iostream> 19 #include <iostream>
20 20
21 #include <cstdlib> 21 #include <cstdlib>
22 #include <cassert>
22 23
23 bool Matcher::silent = true; 24 bool Matcher::silent = true;
24 25
25 //#define DEBUG_MATCHER 1 26 //#define DEBUG_MATCHER 1
26 27
81 Matcher::init() 82 Matcher::init()
82 { 83 {
83 if (initialised) return; 84 if (initialised) return;
84 85
85 initialised = true; 86 initialised = true;
87
88 freqMapSize = getFeatureSize(params);
86 89
87 makeFreqMap(); 90 makeFreqMap();
88 91
89 initVector<double>(prevFrame, freqMapSize); 92 initVector<double>(prevFrame, freqMapSize);
90 initVector<double>(newFrame, freqMapSize); 93 initVector<double>(newFrame, freqMapSize);
134 #endif 137 #endif
135 makeStandardFrequencyMap(); 138 makeStandardFrequencyMap();
136 } 139 }
137 } // makeFreqMap() 140 } // makeFreqMap()
138 141
142 int
143 Matcher::getFeatureSize(Parameters params)
144 {
145 if (params.useChromaFrequencyMap) {
146 return 13;
147 } else {
148 return 84;
149 }
150 }
151
139 void 152 void
140 Matcher::makeStandardFrequencyMap() 153 Matcher::makeStandardFrequencyMap()
141 { 154 {
142 double binWidth = params.sampleRate / params.fftSize; 155 double binWidth = params.sampleRate / params.fftSize;
143 int crossoverBin = (int)(2 / (pow(2, 1/12.0) - 1)); 156 int crossoverBin = (int)(2 / (pow(2, 1/12.0) - 1));
149 freqMap[i] = i; 162 freqMap[i] = i;
150 ++i; 163 ++i;
151 } 164 }
152 while (i <= params.fftSize/2) { 165 while (i <= params.fftSize/2) {
153 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69; 166 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69;
154 if (midi > 127) 167 if (midi > 127) midi = 127;
155 midi = 127;
156 freqMap[i++] = crossoverBin + lrint(midi) - crossoverMidi; 168 freqMap[i++] = crossoverBin + lrint(midi) - crossoverMidi;
157 } 169 }
158 freqMapSize = freqMap[i-1] + 1; 170 assert(freqMapSize == freqMap[i-1] + 1);
159 if (!silent) { 171 if (!silent) {
160 cerr << "Standard map size: " << freqMapSize 172 cerr << "Standard map size: " << freqMapSize
161 << "; Crossover at: " << crossoverBin << endl; 173 << "; Crossover at: " << crossoverBin << endl;
162 for (i = 0; i < params.fftSize / 2; i++) 174 for (i = 0; i < params.fftSize / 2; i++)
163 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl; 175 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl;
175 freqMap[i++] = 0; 187 freqMap[i++] = 0;
176 while (i <= params.fftSize/2) { 188 while (i <= params.fftSize/2) {
177 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69; 189 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69;
178 freqMap[i++] = (lrint(midi)) % 12 + 1; 190 freqMap[i++] = (lrint(midi)) % 12 + 1;
179 } 191 }
180 freqMapSize = 13;
181 if (!silent) { 192 if (!silent) {
182 cerr << "Chroma map size: " << freqMapSize 193 cerr << "Chroma map size: " << freqMapSize
183 << "; Crossover at: " << crossoverBin << endl; 194 << "; Crossover at: " << crossoverBin << endl;
184 for (i = 0; i < params.fftSize / 2; i++) 195 for (i = 0; i < params.fftSize / 2; i++)
185 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl; 196 cerr << "freqMap[" << i << "] = " << freqMap[i] << endl;