void TunerDetector::analyzeLookup() { size_t maxTable = 0; float maxPower = 0; for (size_t offset = 0; offset < offsets.size(); offset++) { float amplitudeSin = 0; float amplitudeCos = 0; for (size_t sample = 0; sample < buf.size(); sample++) { amplitudeSin += buf[sample] * sinTables[offset * buf.size() + sample]; amplitudeCos += buf[sample] * cosTables[offset * buf.size() + sample]; } float power = sqrt(amplitudeSin * amplitudeSin + amplitudeCos * amplitudeCos); if (power > maxPower) { maxPower = power; maxTable = offset; } } float offset = offsets[maxTable]; float freq = freqShift(targetFrequency, offset); history.push_back(freq); }
void FwdFft<ComplexFFTWVector>::run(void) { if (wrapComplex_) { freqShift(vTime_); } run_(); }
void TunerDetector::prepare(float targetFrequency) { method = (targetFrequency < 200) ? autocorr : lookup; if (method == lookup) { TunerDetector::targetFrequency = targetFrequency; for (size_t table = 0; table < offsets.size(); table++) { float stepFrequency = freqShift(targetFrequency, offsets[table]); updateTable(table, stepFrequency); } } else if (method == autocorr) { float targetPeriod = SAMPLE_RATE / targetFrequency; // TODO: check against buf.size() here const float fiveHalfsteps = 1.3348f; maxPeriod = (int)ceil(SAMPLE_RATE / targetFrequency * fiveHalfsteps); minPeriod = (int)round(SAMPLE_RATE / targetFrequency / fiveHalfsteps); } }
void RevFft<ComplexFFTWVector>::run(void) { run_(); if (wrapComplex_) freqShift(vTime_); }