[FFmpeg-devel] [PATCH] Common fixed-point ACELP routines (1/3) - math

Vladimir Voroshilov voroshil
Thu Apr 24 18:10:24 CEST 2008


On Thu, Apr 24, 2008 at 9:57 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
>
> On Thu, Apr 24, 2008 at 09:32:53PM +0700, Vladimir Voroshilov wrote:
>  > On Thu, Apr 24, 2008 at 3:33 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>  > > On Thu, Apr 24, 2008 at 02:41:54AM +0700, Vladimir Voroshilov wrote:
>  > >  [...]
>  > >  > > > +/**
>  > >  > > > + * \brief Calculates sum of array elements absolute values
>  > >  > > > + * \param speech array with input data
>  > >  > > > + * \param cycles number elements to proceed
>  > >  > > > + * \param shift right shift by this value will be done before addition
>  > >  > > > + *
>  > >  > > > + * \return sum of absolute values
>  > >  > > > + */
>  > >  > > > +static int sum_of_absolute(const int16_t* speech, int cycles, int shift)
>  > >  > > > +{
>  > >  > > > +    int n;
>  > >  > > > +    int sum = 0;
>  > >  > > > +
>  > >  > > > +    for(n=0; n<cycles; n++)
>  > >  > > > +       sum += FFABS(speech[n] >> shift);
>  > >  > > > +
>  > >  > > > +    return sum;
>  > >  > > > +}
>  > >  > >
>  > >  > > The place where the shift is done is not optimal for precission.
>  > >  >
>  > >  > I've just realized that i'm not using shift at all.
>  > >  > Should i keep routine as is, remove shift or remove all routine?
>  > >  > Currently moved outside loop.
>  > >
>  > >  if shift is always 0 remove shift.
>  > >  and maybe yes, remove the whole routine its so simple that iam not sure
>  > >  if this makes sense here, maybe if its speed critical it could be put in
>  > >  dsputil but i guess it could as well stay in g729.c for now
>  >
>  > I've inlined that code.
>
>
> [...]
>
>  > +int ff_log2(int value)
>
>  value should be unsigned.

Fixed.

>  > +{
>  > +    uint32_t result;
>  > +    uint8_t  power_int;
>  > +    uint8_t  frac_x0;
>  > +    uint16_t frac_dx;
>  > +
>  > +    assert(value > 0);
>  > +
>  > +    // Stripping zeros from beginning
>  > +    power_int = av_log2(value);
>  > +    result = value << (31 - power_int);
>
>  value could be used here, which would mean 1 variable less

Fixed.

>  > +/**
>  > + * \brief multiplies 32-bit integer by another 16-bit and divides result by 2^15
>  > + * \param var_q24 32-bit integer
>  > + * \param var_15 16-bit integer
>  > + *
>  > + * \return result of (var_q24 * var_q15 >> 15) with clipping to [INT_MIN; INT_MAX] range
>  > + */
>  > +static inline int mul_24_15(int var_q24, int16_t var_q15)
>  > +{
>  > +    int64_t tmp = (((int64_t)var_q24 * (int64_t)var_q15) >> 15);
>  > +
>  > +    if(tmp < -0x7fffffff)
>  > +        return -0x7fffffff;
>  > +    else if (tmp > 0x7fffffff)
>  > +        return 0x7fffffff;
>  > +    else
>  > +        return tmp;
>  > +}
>  > +
>
>  does amr/qcelp also require such cliped multiply?
>  Also the word clip should occur in the name, maybe cliped_mul_24_15()

LOL. it is unnecessary in G.729 too :)
Renamed to mul_32_16 to reflect parameters size.

>  > +/**
>  > + * \brief Calculates sum of array elements multiplications
>
> > + * \param speech array with input data
>  > + * \param cycles number elements to proceed
>
> > + * \param offset offset for calculation sum of s[i]*s[i+offset]
>  > + * \param shift right shift by this value will be done before multiplication
>  > + *
>  > + * \return sum of multiplications
>  > + *
>  > + * \note array must be at least length+offset long!
>  > + */
>  > +static int sum_of_squares(const int16_t* speech, int cycles, int offset, int shift)
>
> > +{
>  > +    int n;
>  > +    int sum = 0;
>  > +
>  > +    for(n=0; n<cycles; n++)
>
> > +       sum += (speech[n] >> shift) * (speech[n + offset] >> shift);
>
>   >> shift should be done after the *
>  and the n can be moved out of the inner loop:
>
>  for(speech_end= speech + cycles; speech < speech_end; speech++)
>     sum += (speech[0] * speech[offset]) >> shift;
>
>
>
>  > +
>  > +    return av_clip(sum, -0x40000000, 0x3fffffff);
>  > +}
>
>  if such clip is needed it should be done outside the common code

Unnecessary. Removed.



-- 
Regards,
Vladimir Voroshilov mailto:voroshil at gmail.com
JID: voroshil at gmail.com, voroshil at jabber.ru
ICQ: 95587719
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: acelp_math_24.diff
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080424/da98d0d8/attachment.asc>



More information about the ffmpeg-devel mailing list