[FFmpeg-devel] [PATCH/RFC] Remove triplication of compute_lpc_coefs() function
Vitor Sessak
vitor1001
Thu Sep 4 13:04:18 CEST 2008
Michael Niedermayer wrote:
> On Mon, Sep 01, 2008 at 07:03:23AM +0200, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Sun, Aug 31, 2008 at 05:08:26AM +0200, Vitor Sessak wrote:
>>>> Michael Niedermayer wrote:
>>>>> On Thu, Aug 28, 2008 at 02:28:50PM +0200, Vitor Sessak wrote:
>>>>>> Hi all.
>>>>>>
>>>>>> I've finally found a more or less clean way of doing $subj.
>> [...]
>>
>>> for(i=0; i<max_order; i++) {
>>> LPC_type r = -autoc[i+1];
>>> LPC_type *lpc_last= lpc;
>>> lpc += lpc_stride;
>>> if (normalize) {
>>> for(j=0; j<i; j++)
>>> r -= lpc_last[j] * autoc[i-j];
>>> r /= err;
>>> err *= 1.0 - (r * r);
>>> }
>>> if (ref)
>>> ref[i] = fabs(r);
>>> lpc[i] = r;
>>> for(j=0; j < (i+1)>>1; j++) {
>>> LPC_type f = lpc_last[ j];
>>> LPC_type b = lpc_last[i-1-j];
>>> lpc[ j] = f + r * b;
>>> lpc[i-1-j] = b + r * f;
>>> }
>>> if (fail && err < 0)
>>> return -1;
>>> }
>> I like it, done.
>>
>>> [...]
>>>> Index: libavcodec/lpc.h
>>>> ===================================================================
>>>> --- libavcodec/lpc.h (revision 15050)
>>>> +++ libavcodec/lpc.h (working copy)
>>>> @@ -45,4 +45,66 @@
>>>> int32_t coefs[][MAX_LPC_ORDER], int *shift, int
>>>> use_lpc,
>>>> int omethod, int max_shift, int zero_shift);
>>>> +
>>>> +#ifdef LPC_USE_DOUBLE
>>>> +#define LPC_type double
>>>> +#else
>>>> +#define LPC_type float
>>>> +#endif
>>>> +
>>>> +/**
>>>> + * Levinson-Durbin recursion.
>>>> + * Produces LPC coefficients from autocorrelation data.
>>>> + */
>>>> +static inline int compute_lpc_coefs(const LPC_type *autoc,
>>>> + int max_order,
>>>> + LPC_type lpc[][MAX_LPC_ORDER],
>>>> + LPC_type *ref,
>>>> + LPC_type lpc_tmp[MAX_LPC_ORDER],
>>>> + int fail, int normalize)
>>>> +{
>>>> + int i, j;
>>>> + LPC_type err = autoc[0];
>>>> +
>>>> + if (fail && (autoc[max_order] == 0 || autoc[0] <= 0))
>>>> + return -1;
>>>> +
>>>> + for(i=0; i<max_order; i++) {
>>>> + LPC_type r;
>>>> + if (normalize) {
>>>> + r = -autoc[i+1];
>>>> +
>>>> + for(j=0; j<i; j++)
>>>> + r -= lpc_tmp[j] * autoc[i-j];
>>>> +
>>>> + r /= err;
>>>> + } else
>>>> + r = -autoc[i];
>>> This can be factored out of the loop when autoc+1 is passed as argument
>>> instead of autoc for !normalize
>> I don't like it because I'll need to check autoc[-1] in the beginning...
>>
>>>> +
>>>> + if (ref)
>>>> + ref[i] = fabs(r);
>>>> +
>>>> + err *= 1.0 - (r * r);
>>> This line can be under if(normalize) above
>> done.
>>
>> New version attached.
> [...]
>> Index: libavcodec/lpc.h
>> ===================================================================
>> --- libavcodec/lpc.h (revision 15050)
>> +++ libavcodec/lpc.h (working copy)
>> @@ -45,4 +45,62 @@
>> int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc,
>> int omethod, int max_shift, int zero_shift);
>>
>> +
>> +#ifdef LPC_USE_DOUBLE
>> +#define LPC_type double
>> +#else
>> +#define LPC_type float
>> +#endif
>> +
>> +/**
>> + * Levinson-Durbin recursion.
>> + * Produces LPC coefficients from autocorrelation data.
>> + */
>> +static inline int compute_lpc_coefs(const LPC_type *autoc, int max_order,
>> + LPC_type *lpc, LPC_type *ref,
>> + int lpc_stride, int fail, int normalize)
>> +{
>> + int i, j;
>> + LPC_type err;
>> + LPC_type *lpc_last = lpc;
>> +
>> + if (normalize)
>> + err = *autoc++;
>> +
>> + if (fail && (autoc[max_order - 1] == 0 || err <= 0))
>> + return -1;
>> +
>> + for(i=0; i<max_order; i++) {
>> + LPC_type r = -autoc[i];
>> +
>> + if (normalize) {
>> + for(j=0; j<i; j++)
>> + r -= lpc_last[j] * autoc[i-j-1];
>> +
>> + r /= err;
>> + err *= 1.0 - (r * r);
>> + }
>> +
>> + if (ref)
>> + ref[i] = fabs(r);
>> +
>> + lpc[i] = r;
>> +
>> + for(j=0; j < (i+1)>>1; j++) {
>> + LPC_type f = lpc_last[ j];
>> + LPC_type b = lpc_last[i-1-j];
>> + lpc[ j] = f + r * b;
>> + lpc[i-1-j] = b + r * f;
>> + }
>
> if iam not missing someting than the ref values get already exported in lpc[]
> ignoring the fabs() thus ref might not be needed ...
>
> And I think iam fine with the patch after that
Applied without ref[].
-Vitor
More information about the ffmpeg-devel
mailing list