本文简要介绍 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()
相关用法
- Python SciPy signal.kaiser_atten用法及代码示例
- Python SciPy signal.kaiser_beta用法及代码示例
- Python SciPy signal.czt_points用法及代码示例
- Python SciPy signal.chirp用法及代码示例
- Python SciPy signal.residue用法及代码示例
- Python SciPy signal.iirdesign用法及代码示例
- Python SciPy signal.max_len_seq用法及代码示例
- Python SciPy signal.oaconvolve用法及代码示例
- Python SciPy signal.hilbert用法及代码示例
- Python SciPy signal.ricker用法及代码示例
- Python SciPy signal.group_delay用法及代码示例
- Python SciPy signal.cheb2ord用法及代码示例
- Python SciPy signal.get_window用法及代码示例
- Python SciPy signal.lfilter用法及代码示例
- Python SciPy signal.morlet用法及代码示例
- Python SciPy signal.coherence用法及代码示例
- Python SciPy signal.dfreqresp用法及代码示例
- Python SciPy signal.TransferFunction用法及代码示例
- Python SciPy signal.dbode用法及代码示例
- Python SciPy signal.residuez用法及代码示例
- Python SciPy signal.bilinear_zpk用法及代码示例
- Python SciPy signal.firls用法及代码示例
- Python SciPy signal.impulse用法及代码示例
- Python SciPy signal.buttord用法及代码示例
- Python SciPy signal.find_peaks用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.kaiserord。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。