6 static float detectPitchAutocorrelation(
const float *input,
int bufferSize,
double sampleRate)
13 for (
int i = 0; i < bufferSize; ++i)
17 std::vector<float> centered(
static_cast<unsigned long>(bufferSize));
18 for (
unsigned long i = 0; i < static_cast<unsigned long>(bufferSize); ++i)
19 centered[i] = input[i] - mean;
22 std::vector<float> correlation(
static_cast<unsigned long>(bufferSize) / 2);
23 int minLag =
static_cast<int>(sampleRate / 500.0f);
24 int maxLag =
static_cast<int>(sampleRate / 40.0f);
25 maxLag = std::min(maxLag, bufferSize - 1);
27 for (
int lag = minLag; lag < maxLag; ++lag)
30 for (
unsigned long i = 0; i < static_cast<unsigned long>(bufferSize - lag); ++i)
31 sum += centered[i] * centered[i +
static_cast<unsigned long>(lag)];
33 correlation[
static_cast<unsigned long>(lag)] = sum;
42 if (bestLag <= minLag || bestLag >= maxLag - 1)
49 for (
unsigned long i = 0; i < static_cast<unsigned long>(bufferSize); ++i)
50 energy += centered[i] * centered[i];
53 if (maxValue < 0.8f * energy)
57 float y1 = correlation[
static_cast<unsigned long>(bestLag)];
58 float y2 = correlation[
static_cast<unsigned long>(bestLag) + 1];
59 float y0 = correlation[
static_cast<unsigned long>(bestLag) - 1];
62 float shift = 0.5f * (y0 - y2) / (y0 - 2.0f * y1 + y2);
63 float interpolatedLag =
static_cast<float>(bestLag) + shift;
66 if (interpolatedLag > 0.0f)
67 return static_cast<float>(sampleRate) / interpolatedLag;