23 sampleRate = newSampleRate;
24 bufferSize = newBufferSize;
27 autocorrelationBuffer.resize(bufferSize);
28 smoothedAutocorrelation.resize(bufferSize);
29 audioFrame.resize(newBufferSize);
31 window.resize(bufferSize);
33 for (
int i = 0; i < bufferSize; ++i)
35 window[i] =
static_cast<float>(0.5 * (1.0 - std::cos(TWO_PI *
double(i) /
double(bufferSize))));
36 autocorrelationBuffer[i] = 0.0f;
37 smoothedAutocorrelation[i] = 0.0f;
44 for (
int i = 0; i < buffer.getNumSamples(); ++i)
46 audioFrame[i] = buffer.getSample(0, i) * window[i];
50 getAutocorrelation(audioFrame);
53 smoothingFilter(autocorrelationBuffer, 0.9f);
56 float tmp = smoothedAutocorrelation[0];
59 for (
int i = 0; i < bufferSize; ++i)
61 if (smoothedAutocorrelation[i] < tmp)
63 tmp = smoothedAutocorrelation[i];
68 pitchEstimate = -1.0f;
77 else if (position == bufferSize - 1)
79 tauEstimate = 2.f * float(position);
80 pitchEstimate = float(sampleRate) / tauEstimate;
86 tauEstimate = 2 * getParabolicInterpolation(position);
87 pitchEstimate = float(sampleRate) / tauEstimate;
119 float previous = autocorrelationBuffer[tauEstimation - 1];
120 float current = autocorrelationBuffer[tauEstimation];
121 float next = autocorrelationBuffer[tauEstimation + 1];
123 float divisor = next + previous - 2 * current;
127 newEstimation = float(tauEstimation);
131 newEstimation = float(tauEstimation) + (previous - next) / (2 * divisor);
133 return newEstimation;