view libgsmefr/inter_6.c @ 122:b33f2168fdec

doc/EFR-rationale article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 10 Dec 2022 08:51:01 +0000
parents 63ad83f3d821
children
line wrap: on
line source

/*************************************************************************
 *
 *  FUNCTION:  Interpol_6()
 *
 *  PURPOSE:  Interpolating the normalized correlation with 1/6 resolution.
 *
 *************************************************************************/

#include "gsm_efr.h"
#include "typedef.h"
#include "namespace.h"
#include "basic_op.h"
#include "no_count.h"
#include "codec.h"

#define UP_SAMP      6
#define L_INTERPOL   4
#define FIR_SIZE     (UP_SAMP*L_INTERPOL+1)

/* 1/6 resolution interpolation filter  (-3 dB at 3600 Hz) */

static const Word16 inter_6[FIR_SIZE] =
{
    29519,
    28316, 24906, 19838, 13896, 7945, 2755,
    -1127, -3459, -4304, -3969, -2899, -1561,
    -336, 534, 970, 1023, 823, 516,
    220, 0, -131, -194, -215, 0
};

Word16 Interpol_6 (  /* (o)  : interpolated value  */
    Word16 *x,       /* (i)  : input vector        */
    Word16 frac      /* (i)  : fraction            */
)
{
    Word16 i, k;
    Word16 *x1, *x2;
    const Word16 *c1, *c2;
    Word32 s;

    test (); 
    if (frac < 0)
    {
        frac = add (frac, UP_SAMP);
        x--;
    }
    x1 = &x[0];                         move16 (); 
    x2 = &x[1];                         move16 (); 
    c1 = &inter_6[frac];                move16 (); 
    c2 = &inter_6[sub (UP_SAMP, frac)]; move16 (); 

    s = 0;                              move32 (); 
    for (i = 0, k = 0; i < L_INTERPOL; i++, k += UP_SAMP)
    {
        s = L_mac (s, x1[-i], c1[k]);
        s = L_mac (s, x2[i], c2[k]);
    }

    return round (s);
}