scipy.signal.kaiserord¶
- scipy.signal.kaiserord(ripple, width)[源代码]¶
确定凯撒窗口方法的过滤窗口参数。
此函数返回的参数通常用于使用窗口方法创建有限脉冲响应过滤,其中
firwin
或firwin2
。- 参数
- 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()