Converts the data from 2D fourier space signal to a 1D time-series.

  fcdata: Complex fourier spectrum as a 2D array, The axis=0 is for each "half frame", and axis=1 contains the
  fourier-space data for that half frame. Typically there are 129 "half frames" in the data. 
  Furthermore, it's assumed that fftshift has placed the central frequency at the center of axis=1.

  norm: None or "ortho" -- see Numpy FFT Normalization documentation. Default is None.

  Usage:

    aca = ibmseti.compamp.Compamp(raw_data)
    cdata = aca.complex_data()  #cdata is a 3D numpy array in the time domain.
    #can manipulate cdata in time-space if desired (use various windowing functions, for example)
    fcdata = ibmseti.dsp.complex_to_fourier(cdata, aca.header()['over_sampling'])
    fcdata_2d = ibmseti.dsp.reshape_to_2d(fcdata)
    tcdata_1d = ibmseti.dsp.fourier_to_time(fcdata_2d)


  One can recover the Fourier Spectrum of cdata_1d by:

    cdata_2d = cdata_1d.reshape(aca.header()['number_of_half_frames'], int(aca.header()['number_of_subbands'] * ibmseti.constants.bins_per_half_frame*(1 - aca.header()['over_sampling'])))
    fcdata_2d_v2 = np.fft.fftshift(np.fft.fft(cdata_2d), 1)

    #fcdata_2d_v2 and fcdata_2d should be the same
    np.sum(np.sum(fcdata_2d - fcdata_2d_v2))  # should equal to approximately 0

def fourier_to_time(fcdata, norm=None):
  '''
  Converts the data from 2D fourier space signal to a 1D time-series.

  fcdata: Complex fourier spectrum as a 2D array, The axis=0 is for each "half frame", and axis=1 contains the
  fourier-space data for that half frame. Typically there are 129 "half frames" in the data. 
  Furthermore, it's assumed that fftshift has placed the central frequency at the center of axis=1.

  norm: None or "ortho" -- see Numpy FFT Normalization documentation. Default is None.

  Usage:

    aca = ibmseti.compamp.Compamp(raw_data)
    cdata = aca.complex_data()  #cdata is a 3D numpy array in the time domain.
    #can manipulate cdata in time-space if desired (use various windowing functions, for example)
    fcdata = ibmseti.dsp.complex_to_fourier(cdata, aca.header()['over_sampling'])
    fcdata_2d = ibmseti.dsp.reshape_to_2d(fcdata)
    tcdata_1d = ibmseti.dsp.fourier_to_time(fcdata_2d)


  One can recover the Fourier Spectrum of cdata_1d by:

    cdata_2d = cdata_1d.reshape(aca.header()['number_of_half_frames'], int(aca.header()['number_of_subbands'] * ibmseti.constants.bins_per_half_frame*(1 - aca.header()['over_sampling'])))
    fcdata_2d_v2 = np.fft.fftshift(np.fft.fft(cdata_2d), 1)

    #fcdata_2d_v2 and fcdata_2d should be the same
    np.sum(np.sum(fcdata_2d - fcdata_2d_v2))  # should equal to approximately 0

  '''

  return np.fft.ifft(np.fft.ifftshift(fcdata, 1),norm=norm).reshape(fcdata.shape[0] * fcdata.shape[1])