NumPy参考 >例行程序 >Window functions > numpy.kaiser
numpy.
kaiser
(M,beta )[源代码] ¶返回Kaiser窗口。
Kaiser窗口是通过使用Bessel函数形成的锥度。
输出窗口中的点数。如果为零或更少,则返回一个空数组。
窗口的形状参数。
最大值标准化为1的窗口(仅当样本数为奇数时才显示1)。
笔记
Kaiser窗口定义为
与
哪里是修改后的零阶贝塞尔函数。
Kaiser以Jim Kaiser的名字命名,他发现了基于Bessel函数的DPSS窗口的简单近似。Kaiser窗口非常类似于Digital Prolate Spheroidal Sequence或Slepian窗口,这是使窗口主瓣中的能量相对于总能量最大化的变换。
Kaiser可以通过更改beta参数来近似其他许多窗口。
贝塔 |
窗形 |
---|---|
0 |
长方形 |
5 |
类似于汉明 |
6 |
类似于汉宁 |
8.6 |
类似于布莱克曼 |
Beta值为14可能是一个很好的起点。请注意,随着beta变大,窗口会变窄,因此样本数量必须足够大才能对逐渐缩小的尖峰进行采样,否则NaN将返回。
对Kaiser窗口的大多数引用来自信号处理文献,在该文献中,它被用作平滑值的许多窗口函数之一。这也被称为切趾(apodization)(意思是“移开脚”,即在采样信号的开始和结束处平滑不连续部分)或渐缩功能。
参考文献
JF Kaiser,“数字滤波器”-“数字计算机的系统分析”中的第7章,编辑:FF Kuo和JF Kaiser,第218-285页。纽约,约翰·威利父子(1966)。
ER Kanasewich,《地球物理学中的时序分析》,阿尔伯塔大学出版社,1975年,第177-178页。
维基百科,“窗口功能”, https://en.wikipedia.org/wiki/Window_function
例子
>>> import matplotlib.pyplot as plt
>>> np.kaiser(12, 14)
array([7.72686684e-06, 3.46009194e-03, 4.65200189e-02, # may vary
2.29737120e-01, 5.99885316e-01, 9.45674898e-01,
9.45674898e-01, 5.99885316e-01, 2.29737120e-01,
4.65200189e-02, 3.46009194e-03, 7.72686684e-06])
绘制窗口和频率响应图:
>>> from numpy.fft import fft, fftshift
>>> window = np.kaiser(51, 14)
>>> plt.plot(window)
[<matplotlib.lines.Line2D object at 0x...>]
>>> plt.title("Kaiser window")
Text(0.5, 1.0, 'Kaiser window')
>>> plt.ylabel("Amplitude")
Text(0, 0.5, 'Amplitude')
>>> plt.xlabel("Sample")
Text(0.5, 0, 'Sample')
>>> plt.show()
>>> plt.figure()
<Figure size 640x480 with 0 Axes>
>>> A = fft(window, 2048) / 25.5
>>> mag = np.abs(fftshift(A))
>>> freq = np.linspace(-0.5, 0.5, len(A))
>>> response = 20 * np.log10(mag)
>>> response = np.clip(response, -100, 100)
>>> plt.plot(freq, response)
[<matplotlib.lines.Line2D object at 0x...>]
>>> plt.title("Frequency response of Kaiser window")
Text(0.5, 1.0, 'Frequency response of Kaiser window')
>>> plt.ylabel("Magnitude [dB]")
Text(0, 0.5, 'Magnitude [dB]')
>>> plt.xlabel("Normalized frequency [cycles per sample]")
Text(0.5, 0, 'Normalized frequency [cycles per sample]')
>>> plt.axis('tight')
(-0.5, 0.5, -100.0, ...) # may vary
>>> plt.show()