[FFmpeg-soc] [soc]AMR-WB decoder branch, master, updated.
Marcelo Póvoa
marspeoplester at gmail.com
Thu Jul 29 07:52:02 CEST 2010
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "AMR-WB decoder".
The branch, master has been updated
via 1c399e4d298648f1ad8a70f50507c41fa7b21a62 (commit)
from 42461e43223b4da99bbfa00a08e844fa8d6acd85 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 1c399e4d298648f1ad8a70f50507c41fa7b21a62
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Thu Jul 29 02:51:15 2010 -0300
Finish writing the ISF vector extrapolation (6k60 HB)
Fix white noise excitation randomness
diff --git a/libavcodec/amrwbdata.h b/libavcodec/amrwbdata.h
index acfb443..ce5fb63 100644
--- a/libavcodec/amrwbdata.h
+++ b/libavcodec/amrwbdata.h
@@ -28,8 +28,7 @@
#define LP_ORDER_16k 20 ///< lpc filter order at 16kHz
#define UPS_FIR_SIZE 12 ///< upsampling filter size
#define UPS_MEM_SIZE 2 * UPS_FIR_SIZE
-//#define SAMPLE_MEM 24 ///< number of stored past samples given by
- ///< max(LP_ORDER, UPS_FIR_SIZE * 2)
+
#define MIN_ISF_SPACING (128 / 32768.0) ///< minimum isf gap
#define PRED_FACTOR (1.0 / 3.0)
#define MIN_ENERGY -14.0 ///< initial innnovation energy (dB)
@@ -39,7 +38,6 @@
#define AMRWB_SUBFRAME_SIZE 64 ///< samples per subframe at 12.8 kHz
#define AMRWB_SFR_SIZE_OUT 80 ///< samples per subframe at 16 kHz
#define AMRWB_SAMPLE_BOUND 32768.0 ///< threshold for synthesis overflow
-
#define AMRWB_P_DELAY_MAX 231 ///< maximum pitch delay value
#define AMRWB_P_DELAY_MIN 34
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 83303ed..6833f23 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -1033,7 +1033,7 @@ static void scaled_hb_excitation(AMRWBContext *ctx, float *hb_exc,
/* Generate a white-noise excitation */
for (i = 0; i < AMRWB_SUBFRAME_SIZE; i++)
- hb_exc[i] = 32768.0 - (uint16_t) av_lfg_get(&ctx->prng) / 65536.0;
+ hb_exc[i] = 32768.0 - (uint16_t) av_lfg_get(&ctx->prng);
ff_scale_vector_to_given_sum_of_squares(hb_exc, hb_exc, energy,
AMRWB_SUBFRAME_SIZE);
@@ -1042,6 +1042,9 @@ static void scaled_hb_excitation(AMRWBContext *ctx, float *hb_exc,
hb_exc[i] *= hb_gain;
}
+/**
+ * Calculate auto-correlation for the ISF difference vector
+ */
static float auto_correlation(float *diff_isf, float mean, int lag)
{
int i;
@@ -1054,10 +1057,19 @@ static float auto_correlation(float *diff_isf, float mean, int lag)
return sum;
}
+/**
+ * Extrapolate a ISF vector to the 16kHz range (20th order LP)
+ * used at mode 6k60 LP filter for the high-freq band
+ *
+ * @param out [out] buffer for extrapolated isf
+ * @param isf [in] input isf vector
+ */
static void extrapolate_isf(float *out, float *isf)
{
float diff_isf[LP_ORDER - 2], diff_mean;
+ float *diff_hi = diff_isf - LP_ORDER + 1; // diff array for extrapolated indices
float corr_lag[3];
+ float est, scale;
int i, i_max_corr;
memcpy(out, isf, LP_ORDER - 1);
@@ -1083,7 +1095,32 @@ static void extrapolate_isf(float *out, float *isf)
for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++)
out[i] = isf[i - 1] + isf[i - 1 - i_max_corr]
- isf[i - 2 - i_max_corr];
- return;
+
+ /* Calculate an estimate for ISF(18) and scale ISF based on the error */
+ est = 79.65 + (out[2] - out[3] - out[4]) / 6.0;
+ scale = (FFMIN(est, 76.0) - out[LP_ORDER - 2]) /
+ (out[LP_ORDER_16k - 2] - out[LP_ORDER - 2]);
+ // XXX: should divide numerator by 2.0?
+
+ for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++)
+ diff_hi[i] = scale * (out[i] - out[i - 1]);
+
+ /* Stability insurance */
+ for (i = LP_ORDER; i < LP_ORDER_16k - 1; i++)
+ if (diff_hi[i] + diff_hi[i - 1] < 5.0) {
+ if (diff_hi[i] > diff_hi[i - 1]) {
+ diff_hi[i - 1] = 5.0 - diff_hi[i];
+ } else
+ diff_hi[i] = 5.0 - diff_hi[i - 1];
+ }
+
+ for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++)
+ out[i] = out[i - 1] + diff_hi[i];
+
+ /* XXX: Don't know why this 26214 coefficient, maybe it is not Q8 */
+ /* Scale the ISF vector for 16000 Hz */
+ for (i = 0; i < LP_ORDER_16k - 1; i++)
+ out[i] *= 26214 / (float) (1 << 8);
}
/**
-----------------------------------------------------------------------
Summary of changes:
libavcodec/amrwbdata.h | 4 +---
libavcodec/amrwbdec.c | 41 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 40 insertions(+), 5 deletions(-)
hooks/post-receive
--
AMR-WB decoder
More information about the FFmpeg-soc
mailing list