<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fft(xi, yi, axis=0) -> tuple: """Take the 1D FFT of an N-dimensional array and return "sensible" properly shifted arrays. Parameters xi : numpy.ndarray 1D array over which the points to be FFT'ed are defined yi : numpy.ndarray ND array with values to FFT axis : int axis of yi to perform FFT over Returns ------- xi : 1D numpy.ndarray 1D array. Conjugate to input xi. Example: if input xi is in the time domain, output xi is in frequency domain. yi : ND numpy.ndarray FFT. Has the same shape as the input array (yi). """

    # xi must be 1D
    if xi.ndim != 1:
        raise wt_exceptions.DimensionalityError(1, xi.ndim)
    # xi must be evenly spaced
    spacing = np.diff(xi)
    if not np.allclose(spacing, spacing.mean()):
        raise RuntimeError("WrightTools.kit.fft: argument xi must be evenly spaced")
    # fft
    yi = np.fft.fft(yi, axis=axis)
    d = (xi.max() - xi.min()) / (xi.size - 1)
    xi = np.fft.fftfreq(xi.size, d=d)
    # shift
    xi = np.fft.fftshift(xi)
    yi = np.fft.fftshift(yi, axes=axis)
    return xi, yi