Filters the samples with a digital butterworth filter

    samples   : mono samples
    filtertype: 'low', 'band', 'high'
    freq      : for low or high, the cutoff freq
                for band, (low, high)
    samplerate: the sampling-rate
    order     : the order of the butterworth filter

    Returns --> the filtered samples

    NB: calls filter_butter_coeffs to calculate the coefficients

def filter_butter(samples, samplerate, filtertype, freq, order=5):
    # type: (np.ndarray, int, str, float, int) -> np.ndarray
    """
    Filters the samples with a digital butterworth filter

    samples   : mono samples
    filtertype: 'low', 'band', 'high'
    freq      : for low or high, the cutoff freq
                for band, (low, high)
    samplerate: the sampling-rate
    order     : the order of the butterworth filter

    Returns --> the filtered samples

    NB: calls filter_butter_coeffs to calculate the coefficients
    """
    assert filtertype in ('low', 'high', 'band')
    b, a = filter_butter_coeffs(filtertype, freq, samplerate, order=order)
    return apply_multichannel(samples, lambda data:signal.lfilter(b, a, data))