/* * Copyright 1999-2014 Carnegie Mellon University. * Portions Copyright 2002-2004 Sun Microsystems, Inc. * Portions Copyright 2002-2004 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. */ package edu.cmu.sphinx.frontend.transform; import java.util.Arrays; /** * DCT implementation that conforms to one used in Kaldi. */ public class KaldiDiscreteCosineTransform extends DiscreteCosineTransform { public KaldiDiscreteCosineTransform(int numberMelFilters, int cepstrumSize) { super(numberMelFilters, cepstrumSize); } public KaldiDiscreteCosineTransform() { } @Override protected void computeMelCosine() { melcosine = new double[cepstrumSize][numberMelFilters]; Arrays.fill(melcosine[0], Math.sqrt(1. / numberMelFilters)); double normScale = Math.sqrt(2. / numberMelFilters); for (int i = 1; i < cepstrumSize; i++) { double frequency = Math.PI * i / numberMelFilters; for (int j = 0; j < numberMelFilters; j++) melcosine[i][j] = normScale * Math.cos(frequency * (j + 0.5)); } } @Override protected double[] applyMelCosine(double[] melspectrum) { double[] cepstrum = new double[cepstrumSize]; for (int i = 0; i < cepstrum.length; i++) { for (int j = 0; j < numberMelFilters; j++) cepstrum[i] += melspectrum[j] * melcosine[i][j]; } return cepstrum; } }