当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy signal.kaiserord用法及代码示例


本文简要介绍 python 语言中 scipy.signal.kaiserord 的用法。

用法:

scipy.signal.kaiserord(ripple, width)#

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

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

参数

ripple 浮点数

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

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

对于 0 <= w <= 1 并且 w 不在转换间隔中。

width 浮点数

过渡区域的宽度,标准化以便 1 对应于 pi 弧度/样本。也就是说,频率表示为奈奎斯特频率的一部分。

返回

numtaps int

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,“Discrete-Time 信号处理”,第 475-476 页。

例子

我们将使用 Kaiser 窗方法为以 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

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

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

>>> 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。这对于 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()
scipy-signal-kaiserord-1.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.kaiserord。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。