scipy.signal.

firwin_2d#

scipy.signal.firwin_2d(hsize, window, *, fc=None, fs=2, circular=False, pass_zero=True, scale=True)[source]#

使用窗函数法设计二维 FIR 滤波器。

此函数计算二维有限脉冲响应滤波器的系数。该滤波器是具有线性相位的可分离滤波器;它将被设计为两个一维滤波器的乘积,其维度由 hsize 定义。此外,它可以创建近似圆对称的二维窗函数。

参数:
hsize长度为 2 的元组或列表

滤波器在每个维度上的长度。hsize[0] 指定行方向的系数数量,hsize[1] 指定列方向的系数数量。

window长度为 2 的元组或列表,或字符串

用于每个一维滤波器的期望窗函数,或用于创建圆对称二维窗函数的单一窗函数类型。每个元素应为字符串或字符串和参数值的元组。有关窗函数列表和所需参数,请参阅 get_window

fc浮点数或一维类数组,可选

滤波器截止频率,单位与 fs 相同。这定义了低通或高通滤波器中,滤波器增益降至约 -6 dB(半功率)的频率。对于多频带滤波器,fc 可以是截止频率(即频带边缘)数组,范围为 [0, fs/2],每个频带以对形式指定。circular 为 False 时必需。

fs浮点数,可选

信号的采样频率。默认为 2。

circular布尔值,可选

是否创建圆对称二维窗函数。默认为 False

pass_zero{True, False, ‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’},可选

此参数直接传递给每个标量频率轴的 firwin。因此,如果为 True,则 DC 增益,即频率 (0, 0) 处的增益为 1。如果为 False,则当 circularTrue 时,频率 (0, 0) 处的 DC 增益为 0。如果 circularFalse,则频率 (0, f1) 和 (f0, 0) 将具有 0 增益。它也可以是所需滤波器类型的字符串参数(等同于 IIR 设计函数中的 btype)。

scale布尔值,可选

此参数直接传递给每个标量频率轴的 firwin。设置为 True 以按比例缩放系数,使频率响应在某个频率轴上的特定频率处恰好为单位增益。该频率为

  • 如果第一个通带从 0 开始(即 pass_zero 为 True),则为 0 (DC)

  • 如果第一个通带在 fs/2 结束(即滤波器是单频带高通滤波器),则为 fs/2(奈奎斯特频率);否则为第一个通带的中心

返回:
filter_2d(hsize[0], hsize[1]) ndarray

二维 FIR 滤波器的系数。

引发:
ValueError
  • 如果 hsizewindow 不是两个元素的元组或列表。

  • 如果 circular 为 True 时 cutoff 为 None。

  • 如果 circularFalsecutoff 超出范围 [0, fs/2]。

  • 如果 window 中的任何元素无法识别。

RuntimeError

如果 firwin 在设计滤波器时未能收敛。

另请参阅

firwin

使用窗函数法设计一维数组的 FIR 滤波器。

get_window

返回给定长度和类型的窗函数。

示例

生成一个截止频率为 0.1 的 5x5 低通滤波器

>>> import numpy as np
>>> from scipy.signal import get_window
>>> from scipy.signal import firwin_2d
>>> hsize = (5, 5)
>>> window = (("kaiser", 5.0), ("kaiser", 5.0))
>>> fc = 0.1
>>> filter_2d = firwin_2d(hsize, window, fc=fc)
>>> filter_2d
array([[0.00025366, 0.00401662, 0.00738617, 0.00401662, 0.00025366],
       [0.00401662, 0.06360159, 0.11695714, 0.06360159, 0.00401662],
       [0.00738617, 0.11695714, 0.21507283, 0.11695714, 0.00738617],
       [0.00401662, 0.06360159, 0.11695714, 0.06360159, 0.00401662],
       [0.00025366, 0.00401662, 0.00738617, 0.00401662, 0.00025366]])

生成一个使用 Hamming 窗函数的圆对称 5x5 低通滤波器

>>> filter_2d = firwin_2d((5, 5), 'hamming', fc=fc, circular=True)
>>> filter_2d
array([[-0.00020354, -0.00020354, -0.00020354, -0.00020354, -0.00020354],
       [-0.00020354,  0.01506844,  0.09907658,  0.01506844, -0.00020354],
       [-0.00020354,  0.09907658, -0.00020354,  0.09907658, -0.00020354],
       [-0.00020354,  0.01506844,  0.09907658,  0.01506844, -0.00020354],
       [-0.00020354, -0.00020354, -0.00020354, -0.00020354, -0.00020354]])

生成比较两个一维滤波器乘积与圆对称滤波器的图

>>> import matplotlib.pyplot as plt
>>> hsize, fc = (50, 50), 0.05
>>> window = (("kaiser", 5.0), ("kaiser", 5.0))
>>> filter0_2d = firwin_2d(hsize, window, fc=fc)
>>> filter1_2d = firwin_2d((50, 50), 'hamming', fc=fc, circular=True)
...
>>> fg, (ax0, ax1) = plt.subplots(1, 2, tight_layout=True, figsize=(6.5, 3.5))
>>> ax0.set_title("Product of 2 Windows")
>>> im0 = ax0.imshow(filter0_2d, cmap='viridis', origin='lower', aspect='equal')
>>> fg.colorbar(im0, ax=ax0, shrink=0.7)
>>> ax1.set_title("Circular Window")
>>> im1 = ax1.imshow(filter1_2d, cmap='plasma', origin='lower', aspect='equal')
>>> fg.colorbar(im1, ax=ax1, shrink=0.7)
>>> plt.show()
../../_images/scipy-signal-firwin_2d-1.png