All pastes #124431 Raw Edit

Anonymous

public text v1 · immutable
·published 2006-08-10 01:55 UTC
rendered paste body
/*
 * Get_lsp_pol
 *
 *
 * Parameters:
 *    lsp               I: line spectral frequencies
 *    f                 O: polynomial F1(z) or F2(z)
 *
 * Function:
 *    Find the polynomial F1(z) or F2(z) from the LSPs.
 *
 *    F1(z) = product ( 1 - 2 lsp[i] z^-1 + z^-2 )
 *             i=0,2,4,6,8
 *    F2(z) = product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
 *             i=1,3,5,7,9
 *
 *    where lsp[] is the LSP vector in the cosine domain.
 *
 *    The expansion is performed using the following recursion:
 *
 *    f[0] = 1
 *    b = -2.0 * lsp[0]
 *    f[1] = b
 *    for i=2 to 5 do
 *       b = -2.0 * lsp[2*i-2];
 *       f[i] = b*f[i-1] + 2.0*f[i-2];
 *       for j=i-1 down to 2 do
 *          f[j] = f[j] + b*f[j-1] + f[j-2];
 *       f[1] = f[1] + b;
 */

/**
 * Find the polynomial F1(z) or F2(z) from the lsps
 *
 * @param lsp               vector of lsps
 * @param f                 pointer to the polynomial F1(z) or F2(z)
 *
 * @return void
 */

static void lsp_poly(const int *lsp, int *f) {
    int b;
    int i, j;

    f[0] = 1;
    b = -(lsp[0]<<1);
    f[1] = b;
    for(i=2; i<6; i++) {
        b = lsp[2*i-2]<<1;
        f[i] = (f[i-2]<<1) - b*f[i-1];
        for(j=i-1; j>1; j--) {
            f[j] += f[j-2] - b*f[j-1];
        }
        f[1] -= b;
    }
}

/*

mine:
f[0] = 1;

f[1] =           - (lsp[0]<<1);

f[2] = (f[0]<<1) - (lsp[2]<<1)*f[1];
f[1] -=            (lsp[2]<<1);

f[3] = (f[1]<<1) - (lsp[4]<<1)*f[2];
f[2] += f[0]     - (lsp[4]<<1)*f[1];
f[1] -=            (lsp[4]<<1);

f[4] = (f[2]<<1) - (lsp[6]<<1)*f[3];
f[3] += f[1]     - (lsp[6]<<1)*f[2];
f[2] += f[2]     - (lsp[6]<<1)*f[1];
f[1] -=          - (lsp[6]<<1);


theirs:
f[2] = (f[0]<<1) - (( ((f[1]>>16)*lsp[2]) + (( (f[1] & 0xFFFE)*lsp[2] )>>16) )<<2);

*/

static void Get_lsp_pol(const int *lsp, int *f) {
   volatile int f0, f1, f2, f3, f4, f5;

   /* f[0] = 1.0; */
   f0 = 1<<24;

   /* f1 = *lsp * -1024; */
   f1 = -lsp[0] << 10;

   f2 = f0 << 1;
   f2 -= ( ( ( f1 >> 16 ) * lsp[2] ) + ( ( ( f1 & 0xFFFE ) * lsp[2] ) >> 16 ) ) << 2;
   f1 -= lsp[2] << 10;

   f3 = f1 << 1;
   f3 -= ( ( ( f2 >> 16 ) * lsp[4] ) + ( ( ( f2 & 0xFFFE ) * lsp[4] ) >> 16 ) ) << 2;
   f2 += f0;
   f2 -= ( ( ( f1 >> 16 ) * lsp[4] ) + ( ( ( f1 & 0xFFFE ) * lsp[4] ) >> 16 ) ) << 2;
   f1 -= lsp[4] << 10;

   f4 = f2 << 1;
   f4 -= ( ( ( f3 >> 16 ) * lsp[6] ) + ( ( ( f3 & 0xFFFE ) * lsp[6] ) >> 16 ) ) << 2;
   f3 += f1;
   f3 -= ( ( ( f2 >> 16 ) * lsp[6] ) + ( ( ( f2 & 0xFFFE ) * lsp[6] ) >> 16 ) ) << 2;
   f2 += f0;
   f2 -= ( ( ( f1 >> 16 ) * lsp[6] ) + ( ( ( f1 & 0xFFFE ) * lsp[6] ) >> 16 ) ) << 2;
   f1 -= lsp[6] << 10;

   f5 = f3 << 1;
   f5 -= ( ( ( f4 >> 16 ) * lsp[8] ) + ( ( ( f4 & 0xFFFE ) * lsp[8] ) >> 16 ) ) << 2;
   f4 += f2;
   f4 -= ( ( ( f3 >> 16 ) * lsp[8] ) + ( ( ( f3 & 0xFFFE ) * lsp[8] ) >> 16 ) ) << 2;
   f3 += f1;
   f3 -= ( ( ( f2 >> 16 ) * lsp[8] ) + ( ( ( f2 & 0xFFFE ) * lsp[8] ) >> 16 ) ) << 2;
   f2 += f0;
   f2 -= ( ( ( f1 >> 16 ) * lsp[8] ) + ( ( ( f1 & 0xFFFE ) * lsp[8] ) >> 16 ) ) << 2;
   f1 -= lsp[8] << 10;

   f[0] = f0;
   f[1] = f1;
   f[2] = f2;
   f[3] = f3;
   f[4] = f4;
   f[5] = f5;
   return;
}

int main() {
    const int lsp[10] = { 31216, 23530, 20571, 13690, -1869, -4576, -20408, -27784, -29826, 16777216 };
    int f1[6], f2[6];
    int i;

    Get_lsp_pol(lsp, f1);
    lsp_poly(lsp, f2);
    printf("\n\nTheirs :\n");
    for(i=0; i<6; i++) {
        printf("f[%d] = %d\n", i, f1[i]);
    }
    printf("\n\nMine :\n");
    for(i=0; i<6; i++) {
        printf("f[%d] = %d\n", i, f2[i]);
    }
    printf("\n\n");
}



And the output:

$ ./polytest 


Theirs :
f[0] = 16777216
f[1] = 323584
f[2] = -710000
f[3] = -5530272
f[4] = 5309548
f[5] = -1326264


Mine :
f[0] = 1
f[1] = 632
f[2] = -1119182183
f[3] = -1453367504
f[4] = 836835526
f[5] = 821401968



Obviously the first alteration I would make would be to 'correct' f[0] and f[1] but that doesn't appear to help too much as f[i] i>2 are completely wrong and looking at it I don't know how their expansion is supposed to be equivalent to the description. It looks like a load of rubbish to me...

Somehow I need to make:

f[2] = (f[0]<<1) - (lsp[2]<<1)*f[1];

equivalent to:

f[2] = (f[0]<<1) - (( ((f[1]>>16)*lsp[2]) + (( (f[1] & 0xFFFE)*lsp[2] )>>16) )<<2);

I don't know because I haven't seen it before but this almost looks like they're messing with bit/bytesex.