scipy.signal.kaiserord

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

确定凯撒窗口方法的过滤窗口参数。

此函数返回的参数通常用于使用窗口方法创建有限脉冲响应过滤,其中 firwinfirwin2

参数
ripple浮动

过滤频率响应幅度与所需过滤频率响应幅度偏差(以分贝为单位)的上限(不包括任何过渡间隔内的频率)。也就是说,如果w是用奈奎斯特频率的分数表示的频率,A(W)是过滤的实际频率响应,D(W)是期望的频率响应,则设计要求是:

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

对于0≤w<=1并且w不在过渡间隔内。

width浮动

过渡区域的宽度,经过规格化,使1对应于π弧度/样本。也就是说,频率表示为奈奎斯特频率的分数。

退货
numtaps集成

Kaiser窗口的长度。

beta浮动

Kaiser窗口的Beta参数。

注意事项

有几种方法可以获取Kaiser窗口:

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

  • signal.get_window(beta, numtaps)

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

采用了Kaiser发现的经验公式。

参考文献

Oppenheim,Schafer,“离散时间信号处理”,第475-476页。

示例

我们将使用凯撒窗方法来设计一个适用于以1,000 Hz采样的信号的低通FIR过滤。

我们希望在阻带中至少有65dB的抑制,而在通带中增益的变化不应超过0.5%。

我们希望截止频率为175 Hz,通带和阻带之间的过渡为24 Hz。就是在乐队里面, [0,163] ,增益变化不超过0.5%,并且在频带内 [187,500人] ,则信号衰减至少65dB。

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

Kaiser方法只接受单个参数来控制通带纹波和阻带抑制,因此我们使用两者中限制较多的一个。在这种情况下,通带纹波为0.005,即46.02dB,因此我们将使用65dB作为设计参数。

使用 kaiserord 以确定过滤的长度和凯撒窗口的参数。

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

使用 firwin 来创造冷杉过滤。

>>> taps = firwin(numtaps, cutoff, window=('kaiser', beta),
...               scale=False, nyq=0.5*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分贝衰减的要求被违反了约0.125分贝。这对于Kaiser窗口方法来说并不罕见。

>>> 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