internal static void lsp_to_curve(float[] curve,
int[] map, int n, int ln,
float[] lsp, int m,
float amp, float ampoffset)
{
int i;
float wdel = M_PI / ln;
for (i = 0; i < m; i++)
{
lsp[i] = Lookup.coslook(lsp[i]);
}
int m2 = (m / 2) * 2;
i = 0;
while (i < n)
{
FloatHack fh = new FloatHack();
int k = map[i];
float p = .7071067812f;
float q = .7071067812f;
float w = Lookup.coslook(wdel * k);
//int ftmp=0;
int c = (int)((uint)m >> 1);
for (int j = 0; j < m2; j += 2)
{
q *= lsp[j] - w;
p *= lsp[j + 1] - w;
}
if ((m & 1) != 0)
{
/* odd order filter; slightly assymetric */
/* the last coefficient */
q *= lsp[m - 1] - w;
q *= q;
p *= p * (1.0f - w * w);
}
else
{
/* even order filter; still symmetric */
q *= q * (1.0f + w);
p *= p * (1.0f - w);
}
// q=frexp(p+q,&qexp);
q = p + q;
fh.fh_float = q;
int hx = fh.fh_int;
int ix = 0x7fffffff & hx;
int qexp = 0;
if (ix >= 0x7f800000 || (ix == 0))
{
// 0,inf,nan
}
else
{
if (ix < 0x00800000)
{ // subnormal
q *= 3.3554432000e+07F; // 0x4c000000
fh.fh_float = q;
hx = fh.fh_int;
ix = 0x7fffffff & hx;
qexp = -25;
}
qexp += (int)(((uint)ix >> 23) - 126);
hx = (int)((hx & 0x807fffff) | 0x3f000000);
fh.fh_int = hx;
q = fh.fh_float;
}
q = Lookup.fromdBlook(amp *
Lookup.invsqlook(q) *
Lookup.invsq2explook(qexp + m) - ampoffset);
do
{
curve[i] *= q; i++;
}
// do{curve[i++]=q;}
while(i < n && map[i] == k);
}
}