Jak zaimplementować pasmowy filtr Butterwortha z Scipy.signal.butter

AKTUALIZACJA:

Znalazłem przepis Scipy oparty na tym pytaniu! Więc dla każdego zainteresowanego przejdź bezpośrednio do:Spis treści »Przetwarzanie sygnału» Butterworth Bandpass

Trudno mi osiągnąć to, co wydawało się początkowo prostym zadaniem wdrożenia filtra pasmowego Butterwortha dla tablicy 1-D numpy (szereg czasowy).

Parametry, które muszę uwzględnić to: sample_rate, cutoff frequency IN HERTZ i ewentualnie kolejność (inne parametry, takie jak tłumienie, naturalna częstotliwość itp. Są dla mnie bardziej niejasne, więc każda „domyślna” wartość by to zrobiła).

Mam teraz to, co wydaje się działać jak filtr górnoprzepustowy, ale nie jestem pewien, czy robię to dobrze:

def butter_highpass(interval, sampling_rate, cutoff, order=5):
    nyq = sampling_rate * 0.5

    stopfreq = float(cutoff)
    cornerfreq = 0.4 * stopfreq  # (?)

    ws = cornerfreq/nyq
    wp = stopfreq/nyq

    # for bandpass:
    # wp = [0.2, 0.5], ws = [0.1, 0.6]

    N, wn = scipy.signal.buttord(wp, ws, 3, 16)   # (?)

    # for hardcoded order:
    # N = order

    b, a = scipy.signal.butter(N, wn, btype='high')   # should 'high' be here for bandpass?
    sf = scipy.signal.lfilter(b, a, interval)
    return sf

Dokumenty i przykłady są mylące i niejasne, ale chciałbym zaimplementować formularz przedstawiony w poleceniu oznaczonym jako „dla bandpassa”. Znaki zapytania w komentarzach pokazują, gdzie po prostu skopiowałem i wkleiłem przykład, nie rozumiejąc, co się dzieje.

Nie jestem inżynierem elektrykiem ani naukowcem, tylko projektantem sprzętu medycznego, który musi wykonać dość proste filtrowanie pasmowe na sygnałach EMG.

questionAnswers(3)

yourAnswerToTheQuestion