【问题标题】:band pass filter ValueError: Digital filter critical frequencies must be 0 < Wn < 1带通滤波器 ValueError:数字滤波器临界频率必须为 0 < Wn < 1
【发布时间】:2018-10-13 04:56:46
【问题描述】:

我正在尝试对心电图信号使用带通滤波器, 这是代码:

from scipy.signal import butter

def bandpass_filter(self, data, lowcut, highcut, signal_freq, filter_order):
        nyquist_freq = 0.5 * signal_freq
        low = lowcut / nyquist_freq
        high = highcut / nyquist_freq
        b, a = butter(filter_order, [low, high], btype='band', analog=False)
        y = lfilter(b,a, data)
        return y

def detect_peaks(self):
    self.filtered_ecg_measurements = self.bandpass_filter(ecg_measurements,
                                         lowcut=self.filter_lowcut,
                                         highcut=self.filter_highcut,
                                         signal_freq=self.signal_frequency,
                                         filter_order=self.filter_order)
    self.signal_frequency = 250  
    self.filter_lowcut = 0.0
    self.filter_highcut = 15.0
    self.filter_order = 1

每次尝试运行此功能时都会出现此错误:

Traceback (most recent call last):
  File "D:/Project/code/untitled/test.py", line 297, in <module>
    log_data=True, plot_data=True, show_plot=False)
  File "D:/Project/code/untitled/test.py", line 98, in __init__
    self.detect_peaks()
  File "D:/Project/code/untitled/test.py", line 135, in detect_peaks
    filter_order=self.filter_order)
  File "D:/Project/code/untitled/test.py", line 256, in bandpass_filter
    b, a = butter(filter_order, [low, high], btype='band', analog=False)
  File "C:\Users\AppData\Roaming\Python\Python36\site-packages\scipy\signal\filter_design.py", line 2394, in butter
    output=output, ftype='butter')
  File "C:\Users\AppData\Roaming\Python\Python36\site-packages\scipy\signal\filter_design.py", line 1959, in iirfilter
    raise ValueError("Digital filter critical frequencies "
ValueError: Digital filter critical frequencies must be 0 < Wn < 1

错误文本是:

数字滤波器临界频率必须为 0

【问题讨论】:

  • 至少其中一项是错误的self.filter_lowcut, self.filter_highcut, self.signal_frequency
  • 这些是值:self.filter_lowcut = 0.0 self.filter_highcut = 15.0 self.filter_order = 1 self.signal_frequency = 250
  • lowcut 不能为零。

标签: python python-3.x signals bandpass-filter


【解决方案1】:

可能是参数fs的输入。它必须大于 2 * Wn 中的任何一个。 如 scipy/signal/filter_design.py 源代码:

if fs is not None:
    if analog:
        raise ValueError("fs cannot be specified for an analog filter")
    Wn = 2*Wn/fs

后来:

if not analog:
    if numpy.any(Wn <= 0) or numpy.any(Wn >= 1):
        raise ValueError("Digital filter critical frequencies must be 0 < Wn < 1")

【讨论】:

    【解决方案2】:

    scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba')

    Wn : array_like

    给出临界频率的标量或长度为 2 的序列。对于巴特沃斯滤波器,这是增益下降到通带增益的 1/sqrt(2) 的点(“-3 dB 点”)。 对于数字滤波器,Wn 从 0 归一化到 1,其中 1 是奈奎斯特频率,pi 弧度/样本。 (因此,Wn 在半周期/样本中。) 对于模拟滤波器,Wn 是角频率(例如 rad/s)。

    您的例外是这里的低/高不是 [0,1]

    b, a = butter(filter_order, [low, high], btype='band', analog=False)
    

    对于filter_type == 1Wn 是浮点数而不是 nparray。

    https://github.com/scipy/scipy/blob/v0.19.1/scipy/signal/filter_design.py#L2226-L2297

    >>> N, Wn = signal.buttord([20, 50], [14, 60], 3, 40, True)
    >>> b, a = signal.butter(N, Wn, 'band', True)
    

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 2016-02-08
      • 2015-09-12
      • 2010-10-23
      • 2013-08-22
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多