/* * Copyright 2013 Carnegie Mellon University. * 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.feature; import edu.cmu.sphinx.frontend.*; public class KaldiDeltasFeatureExtractor extends AbstractFeatureExtractor { public KaldiDeltasFeatureExtractor( int window ) { super(window); } public KaldiDeltasFeatureExtractor( ) { } @Override protected Data computeNextFeature() { int jp1 = (currentPosition - 1 + cepstraBufferSize) % cepstraBufferSize; int jp2 = (currentPosition - 2 + cepstraBufferSize) % cepstraBufferSize; int jp3 = (currentPosition - 3 + cepstraBufferSize) % cepstraBufferSize; int jp4 = (currentPosition - 4 + cepstraBufferSize) % cepstraBufferSize; int jf1 = (currentPosition + 1) % cepstraBufferSize; int jf2 = (currentPosition + 2) % cepstraBufferSize; int jf3 = (currentPosition + 3) % cepstraBufferSize; int jf4 = (currentPosition + 4) % cepstraBufferSize; DoubleData currentCepstrum = cepstraBuffer[currentPosition]; double[] mfc4f = cepstraBuffer[jf4].getValues(); double[] mfc3f = cepstraBuffer[jf3].getValues(); double[] mfc2f = cepstraBuffer[jf2].getValues(); double[] mfc1f = cepstraBuffer[jf1].getValues(); double[] current = currentCepstrum.getValues(); double[] mfc1p = cepstraBuffer[jp1].getValues(); double[] mfc2p = cepstraBuffer[jp2].getValues(); double[] mfc3p = cepstraBuffer[jp3].getValues(); double[] mfc4p = cepstraBuffer[jp4].getValues(); float[] feature = new float[current.length * 3]; currentPosition = (currentPosition + 1) % cepstraBufferSize; int j = 0; for (double val : current) { feature[j++] = (float)val; } for (int k = 0; k < mfc2f.length; k++) { feature[j++] = (float) (2 * mfc2f[k] + mfc1f[k] - mfc1p[k] - 2 * mfc2p[k]) / 10.0f; } for (int k = 0; k < mfc3f.length; k++) { feature[j++] = (float) ((4 * mfc4f[k] + 4 * mfc3f[k] + mfc2f[k] - 4 * mfc1f[k]) - 10 * current[k] + (4 * mfc4p[k] + 4 * mfc3p[k] + mfc2p[k] - 4 * mfc1p[k])) / 100.0f; } return (new FloatData(feature, currentCepstrum.getSampleRate(), currentCepstrum.getFirstSampleNumber())); } }