Mercurial > hg > nnls-chroma
comparison Chordino.cpp @ 80:026a5c0ee2c2 matthiasm-plugin
bins per semitone can now be chosen in chromamethods.h
author | Matthias Mauch <mail@matthiasmauch.net> |
---|---|
date | Thu, 11 Nov 2010 15:11:05 +0900 |
parents | ba930176df5b |
children | 4270f3039ab0 |
comparison
equal
deleted
inserted
replaced
78:d52884de7d79 | 80:026a5c0ee2c2 |
---|---|
244 // | 244 // |
245 /** Calculate Tuning | 245 /** Calculate Tuning |
246 calculate tuning from (using the angle of the complex number defined by the | 246 calculate tuning from (using the angle of the complex number defined by the |
247 cumulative mean real and imag values) | 247 cumulative mean real and imag values) |
248 **/ | 248 **/ |
249 float meanTuningImag = sinvalue * m_meanTuning1 - sinvalue * m_meanTuning2; | 249 float meanTuningImag = 0; |
250 float meanTuningReal = m_meanTuning0 + cosvalue * m_meanTuning1 + cosvalue * m_meanTuning2; | 250 float meanTuningReal = 0; |
251 for (int iBPS = 0; iBPS < nBPS; ++iBPS) { | |
252 meanTuningReal += m_meanTunings[iBPS] * cosvalues[iBPS]; | |
253 meanTuningImag += m_meanTunings[iBPS] * sinvalues[iBPS]; | |
254 } | |
251 float cumulativetuning = 440 * pow(2,atan2(meanTuningImag, meanTuningReal)/(24*M_PI)); | 255 float cumulativetuning = 440 * pow(2,atan2(meanTuningImag, meanTuningReal)/(24*M_PI)); |
252 float normalisedtuning = atan2(meanTuningImag, meanTuningReal)/(2*M_PI); | 256 float normalisedtuning = atan2(meanTuningImag, meanTuningReal)/(2*M_PI); |
253 int intShift = floor(normalisedtuning * 3); | 257 int intShift = floor(normalisedtuning * 3); |
254 float intFactor = normalisedtuning * 3 - intShift; // intFactor is a really bad name for this | 258 float floatShift = normalisedtuning * 3 - intShift; // floatShift is a really bad name for this |
255 | 259 |
256 char buffer0 [50]; | 260 char buffer0 [50]; |
257 | 261 |
258 sprintf(buffer0, "estimated tuning: %0.1f Hz", cumulativetuning); | 262 sprintf(buffer0, "estimated tuning: %0.1f Hz", cumulativetuning); |
259 | 263 |
283 timestamps.push_back(currentLogSpectum.timestamp); | 287 timestamps.push_back(currentLogSpectum.timestamp); |
284 currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); // set lower edge to zero | 288 currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); // set lower edge to zero |
285 | 289 |
286 if (m_tuneLocal) { | 290 if (m_tuneLocal) { |
287 intShift = floor(m_localTuning[count] * 3); | 291 intShift = floor(m_localTuning[count] * 3); |
288 intFactor = m_localTuning[count] * 3 - intShift; // intFactor is a really bad name for this | 292 floatShift = m_localTuning[count] * 3 - intShift; // floatShift is a really bad name for this |
289 } | 293 } |
290 | 294 |
291 // cerr << intShift << " " << intFactor << endl; | 295 // cerr << intShift << " " << floatShift << endl; |
292 | 296 |
293 for (unsigned k = 2; k < currentLogSpectum.values.size() - 3; ++k) { // interpolate all inner bins | 297 for (unsigned k = 2; k < currentLogSpectum.values.size() - 3; ++k) { // interpolate all inner bins |
294 tempValue = currentLogSpectum.values[k + intShift] * (1-intFactor) + currentLogSpectum.values[k+intShift+1] * intFactor; | 298 tempValue = currentLogSpectum.values[k + intShift] * (1-floatShift) + currentLogSpectum.values[k+intShift+1] * floatShift; |
295 currentTunedSpec.values.push_back(tempValue); | 299 currentTunedSpec.values.push_back(tempValue); |
296 } | 300 } |
297 | 301 |
298 currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); // upper edge | 302 currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); currentTunedSpec.values.push_back(0.0); // upper edge |
299 vector<float> runningmean = SpecialConvolution(currentTunedSpec.values,hw); | 303 vector<float> runningmean = SpecialConvolution(currentTunedSpec.values,hw); |