/// <summary> /// Creates a 1D plan. /// </summary> /// <param name="fftType">Type of FFT.</param> /// <param name="dataType">The data type.</param> /// <param name="nx">The length in samples.</param> /// <param name="batch">The number of FFTs in batch.</param> /// <returns> /// Plan. /// </returns> public override FFTPlan1D Plan1D(eFFTType fftType, eDataType dataType, int nx, int batch) { int insize, outsize; CUFFTType cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize); //Console.WriteLine(size); IntPtr pin = fftwf.malloc(nx * insize * batch); IntPtr pout = fftwf.malloc(nx * outsize * batch); Ifftw_plan fwdPlan; Ifftw_plan invPlan; if (dataType == eDataType.Single) { if (batch == 1) { fwdPlan = fftwf_plan.dft_1d(fftType, nx, pin, pout, fftw_direction.Forward, fftw_flags.Estimate); invPlan = fftwf_plan.dft_1d(fftType, nx, pin, pout, fftw_direction.Backward, fftw_flags.Estimate); } else { fwdPlan = fftwf_plan.dft_many(fftType, 1, new int[] { nx }, batch, pin, null, 1, nx, pout, null, 1, nx, fftw_direction.Forward, fftw_flags.Estimate); invPlan = fftwf_plan.dft_many(fftType, 1, new int[] { nx }, batch, pin, null, 1, nx, pout, null, 1, nx, fftw_direction.Backward, fftw_flags.Estimate); } } else { if (batch == 1) { fwdPlan = fftw_plan.dft_1d(fftType, nx, pin, pout, fftw_direction.Forward, fftw_flags.Estimate); invPlan = fftw_plan.dft_1d(fftType, nx, pin, pout, fftw_direction.Backward, fftw_flags.Estimate); } else { fwdPlan = fftw_plan.dft_many(fftType, 1, new int[] { nx }, batch, pin, null, 1, nx, pout, null, 1, nx, fftw_direction.Forward, fftw_flags.Estimate); invPlan = fftw_plan.dft_many(fftType, 1, new int[] { nx }, batch, pin, null, 1, nx, pout, null, 1, nx, fftw_direction.Backward, fftw_flags.Estimate); } } FFTPlan1D plan = new FFTPlan1D(nx, batch, this); FFTPlan1DEx planEx = new FFTPlan1DEx(plan) { FFTWFwdPlan = fwdPlan, FFTWInvPlan = invPlan, N = nx, DataType = dataType }; Plans.Add(plan, planEx); return(plan); }
/// <summary> /// Creates a 1D plan. /// </summary> /// <param name="fftType">Type of FFT.</param> /// <param name="dataType">Data type.</param> /// <param name="nx">The length in samples.</param> /// <param name="batchSize">The number of FFTs in batch.</param> /// <returns>Plan.</returns> public override FFTPlan1D Plan1D(eFFTType fftType, eDataType dataType, int nx, int batchSize) { int insize, outsize; CUFFTType cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize); cufftHandle handle = new cufftHandle(); CUFFTResult res; if (batchSize <= 1) { res = _driver.cufftPlan1d(ref handle, nx, cuFFTType, batchSize); } else { res = _driver.cufftPlanMany(ref handle, 1, new int[] { nx }, null, //inembed 1, //istride 1 0, //idist 0 null, //onembed 1, //ostride 1 0, //odist 0 cuFFTType, batchSize); } if (res != CUFFTResult.Success) { throw new CudafyHostException(res.ToString()); } FFTPlan1D plan = new FFTPlan1D(nx, batchSize, this); FFTPlan1DEx planEx = new FFTPlan1DEx(plan) { CudaFFTHandle = handle, CudaFFTType = cuFFTType, DataType = dataType }; Plans.Add(plan, planEx); return(plan); }
public FFTPlan1DEx(FFTPlan1D plan) { Plan = plan; }