in = reinterpret_cast<double *> (fftw_malloc(sizeof(double) * FFT_LENGTH / PAD_FACTOR));
in_windowed = reinterpret_cast<double *> (fftw_malloc(sizeof(double) * FFT_LENGTH));
out = reinterpret_cast<std::complex<double> *> (fftw_malloc(sizeof(std::complex<double>) * (FFT_LENGTH / 2 + 1)));
- bins = reinterpret_cast<double *> (fftw_malloc(sizeof(double) * FFT_LENGTH / 2 + 1));
+ bins = reinterpret_cast<double *> (fftw_malloc(sizeof(double) * (FFT_LENGTH / 2 + 1)));
memset(in, 0, sizeof(double) * FFT_LENGTH / PAD_FACTOR);
fftw_execute(p);
find_peak_magnitudes(out, bins, FFT_LENGTH);
std::pair<double, double> peak = find_peak(bins, FFT_LENGTH);
- peak = adjust_for_overtones(peak, bins, FFT_LENGTH);
+ if (peak.first > 0.0)
+ peak = adjust_for_overtones(peak, bins, FFT_LENGTH);
if (peak.first < 50.0 || peak.second - log10(FFT_LENGTH) < 0.0) {
#if TUNING == WELL_TEMPERED_GUITAR
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;
}
}
+ if (best_bin == 0 || best_bin == num_samples / 2) {
+ return std::make_pair(-1.0, 0.0);
+ }
std::pair<double, double> peak =
interpolate_peak(in[best_bin - 1],
in[best_bin],
std::pair<double, double> adjust_for_overtones(std::pair<double, double> 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));
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);
}