ref: dbe22f113bc70b0c3714f537497edeb1a087e84f
parent: acfa035bf7b5bbe68351c4a3bb41239ea882ff71
author: Jean-Marc Valin <[email protected]>
date: Mon Jun 26 09:02:23 EDT 2017
Working around misdetected audio bandwidth The new detector for SWB vs FB is unreliable due to the hack that was required to get 24 kHz analysis working. We're now err on the side of FB just to make sure.
--- a/src/analysis.c
+++ b/src/analysis.c
@@ -663,8 +663,10 @@
}
/* Special case for the last two bands, for which we don't have spectrum but only
the energy above 12 kHz. */
- {
+ if (tonal->Fs == 48000) {
+ float ratio;
float E = hp_ener*(1.f/(240*240));
+ ratio = tonal->prev_bandwidth==20 ? 0.03f : 0.07f;
#ifdef FIXED_POINT
/* silk_resampler_down2_hp() shifted right by an extra 8 bits. */
E *= 256.f*(1.f/Q15ONE)*(1.f/Q15ONE);
@@ -674,8 +676,11 @@
E = MAX32(E, tonal->meanE[b]);
/* Use a simple follower with 13 dB/Bark slope for spreading function */
bandwidth_mask = MAX32(.05f*bandwidth_mask, E);
- if (E>.1*bandwidth_mask && E*1e9f > maxE && E > noise_floor*160)
+ if (E>ratio*bandwidth_mask && E*1e9f > maxE && E > noise_floor*160)
bandwidth = 20;
+ /* This detector is unreliable, so if the bandwidth is close to SWB, assume it's FB. */
+ if (bandwidth >= 17)
+ bandwidth = 20;
}
if (tonal->count<=2)
bandwidth = 20;
@@ -896,6 +901,7 @@
#endif
info->bandwidth = bandwidth;
+ tonal->prev_bandwidth = bandwidth;
/*printf("%d %d\n", info->bandwidth, info->opus_bandwidth);*/
info->noisiness = frame_noisiness;
info->valid = 1;
--- a/src/analysis.h
+++ b/src/analysis.h
@@ -55,6 +55,7 @@
int mem_fill; /* number of usable samples in the buffer */
float prev_band_tonality[NB_TBANDS];
float prev_tonality;
+ int prev_bandwidth;
float E[NB_FRAMES][NB_TBANDS];
float logE[NB_FRAMES][NB_TBANDS];
float lowE[NB_TBANDS];