package edu.cmu.sphinx.frontend.transform; import edu.cmu.sphinx.util.props.PropertySheet; import edu.cmu.sphinx.util.props.PropertyException; /** Applies the optimized MelCosine filter used in pocketsphinx to the given melspectrum. */ public class DiscreteCosineTransform2 extends DiscreteCosineTransform { public DiscreteCosineTransform2( int numberMelFilters, int cepstrumSize ) { super(numberMelFilters,cepstrumSize); } public DiscreteCosineTransform2( ) { } @Override public void newProperties(PropertySheet ps) throws PropertyException { super.newProperties(ps); } /** * Apply the optimized MelCosine filter used in pocketsphinx to the given melspectrum. * * @param melspectrum the MelSpectrum data * @return MelCepstrum data produced by apply the MelCosine filter to the MelSpectrum data */ @Override protected double[] applyMelCosine(double[] melspectrum) { // create the cepstrum double[] cepstrum = new double[cepstrumSize]; double sqrt_inv_n = Math.sqrt(1.0 / numberMelFilters); double sqrt_inv_2n = Math.sqrt(2.0 / numberMelFilters); cepstrum[0] = melspectrum[0]; for (int j = 1; j < numberMelFilters; j++) { cepstrum[0] += melspectrum[j]; } cepstrum[0] *= sqrt_inv_n; if (numberMelFilters <= 0) { return cepstrum; } for (int i = 1; i < cepstrum.length; i++) { double[] melcosine_i = melcosine[i]; int j = 0; cepstrum[i] = 0; for (j = 0; j < numberMelFilters; j++) { cepstrum[i] += (melspectrum[j] * melcosine_i[j]); } cepstrum[i] *= sqrt_inv_2n; } return cepstrum; } }