Fftshift.java

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

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.IntMatrix;


/**
 * FFTシフトを計算するクラスです。
 * 
 * <p>FFT Shift
 * 
 * @author koga
 * @version $Revision: 1.5 $
 */
public class Fftshift {

  /**
   * もし <code>X</code> がベクトルなら、前半と後半を入れ替えた ベクトルを返します。
   * 
   * <p>もし <code>X</code> が行列なら、第1象限と第3象限、 第2象限と第4象限を入れ替えた行列を返します。
   * 
   * @param X データ
   * @return FFTシフトの結果 (shifted result)
   */
  public static DoubleMatrix fftshift(DoubleMatrix X) {
    int m = X.getRowSize();
    int n = X.getColumnSize();
    int m2 = (m + 1) / 2;
    int n2 = (n + 1) / 2;

    IntMatrix idx1 = IntMatrix.series(1, m2);
    IntMatrix idx2 = IntMatrix.series(m2 + 1, m);
    IntMatrix idy1 = IntMatrix.series(1, n2);
    IntMatrix idy2 = IntMatrix.series(n2 + 1, n);

    DoubleMatrix Y;
    if (m == 1) {
      Y = X.getSubVector(idy2).appendRight(X.getSubVector(idy1));
    } else if (n == 1) {
      Y = X.getSubVector(idx2).appendDown(X.getSubVector(idx1));
    } else {
      Y = Matrix4.matrix4(X.getSubMatrix(idx2, idy2), X.getSubMatrix(idx2, idy1), X.getSubMatrix(idx1, idy2), X.getSubMatrix(idx1, idy1));
    }

    return Y;
  }

}