Rceps.java

/*
 * $Id: Rceps.java,v 1.23 2008/03/26 14:31:23 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.signal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.matrix.Makecolv;


/**
 * 実ケプストラムを求めるクラスです。
 * 
 * <p>Real cepstrum
 * 
 * @author koga
 * @version $Revision: 1.23 $
 * @see org.mklab.tool.signal.Cceps
 */
public class Rceps {

  /**
   * <code>x</code> の実ケプストラムと最小位相信号を返します。
   * 
   * @param x データ
   * @return 実ケプストラム (real cepstrum)
   */
  public static List<DoubleMatrix> rceps(DoubleMatrix x) {
    int length = x.length();
    DoubleMatrix xc = (((x.fft()).absElementWise()).logElementWise()).ifft().getRealPart();

    int oe = length % 2;
    DoubleMatrix win = x.createUnit(1).appendDown(x.createOnes((length + oe) / 2 - 1, 1)).appendDown(x.createUnit(1)).appendDown(x.createZero((length - oe) / 2 - 1, 1));
    DoubleMatrix yc = ((win.multiplyElementWise(Makecolv.makecolv(xc)).fft()).expElementWise()).ifft().getRealPart();
    return new ArrayList<>(Arrays.asList(new DoubleMatrix[] {xc, yc}));
  }

}