summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2017-06-09 22:16:53 -0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2017-06-10 14:34:50 -0400
commit41443428cbb9b551d96c687f70bae37ac3b32afb (patch)
tree282e5a85eaf173de987e232529238b303b0fb03d
parentc32edb588f99f14cdcadbd2458acb02a3b79bd69 (diff)
downloadopus-41443428cbb9b551d96c687f70bae37ac3b32afb.tar.gz
Improving tonality estimation with delayed decision
-rw-r--r--src/analysis.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/analysis.c b/src/analysis.c
index 75289102..4ad44d35 100644
--- a/src/analysis.c
+++ b/src/analysis.c
@@ -233,6 +233,9 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int
int pos;
int curr_lookahead;
float psum;
+ float tonality_max;
+ float tonality_avg;
+ int tonality_count;
int i;
pos = tonal->read_pos;
@@ -252,6 +255,8 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int
if (pos<0)
pos = DETECT_SIZE-1;
OPUS_COPY(info_out, &tonal->info[pos], 1);
+ tonality_max = tonality_avg = info_out->tonality;
+ tonality_count = 1;
/* If possible, look ahead for a tone to compensate for the delay in the tone detector. */
for (i=0;i<3;i++)
{
@@ -260,8 +265,11 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int
pos = 0;
if (pos == tonal->write_pos)
break;
- info_out->tonality = MAX32(0, -.03f + MAX32(info_out->tonality, tonal->info[pos].tonality-.05f));
+ tonality_max = MAX32(tonality_max, tonal->info[pos].tonality);
+ tonality_avg += tonal->info[pos].tonality;
+ tonality_count++;
}
+ info_out->tonality = MAX32(tonality_avg/tonality_count, tonality_max-.2);
tonal->read_subframe += len/(tonal->Fs/400);
while (tonal->read_subframe>=8)
{