std::pair<double, double> PitchDetector::detect_pitch(short *buf)
{
unsigned buf_len = fft_length / pad_factor / overlap;
- memmove(in, in + buf_len, (fft_length - buf_len) * sizeof(double));
+ memmove(in, in + buf_len, (fft_length / pad_factor - buf_len) * sizeof(double));
for (unsigned i = 0; i < buf_len; ++i)
in[i + (fft_length / pad_factor - buf_len)] = double(buf[i]);
best_peak = in[i];
best_bin = i;
}
+#if 0
+ if (20.0 * log10(in[i] / fft_length) > 0.0) {
+ printf("PEAK: %+4.2f dB %5.2f Hz\n",
+ 20.0 * log10(in[i] / fft_length),
+ bin_to_freq(i, num_samples));
+ }
+#endif
}
if (best_bin == 0 || best_bin == num_samples / 2) {
20.0 * log10(in[best_bin/4] / fft_length));
#endif
- // see if we might have hit an overtone (set a limit of 5dB)
- for (unsigned i = 4; i >= 1; --i) {
+ // see if we might have hit an overtone (set a limit of 10dB)
+ for (unsigned i = 6; i >= 1; --i) {
if (best_bin != best_bin / i &&
- 20.0 * log10(in[best_bin] / in[best_bin / i]) < 5.0f) {
+ 20.0 * log10(in[best_bin] / in[best_bin / i]) < 10.0f &&
+ best_bin / i >= 5) {
#if 0
printf("Overtone of degree %u!\n", i);
#endif
double c = y0;
double xmax = (ym1 - y1) / (2.0 * (y1 + ym1 - 2.0 * y0));
- double ymax = 20.0 * (a * xmax * xmax + b * xmax + c) - 90.0;
+ double ymax = 20.0 * (a * xmax * xmax + b * xmax + c) - 80.0;
return std::make_pair(xmax, ymax);
}