/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ /* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk<ymnk@jcraft.com> * * Many thanks to * Monty <monty@xiph.org> and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; /* function: LSP (also called LSF) conversion routines The LSP generation code is taken (with minimal modification) from "On the Computation of the LSP Frequencies" by Joseph Rothweiler <rothwlr@altavista.net>, available at: http://www2.xtdl.com/~rothwlr/lsfpaper/lsfpage.html ********************************************************************/ class Lsp { static final float M_PI = (float) (3.1415926539); 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) { int k = map[i]; float p = .7071067812f; float q = .7071067812f; float w = Lookup.coslook(wdel * k); 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.f - w * w); } else { /* even order filter; still symmetric */ q *= q * (1.f + w); p *= p * (1.f - w); } // q=frexp(p+q,&qexp); q = p + q; int hx = Float.floatToIntBits(q); int ix = 0x7fffffff & hx; int qexp = 0; if (ix >= 0x7f800000 || (ix == 0)) { // 0,inf,nan } else { if (ix < 0x00800000) { // subnormal q *= 3.3554432000e+07; // 0x4c000000 hx = Float.floatToIntBits(q); ix = 0x7fffffff & hx; qexp = -25; } qexp += ((ix >>> 23) - 126); hx = (hx & 0x807fffff) | 0x3f000000; q = Float.intBitsToFloat(hx); } q = Lookup.fromdBlook(amp * Lookup.invsqlook(q) * Lookup.invsq2explook(qexp + m) - ampoffset); do { curve[i++] *= q; } while (i < n && map[i] == k); } } }