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;
}
}