private static int R2rLength(int n, FftwR2rKind kind) { switch (kind) { case FftwR2rKind.FFTW_R2HC: case FftwR2rKind.FFTW_HC2R: case FftwR2rKind.FFTW_DHT: return(n); case FftwR2rKind.FFTW_REDFT00: return(2 * (n - 1)); case FftwR2rKind.FFTW_REDFT10: case FftwR2rKind.FFTW_REDFT01: case FftwR2rKind.FFTW_REDFT11: return(2 * n); case FftwR2rKind.FFTW_RODFT00: return(2 * (n + 1)); case FftwR2rKind.FFTW_RODFT10: case FftwR2rKind.FFTW_RODFT01: case FftwR2rKind.FFTW_RODFT11: return(2 * n); default: throw new ArgumentException("Real to real transform kind must be one of allowed values in " + "FftwR2rKind enum.", nameof(kind)); } }
public static FftwPlan DftR2r3D(int n0, int n1, int n2, out FftwArray inArray, out FftwArray outArray, FftwR2rKind kind0, FftwR2rKind kind1, FftwR2rKind kind2, FftwFlags flags = FftwFlags.FFTW_MEASURE) { int length = R2rLength(n0, n1, n2, kind0, kind1, kind2); inArray = new FftwArray(length); outArray = new FftwArray(length); return(DftR2r3D(n0, n1, n2, inArray, outArray, kind0, kind1, kind2, flags)); }
public static FftwPlan DftR2r3D(int n0, int n1, int n2, FftwArray inArray, FftwArray outArray, FftwR2rKind kind0, FftwR2rKind kind1, FftwR2rKind kind2, FftwFlags flags = FftwFlags.FFTW_MEASURE) { int length = R2rLength(n0, n1, n2, kind0, kind1, kind2); ValidateArray(inArray, length, nameof(inArray)); ValidateArray(outArray, length, nameof(outArray)); return(new FftwPlan(flags, fftw_plan_r2r_3d(n0, n1, n2, inArray.Pointer, outArray.Pointer, kind0, kind1, kind2, (uint_t)flags), inArray, outArray)); }
public static extern fftw_plan fftw_plan_r2r_3d( int_t n0, int_t n1, int_t n2, double_ptr in_ptr, double_ptr out_ptr, FftwR2rKind kind0, FftwR2rKind kind1, FftwR2rKind kind2, uint_t flags);
public static extern fftw_plan fftw_plan_r2r_1d( int_t n0, double_ptr in_ptr, double_ptr out_ptr, FftwR2rKind kind0, uint_t flags);
public static FftwPlan DftR2r2D(int n0, int n1, out FftwArray ioArray, FftwR2rKind kind0, FftwR2rKind kind1, FftwFlags flags = FftwFlags.FFTW_MEASURE) { ioArray = new FftwArray(R2rLength(n0, n1, kind0, kind1)); return(DftR2r2D(n0, n1, ioArray, ioArray, kind0, kind1, flags)); }
private static int R2rLength(int n0, int n1, int n2, FftwR2rKind kind0, FftwR2rKind kind1, FftwR2rKind kind2) => R2rLength(n0, kind0) * R2rLength(n1, kind1) * R2rLength(n2, kind2);