code: def setup(self, size, cmplx, backend):
      import scipy.fft
  
      size = list(map(int, size.split("x")))
  
      if cmplx == "cmplx":
          self.x = (
              random(size).astype(double)
              + random(size).astype(double) * 1j
          )
      else:
          self.x = random(size).astype(double)
  
      self.fftn = scipy.fft.fftn
      self.ifftn = scipy.fft.ifftn
  
      if backend == "pocketfft":
          scipy.fft.set_global_backend("scipy")
      elif backend == "pyfftw":
          if not has_pyfftw:
              raise NotImplementedError
          scipy.fft.set_global_backend(PyfftwBackend)
      elif backend == "numpy":
          from scipy.fft._debug_backends import NumPyBackend
  
          scipy.fft.set_global_backend(NumPyBackend)
      elif backend == "direct":
          import scipy.fft._pocketfft
  
          self.fftn = scipy.fft._pocketfft.fftn
          self.ifftn = scipy.fft._pocketfft.ifftn
  
imports: from numpy import arange, asarray, zeros, dot, exp, pi, double, cdouble
  from numpy.random import rand
  import numpy
  from concurrent import futures
  import os
  import scipy.fftpack
  import numpy.fft
  from .common import Benchmark, safe_import
label_desc: Use image node_id 1 for calling the FftnBackends obj's underlying member method code with example usage: obj.setup(size, cmplx, backend) without return types