public override float[] FFTForward(float[] signal, int startIndex, int length)
        {
            IntPtr input   = GetInput(length);
            IntPtr output  = GetOutput(length);
            IntPtr fftPlan = GetFFTPlan(length, input, output);

            float[] applyTo = new float[length];
            Array.Copy(signal, startIndex, applyTo, 0, length);
            Marshal.Copy(applyTo, 0, input, length);
            FFTWNativeMethods.execute(fftPlan);
            float[] result = new float[length * 2];
            Marshal.Copy(output, result, 0, length);
            FreeUnmanagedMemory(input);
            FreeUnmanagedMemory(output);
            FreePlan(fftPlan);
            return(result);
        }
 public override void Execute(IntPtr fftPlan)
 {
     FFTWNativeMethods.execute(fftPlan);
 }
 public override void FreeUnmanagedMemory(IntPtr memoryBlock)
 {
     FFTWNativeMethods.free(memoryBlock);
 }
 public override void FreePlan(IntPtr fftPlan)
 {
     FFTWNativeMethods.destroy_plan(fftPlan);
 }
 public override IntPtr GetInput(int length)
 {
     return(FFTWNativeMethods.malloc(4 * length));
 }