def sine_psd(data, delta, number_of_tapers=None, number_of_iterations=2,
             degree_of_smoothing=1.0, statistics=False, verbose=False):
    if verbose is True:
        verbose = C.byref(C.c_char('y'))
    else:
        verbose = None
    if number_of_tapers is None:
        number_of_tapers = 0
    mt = _MtspecType("float32")
    data = np.require(data, dtype=mt.float, requirements=[mt.order])
    npts = len(data)
    number_of_frequency_bins = int(npts / 2) + 1
    frequency_bins = mt.empty(number_of_frequency_bins)
    spectrum = mt.empty(number_of_frequency_bins)
    if statistics is True:
        tapers_per_freq_point = np.empty(number_of_frequency_bins,
                                         dtype='int32', order=mt.order)
        tapers_per_freq_point_p = \
            tapers_per_freq_point.ctypes.data_as(C.POINTER(C.c_int))
        errors = mt.empty((number_of_frequency_bins, 2))
    else:
        tapers_per_freq_point_p = errors = None
    mtspeclib.sine_psd_(
        C.byref(C.c_int(npts)),
        C.byref(C.c_float(delta)), mt.p(data),
        C.byref(C.c_int(number_of_tapers)),
        C.byref(C.c_int(number_of_iterations)),
        C.byref(C.c_float(degree_of_smoothing)),
        C.byref(C.c_int(number_of_frequency_bins)),
        mt.p(frequency_bins), mt.p(spectrum),
        tapers_per_freq_point_p, mt.p(errors), verbose)
    return_values = [spectrum, frequency_bins]
    if statistics is True:
        return_values.extend([errors, tapers_per_freq_point])
    return return_values