scipy.signal.

kaiserord#

scipy.signal.kaiserord(ripple, width)[源代码]#

确定 Kaiser 窗方法的滤波器窗口参数。

此函数返回的参数通常用于使用窗口方法创建有限脉冲响应滤波器,可以使用 firwinfirwin2

参数:
ripplefloat

滤波器幅频响应与其期望频率响应的偏差(以 dB 为单位)的上限(不包括任何过渡区间中的频率)。即,如果 w 是以奈奎斯特频率的一小部分表示的频率,A(w) 是滤波器的实际频率响应,D(w) 是期望的频率响应,则设计要求是

abs(A(w) - D(w))) < 10**(-ripple/20)

当 0 <= w <= 1,且 w 不在过渡区间内时。

widthfloat

过渡区域的宽度,归一化使得 1 对应于 pi 弧度/采样。即,频率以奈奎斯特频率的一小部分表示。

返回:
numtapsint

Kaiser 窗的长度。

betafloat

Kaiser 窗的 beta 参数。

另请参见

kaiser_beta, kaiser_atten

笔记

有多种方法可以获取海萨窗

  • signal.windows.kaiser(numtaps, beta, sym=True)

  • signal.get_window(beta, numtaps)

  • signal.get_window(('kaiser', beta), numtaps)

使用凯撒发现的经验方程式。

参考

Oppenheim, Schafer, “Discrete-Time Signal Processing”,第 475-476 页。

示例

我们将使用凯撒窗方法为采样频率为 1000 Hz 的信号设计低通 FIR 滤波器。

我们希望在截止带中至少衰减 65 dB,而在通带中,增益变化不超过 0.5%。

我们希望截止频率为 175 Hz,通带和截止带的过渡频率为 24 Hz。也就是说,在 [0, 163] 频段,增益变化不超过 0.5%,而在 [187, 500] 频段,信号至少衰减 65 dB。

>>> import numpy as np
>>> from scipy.signal import kaiserord, firwin, freqz
>>> import matplotlib.pyplot as plt
>>> fs = 1000.0
>>> cutoff = 175
>>> width = 24

凯撒方法只接受一个单独的参数来控制通带纹波和截止带衰减,所以我们使用这两个限制中较大的一个。在这种情况下,通带纹波为 0.005 或 46.02 dB,因此我们将使用 65 dB 作为设计参数。

使用 kaiserord 确定滤波器长度和凯撒窗的参数。

>>> numtaps, beta = kaiserord(65, width/(0.5*fs))
>>> numtaps
167
>>> beta
6.20426

使用 firwin 创建 FIR 滤波器。

>>> taps = firwin(numtaps, cutoff, window=('kaiser', beta),
...               scale=False, fs=fs)

计算滤波器的频率响应。 w 是频率数组, h 是对应的复杂频率响应数组。

>>> w, h = freqz(taps, worN=8000)
>>> w *= 0.5*fs/np.pi  # Convert w to Hz.

计算滤波器响应幅值与理想低通滤波器响应幅值的偏差。过渡区域的值设置为 nan,因此不会出现在图中。

>>> ideal = w < cutoff  # The "ideal" frequency response.
>>> deviation = np.abs(np.abs(h) - ideal)
>>> deviation[(w > cutoff - 0.5*width) & (w < cutoff + 0.5*width)] = np.nan

绘制偏差。仔细观察截止带的左端,会发现对第一个波瓣的 65 dB 衰减要求被违反了大约 0.125 dB。这对于凯撒窗方法来说并不罕见。

>>> plt.plot(w, 20*np.log10(np.abs(deviation)))
>>> plt.xlim(0, 0.5*fs)
>>> plt.ylim(-90, -60)
>>> plt.grid(alpha=0.25)
>>> plt.axhline(-65, color='r', ls='--', alpha=0.3)
>>> plt.xlabel('Frequency (Hz)')
>>> plt.ylabel('Deviation from ideal (dB)')
>>> plt.title('Lowpass Filter Frequency Response')
>>> plt.show()
../../_images/scipy-signal-kaiserord-1.png