Фильтры Баттерворта выглядят очень странно в порядке возрастания - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь разработать простой полосовой фильтр Баттерворта в SciPy и получаю некоторые странные результаты.

import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt

def butter_bandpass(lowcut, highcut, fs, freqs,order=3, label=None):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    sos = signal.butter(order, [low, high], btype='band', output='sos')

    w, h = signal.sosfreqz(sos,worN=freqs,whole=True,fs=fs)

    return w,h

freqs = 650

for i in np.arange(1,10):
    w,h = butter_bandpass(0.01, 0.1, fs=1/0.68, freqs=freqs, order=i)
    plt.plot(h)

Это дает странные результаты, как видно на изображении ниже (фильтры Баттерворта порядка 1-10). Я думал, что фильтр должен становиться все более прямым angular по мере увеличения порядка?

enter image description here

Кто-нибудь знает, как создать простой фильтр Баттерворта в SciPy?

1 Ответ

3 голосов
/ 20 июня 2020

Частотная характеристика фильтра Баттерворта не является действительной. При построении комплексного ответа с использованием plt.plot() отображается только реальный компонент. Вы должны увидеть предупреждение:

ComplexWarning: Casting complex values to real discards the imaginary part

Чтобы проверить усиление фильтра, постройте амплитуду частотной характеристики:

plt.plot(np.abs(h))

Как и ожидалось, вы увидите все более квадратный ответ:

output of OP's code with small change proposed here

...