/** * 1d discrete fourier transform, note that this will throw an exception if the passed in input * isn't a vector. See matlab's fft2 for more information * * @param inputC the input to transform * @return the the discrete fourier transform of the passed in input */ public static ComplexNDArray complexDiscreteFourierTransform1d(ComplexNDArray inputC) { if (inputC.shape().length != 1) throw new IllegalArgumentException("Illegal input: Must be a vector"); double len = Math.max(inputC.rows, inputC.columns); ComplexDouble c2 = new ComplexDouble(0, -2).muli(FastMath.PI).divi(len); ComplexDoubleMatrix range = MatrixUtil.complexRangeVector(0, len); ComplexDoubleMatrix matrix = exp(range.mmul(range.transpose().mul(c2))); ComplexDoubleMatrix complexRet = matrix.mmul(inputC); return ComplexNDArray.wrap(inputC, complexRet); }
/** * 1d discrete fourier transform, note that this will throw an exception if the passed in input * isn't a vector. See matlab's fft2 for more information * * @param inputC the input to transform * @return the the discrete fourier transform of the passed in input */ public static ComplexFloatMatrix complexDiscreteFourierTransform1d(ComplexFloatMatrix inputC) { if (inputC.rows != 1 && inputC.columns != 1) throw new IllegalArgumentException("Illegal input: Must be a vector"); float len = Math.max(inputC.rows, inputC.columns); ComplexFloat c2 = new ComplexFloat(0, -2).muli((float) FastMath.PI).divi(len); ComplexFloatMatrix range = MatrixUtil.complexRangeVector(0, len); ComplexFloatMatrix matrix = exp(range.mmul(range.transpose().mul(c2))); ComplexFloatMatrix complexRet = inputC.isRowVector() ? matrix.mmul(inputC) : inputC.mmul(matrix); return complexRet; }
/** * 1d inverse discrete fourier transform see matlab's fft2 for more examples. Note that this will * throw an exception if the input isn't a vector * * @param inputC the input to transform * @return the inverse fourier transform of the passed in input */ public static ComplexFloatMatrix complexInverseDisceteFourierTransform1d( ComplexFloatMatrix inputC) { if (inputC.rows != 1 && inputC.columns != 1) throw new IllegalArgumentException("Illegal input: Must be a vector"); float len = MatrixUtil.length(inputC); ComplexFloat c2 = new ComplexFloat(0, -2).muli((float) FastMath.PI).divi(len); ComplexFloatMatrix range = MatrixUtil.complexRangeVector(0, (int) len); ComplexFloatMatrix div2 = range.transpose().mul(c2); ComplexFloatMatrix div3 = range.mmul(div2).negi(); ComplexFloatMatrix matrix = exp(div3).div(len); ComplexFloatMatrix complexRet = inputC.isRowVector() ? matrix.mmul(inputC) : inputC.mmul(matrix); return complexRet; }