/******************************************************************************
* *
* Copyright (c) 1999-2003 Wimba S.A., All Rights Reserved. *
* *
* COPYRIGHT: *
* This software is the property of Wimba S.A. *
* This software is redistributed under the Xiph.org variant of *
* the BSD license. *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* - Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. *
* - Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* - Neither the name of Wimba, the Xiph.org Foundation nor the names of *
* its contributors may be used to endorse or promote products derived *
* from this software without specific prior written permission. *
* *
* WARRANTIES: *
* This software is made available by the authors in the hope *
* that it will be useful, but without any warranty. *
* Wimba S.A. is not liable for any consequence related to the *
* use of the provided software. *
* *
* Class: SbCodec.java *
* *
* Author: Marc GIMPEL *
* Based on code by: Jean-Marc VALIN *
* *
* Date: 14th July 2003 *
* *
******************************************************************************/
/* $Id: SbCodec.java,v 1.2 2004/10/21 16:21:57 mgimpel Exp $ */
package org.xiph.speex;
/**
* Sideband Codec.
* This class contains all the basic structures needed by the Sideband
* encoder and decoder.
*
* @author Marc Gimpel, Wimba S.A. (mgimpel@horizonwimba.com)
* @version $Revision: 1.2 $
*/
public class SbCodec
extends NbCodec
{
//---------------------------------------------------------------------------
// Constants
//---------------------------------------------------------------------------
/** The Sideband Frame Size gives the size in bits of a Sideband frame for a given sideband submode. */
public static final int[] SB_FRAME_SIZE = {4, 36, 112, 192, 352, -1, -1, -1};
/** The Sideband Submodes gives the number of submodes possible for the Sideband codec. */
public static final int SB_SUBMODES = 8;
/** The Sideband Submodes Bits gives the number bits used to encode the Sideband Submode*/
public static final int SB_SUBMODE_BITS = 3;
/** Quadratic Mirror Filter Order */
public static final int QMF_ORDER = 64;
//---------------------------------------------------------------------------
// Parameters
//---------------------------------------------------------------------------
/** */
protected int fullFrameSize;
/** */
protected float foldingGain;
//---------------------------------------------------------------------------
// Variables
//---------------------------------------------------------------------------
/** */
protected float[] high;
/** */
protected float[] y0, y1;
/** */
protected float[] x0d;
/** */
protected float[] g0_mem, g1_mem;
/**
* Wideband initialisation
*/
public void wbinit()
{
// Initialize SubModes
submodes = buildWbSubModes();
submodeID = 3;
// Initialize narrwoband parameters and variables
//init(160, 40, 8, 640, .9f);
}
/**
* Ultra-wideband initialisation
*/
public void uwbinit()
{
// Initialize SubModes
submodes = buildUwbSubModes();
submodeID = 1;
// Initialize narrwoband parameters and variables
//init(320, 80, 8, 1280, .7f);
}
/**
* Initialisation
* @param frameSize
* @param subframeSize
* @param lpcSize
* @param bufSize
* @param foldingGain
*/
protected void init(final int frameSize,
final int subframeSize,
final int lpcSize,
final int bufSize,
final float foldingGain)
{
super.init(frameSize, subframeSize, lpcSize, bufSize);
this.fullFrameSize = 2*frameSize;
this.foldingGain = foldingGain;
lag_factor = 0.002f;
high = new float[fullFrameSize];
y0 = new float[fullFrameSize];
y1 = new float[fullFrameSize];
x0d = new float[frameSize];
g0_mem = new float[QMF_ORDER];
g1_mem = new float[QMF_ORDER];
}
/**
* Build wideband submodes.
* @return the wideband submodes.
*/
protected static SubMode[] buildWbSubModes()
{
/* Initialize Long Term Predictions */
HighLspQuant highLU = new HighLspQuant();
/* Initialize Codebook Searches */
SplitShapeSearch ssCbHighLbrSearch = new SplitShapeSearch(40, 10, 4, hexc_10_32_table, 5, 0);
SplitShapeSearch ssCbHighSearch = new SplitShapeSearch(40, 8, 5, hexc_table, 7, 1);
/* Initialize wide-band modes */
SubMode[] wbSubModes = new SubMode[SB_SUBMODES];
wbSubModes[1] = new SubMode(0, 0, 1, 0, highLU, null, null, .75f, .75f, -1, 36);
wbSubModes[2] = new SubMode(0, 0, 1, 0, highLU, null, ssCbHighLbrSearch, .85f, .6f, -1, 112);
wbSubModes[3] = new SubMode(0, 0, 1, 0, highLU, null, ssCbHighSearch, .75f, .7f, -1, 192);
wbSubModes[4] = new SubMode(0, 0, 1, 1, highLU, null, ssCbHighSearch, .75f, .75f, -1, 352);
return wbSubModes;
}
/**
* Build ultra-wideband submodes.
* @return the ultra-wideband submodes.
*/
protected static SubMode[] buildUwbSubModes()
{
/* Initialize Long Term Predictions */
HighLspQuant highLU = new HighLspQuant();
SubMode[] uwbSubModes = new SubMode[SB_SUBMODES];
uwbSubModes[1] = new SubMode(0, 0, 1, 0, highLU, null, null, .75f, .75f, -1, 2);
return uwbSubModes;
}
/**
* Returns the size of a frame (ex: 160 samples for a narrowband frame,
* 320 for wideband and 640 for ultra-wideband).
* @return the size of a frame (number of audio samples in a frame).
*/
public int getFrameSize()
{
return fullFrameSize;
}
/**
* Returns whether or not we are using Discontinuous Transmission encoding.
* @return whether or not we are using Discontinuous Transmission encoding.
*/
public boolean getDtx()
{
// TODO - should return DTX for the NbCodec
return dtx_enabled != 0;
}
/**
* Returns the excitation array.
* @return the excitation array.
*/
public float[] getExc()
{
int i;
float[] excTmp = new float[fullFrameSize];
for (i=0;i<frameSize;i++)
excTmp[2*i]=2*excBuf[excIdx+i];
return excTmp;
}
/**
* Returns the innovation array.
* @return the innovation array.
*/
public float[] getInnov()
{
return getExc();
}
}