Tuner: make average for deviation result

This commit is contained in:
Louis-Joseph Fournier 2016-01-02 17:49:35 +01:00
parent e270506117
commit f961e01452
2 changed files with 38 additions and 4 deletions

View file

@ -74,6 +74,7 @@ void Tuner::Start()
cerr << __func__ << endl; cerr << __func__ << endl;
count_found = count_not_found = 0; count_found = count_not_found = 0;
nb_sample_running = 0; nb_sample_running = 0;
ResetDeviation();
blank_prevent(true); blank_prevent(true);
high_filter->Clear(); high_filter->Clear();
cross->Clear(); cross->Clear();
@ -104,12 +105,36 @@ void Tuner::AudioCb(const QAudioBuffer &buffer)
AudioAnalyse(ptr, nbFrame); AudioAnalyse(ptr, nbFrame);
} }
void Tuner::ResetDeviation()
{
// reset deviation values
nb_deviation = 0;
deviation_start = 0;
deviation_sum = 0;
}
void Tuner::UpdateDeviation(double d)
{
if (nb_deviation == nbDeviationValues) {
deviation_sum -= deviation_values[deviation_start];
deviation_start = (deviation_start + 1) % nbDeviationValues;
nb_deviation--;
}
deviation_values[(deviation_start + nb_deviation) % nbDeviationValues] = d;
nb_deviation++;
deviation_sum += d;
deviation = deviation_sum / nb_deviation;
}
void Tuner::SetFound(int n, int o, double d) void Tuner::SetFound(int n, int o, double d)
{ {
if (n != note_found) { if (n != note_found) {
note_found = n; note_found = n;
count_found = 0; count_found = 0;
SetNotFound(); SetNotFound();
ResetDeviation();
UpdateDeviation(d);
} }
else if (count_found++ >= nbConfirm) { else if (count_found++ >= nbConfirm) {
count_not_found = 0; count_not_found = 0;
@ -125,10 +150,11 @@ void Tuner::SetFound(int n, int o, double d)
octave = o; octave = o;
octaveChanged(); octaveChanged();
} }
if (deviation != d) { UpdateDeviation(d);
deviation = d; deviationChanged();
deviationChanged(); }
} else {
UpdateDeviation(d);
} }
} }
@ -138,6 +164,7 @@ void Tuner::SetNotFound()
count_found = 0; count_found = 0;
if (found) { if (found) {
found = false; found = false;
ResetDeviation();
foundChanged(); foundChanged();
} }
} }

View file

@ -28,6 +28,8 @@ class Tuner : public QObject {
double freq, deviation; double freq, deviation;
int note, octave, nb_sample_running; int note, octave, nb_sample_running;
int note_found, count_found, count_not_found; int note_found, count_found, count_not_found;
int nb_deviation, deviation_start;
double deviation_sum;
static const int rate = 16000; static const int rate = 16000;
static const int defaultNbFrame = 1024; static const int defaultNbFrame = 1024;
@ -38,11 +40,16 @@ class Tuner : public QObject {
static const int nbConfirm = 3; static const int nbConfirm = 3;
/// number of analyses to drop a note /// number of analyses to drop a note
static const int nbDefect = 20; static const int nbDefect = 20;
/// number of deviation values for average
static const int nbDeviationValues = 8;
double deviation_values[nbDeviationValues];
inline void ComputeFrame(int16_t v); inline void ComputeFrame(int16_t v);
void SetFound(int note, int octave, double deviation); void SetFound(int note, int octave, double deviation);
void SetNotFound(); void SetNotFound();
void ResetDeviation();
void UpdateDeviation(double d);
private slots: private slots:
void AudioCb(const QAudioBuffer &buffer); void AudioCb(const QAudioBuffer &buffer);