sig
  exception Wrong_layout
  type layout = Real | Halfcomplex | Halfcomplex_rad2 | Complex
  type fft_array = { mutable layout : Gsl_fft.layout; data : float array; }
  module Real :
    sig
      type workspace
      type wavetable
      val make_workspace : int -> Gsl_fft.Real.workspace
      val make_wavetable : int -> Gsl_fft.Real.wavetable
      external transform :
        ?stride:int ->
        Gsl_fft.fft_array ->
        Gsl_fft.Real.wavetable -> Gsl_fft.Real.workspace -> unit
        = "ml_gsl_fft_real_transform"
      external transform_rad2 : ?stride:int -> Gsl_fft.fft_array -> unit
        = "ml_gsl_fft_real_radix2_transform"
      val unpack : ?stride:int -> Gsl_fft.fft_array -> Gsl_fft.fft_array
    end
  module Halfcomplex :
    sig
      type wavetable
      val make_wavetable : int -> Gsl_fft.Halfcomplex.wavetable
      external transform :
        ?stride:int ->
        Gsl_fft.fft_array ->
        Gsl_fft.Halfcomplex.wavetable -> Gsl_fft.Real.workspace -> unit
        = "ml_gsl_fft_halfcomplex_transform"
      external transform_rad2 : ?stride:int -> Gsl_fft.fft_array -> unit
        = "ml_gsl_fft_halfcomplex_radix2_transform"
      external backward :
        ?stride:int ->
        Gsl_fft.fft_array ->
        Gsl_fft.Halfcomplex.wavetable -> Gsl_fft.Real.workspace -> unit
        = "ml_gsl_fft_halfcomplex_backward"
      external backward_rad2 : ?stride:int -> Gsl_fft.fft_array -> unit
        = "ml_gsl_fft_halfcomplex_radix2_backward"
      external inverse :
        ?stride:int ->
        Gsl_fft.fft_array ->
        Gsl_fft.Halfcomplex.wavetable -> Gsl_fft.Real.workspace -> unit
        = "ml_gsl_fft_halfcomplex_inverse"
      external inverse_rad2 : ?stride:int -> Gsl_fft.fft_array -> unit
        = "ml_gsl_fft_halfcomplex_radix2_inverse"
      val unpack : ?stride:int -> Gsl_fft.fft_array -> Gsl_fft.fft_array
    end
  module Complex :
    sig
      type workspace
      type wavetable
      type direction = Forward | Backward
      val make_workspace : int -> Gsl_fft.Complex.workspace
      val make_wavetable : int -> Gsl_fft.Complex.wavetable
      external forward :
        ?stride:int ->
        Gsl_complex.complex_array ->
        Gsl_fft.Complex.wavetable -> Gsl_fft.Complex.workspace -> unit
        = "ml_gsl_fft_complex_forward"
      external forward_rad2 :
        ?dif:bool -> ?stride:int -> Gsl_complex.complex_array -> unit
        = "ml_gsl_fft_complex_rad2_forward"
      external transform :
        ?stride:int ->
        Gsl_complex.complex_array ->
        Gsl_fft.Complex.wavetable ->
        Gsl_fft.Complex.workspace -> Gsl_fft.Complex.direction -> unit
        = "ml_gsl_fft_complex_transform"
      external transform_rad2 :
        ?dif:bool ->
        ?stride:int ->
        Gsl_complex.complex_array -> Gsl_fft.Complex.direction -> unit
        = "ml_gsl_fft_complex_rad2_transform"
      external backward :
        ?stride:int ->
        Gsl_complex.complex_array ->
        Gsl_fft.Complex.wavetable -> Gsl_fft.Complex.workspace -> unit
        = "ml_gsl_fft_complex_backward"
      external backward_rad2 :
        ?dif:bool -> ?stride:int -> Gsl_complex.complex_array -> unit
        = "ml_gsl_fft_complex_rad2_backward"
      external inverse :
        ?stride:int ->
        Gsl_complex.complex_array ->
        Gsl_fft.Complex.wavetable -> Gsl_fft.Complex.workspace -> unit
        = "ml_gsl_fft_complex_inverse"
      external inverse_rad2 :
        ?dif:bool -> ?stride:int -> Gsl_complex.complex_array -> unit
        = "ml_gsl_fft_complex_rad2_inverse"
    end
  val unpack : Gsl_fft.fft_array -> Gsl_complex.complex_array
  val hc_mult : Gsl_fft.fft_array -> Gsl_fft.fft_array -> unit
  val hc_mult_rad2 : Gsl_fft.fft_array -> Gsl_fft.fft_array -> unit
end