/** * Discrete fourier transform 2d * * @param input the input to transform * @param rows the number of rows in the transformed output matrix * @param cols the number of columns in the transformed output matrix * @return the discrete fourier transform of the input */ public static ComplexDoubleMatrix complexDisceteFourierTransform( DoubleMatrix input, int rows, int cols) { ComplexDoubleMatrix base; // pad if (input.rows < rows || input.columns < cols) base = MatrixUtil.complexPadWithZeros(input, rows, cols); // truncation else if (input.rows > rows || input.columns > cols) { base = new ComplexDoubleMatrix(input); base = base.get( MatrixUtil.toIndices(RangeUtils.interval(0, rows)), MatrixUtil.toIndices(RangeUtils.interval(0, cols))); } else base = new ComplexDoubleMatrix(input); ComplexDoubleMatrix temp = new ComplexDoubleMatrix(base.rows, base.columns); ComplexDoubleMatrix ret = new ComplexDoubleMatrix(base.rows, base.columns); for (int i = 0; i < base.columns; i++) { ComplexDoubleMatrix column = base.getColumn(i); temp.putColumn(i, complexDiscreteFourierTransform1d(column)); } for (int i = 0; i < ret.rows; i++) { ComplexDoubleMatrix row = temp.getRow(i); ret.putRow(i, complexDiscreteFourierTransform1d(row)); } return ret; }