Conv.java

/*
 * $Id: Conv.java,v 1.6 2008/02/25 08:35:52 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.matrix;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.AnyRealPolynomial;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.DoublePolynomial;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * 畳み込み(多項式の積)を求めるクラスです。
 * 
 * <p> Convolution
 * 
 * @author koga
 * @version $Revision: 1.6 $
 * @see org.mklab.tool.signal.Xcorr
 * @see org.mklab.tool.matrix.Deconv
 */
public class Conv {

  /**
   * ベクトル<code>x</code>と<code>y</code>の畳み込み(多項式の積)を求める 計算結果のベクトルの長さは、 <code>(length(x)+length(y)-1)</code>です。
   * 
   * @param x xデータ
   * @param y yデータ
   * @return 畳み込み(多項式の積) (comvolution)
   */
  public static DoubleMatrix conv(DoubleMatrix x, DoubleMatrix y) {
    DoublePolynomial xp = new DoublePolynomial(x);
    DoublePolynomial yp = new DoublePolynomial(y);
    return xp.multiply(yp).getCoefficients();
  }

  /**
   * ベクトル<code>x</code>と<code>y</code>の畳み込み(多項式の積)を求める 計算結果のベクトルの長さは、 <code>(length(x)+length(y)-1)</code>です。
   * 
   * @param x xデータ
   * @param y yデータ
   * @return 畳み込み(多項式の積) (comvolution)
   * @param <RS> type of real scalar
   * @param <RM> type of real matrix
   * @param <CS> type of complex scalar
   * @param <CM> type of complex matrix
   */
  public static <RS extends RealNumericalScalar<RS, RM, CS, CM>, RM extends RealNumericalMatrix<RS, RM, CS, CM>, CS extends ComplexNumericalScalar<RS, RM, CS, CM>, CM extends ComplexNumericalMatrix<RS, RM, CS, CM>> RM conv(
      RM x, RM y) {
    AnyRealPolynomial<RS, RM, CS, CM> xp = new AnyRealPolynomial<>(x);
    AnyRealPolynomial<RS, RM, CS, CM> yp = new AnyRealPolynomial<>(y);
    return xp.multiply(yp).getCoefficients();
  }

}