signal.butter bandpass error: Критические частоты цифрового фильтра должны быть 0 ‹ Wn ‹ 1

Я пытался использовать функцию масла scipy, и она отлично работала, когда я пытался получить коэффициенты нижних частот:

from scipy import signal
[b, a] = signal.butter(10, 0.3)

Я строго хочу создать полосу пропускания для 0,5 Гц - 5 Гц, но когда я пытаюсь получить коэффициенты полосы пропускания в следующем коде, это дает мне ошибку: ValueError: Digital filter critical frequencies must be 0 < Wn < 1

from scipy import signal

[b, a] = signal.butter(2, [0.5,5], btype='bandpass')

Я нашел следующий вопрос о переполнении стека: /a>, но я все еще не уверен в этой проблеме и следовал требованиям по использованию функции signal.butter из документации.


person lionheart    schedule 07.09.2020    source источник


Ответы (1)


По умолчанию для цифрового фильтра значения, заданные для Wn, должны быть выражены в долях частоты Найквиста, что составляет половину частоты дискретизации. Либо масштабируйте значения самостоятельно, либо укажите частоту дискретизации, также указав аргумент fs, как в следующем примере.

In [36]: from scipy import signal

In [37]: order = 2

In [38]: fs = 128.0  # Sample rate, in Hz                                             

In [39]: Wn = [0.5, 5.0]  # Filter cutoff frequencies, in Hz                                      

In [40]: b, a = signal.butter(order, Wn, btype='bandpass', fs=fs)                                     

In [41]: b                                                                                                           
Out[41]: array([ 0.01051921,  0.        , -0.02103843,  0.        ,  0.01051921])

In [42]: a                                                                                                           
Out[42]: array([ 1.        , -3.67848002,  5.09032297, -3.14352142,  0.73170972])
person Warren Weckesser    schedule 07.09.2020