X-Git-Url: https://git.sesse.net/?p=pitch;a=blobdiff_plain;f=pitch.cpp;h=97238f5f05b1a99113837029199f44434b1f220e;hp=1f639d6a22340d0b34d43e74288ad4646c54668a;hb=f4906bf100acb8c5875196b7c2306effdd6a091d;hpb=8f327b03f0a9726c98a81d83ed55ed264b2afc3f;ds=sidebyside diff --git a/pitch.cpp b/pitch.cpp index 1f639d6..97238f5 100644 --- a/pitch.cpp +++ b/pitch.cpp @@ -93,6 +93,11 @@ int get_dsp_fd() int rate = SAMPLE_RATE; ioctl(fd, SOUND_PCM_WRITE_RATE, &rate); + int max_fragments = 2; + int frag_shift = ffs(FFT_LENGTH / OVERLAP) - 1; + int fragments = (max_fragments << 16) | frag_shift; + ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fragments); + ioctl(3, SNDCTL_DSP_SYNC, 0); return fd; @@ -229,6 +234,9 @@ std::pair find_peak(double *in, unsigned num_samples) } } + if (best_bin == 0 || best_bin == num_samples / 2) { + return std::make_pair(-1.0, 0.0); + } std::pair peak = interpolate_peak(in[best_bin - 1], in[best_bin], @@ -243,7 +251,8 @@ std::pair find_peak(double *in, unsigned num_samples) std::pair adjust_for_overtones(std::pair base, double *in, unsigned num_samples) { double mu = base.first, var = 1.0 / (base.second * base.second); - printf("mu=%f, var=%f\n", mu, var); + + //printf("Base at %.2f (amp=%5.2fdB)\n", base.first, base.second); for (unsigned i = 2; i < 10; ++i) { unsigned middle = unsigned(floor(freq_to_bin(base.first, num_samples) * i + 0.5)); @@ -283,8 +292,6 @@ std::pair adjust_for_overtones(std::pair base, d double k = var / (var + this_var); mu = (1.0 - k) * mu + k * this_mu; var *= (1.0 - k); - - printf("mu=%f, var=%f\n", mu, var); } return std::make_pair(mu, base.second); }