Mercurial > hg > match-vamp
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; |