当前Numpy版本为:1.20
第七章 专用函数
7.23 窗函数
窗函数(window function)是信号处理领域常用的数学函数,相关应用包括谱分析和滤波器设计等。这些窗函数除在给定区间之外取值均为0
。NumPy
中有很多窗函数,如bartlett
、blackman
、hamming
、 hanning
和kaiser
。关于hanning
函数的例子可以在第4章和第3章中找到。
7.24 动手实践:绘制巴特利特窗
巴特利特窗(Bartlett window)是一种三角形平滑窗。按如下步骤绘制巴特利特窗。
(1) 调用
NumPy
中的bartlett
函数,以计算巴特利特窗。import numpy as np window = np.bartlett(42)
(2) 使用Matplotlib绘制巴特利特窗,非常简单。
from matplotlib.pyplot import plot, show plot(window) show()
绘制结果如下图所示,形状确实为三角形。
7.25 布莱克曼窗
布莱克曼窗(Blackman window)形式上为三项余弦值的加和,如下所示:
NumPy
中的blackman
函数返回布莱克曼窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
7.26 动手实践:使用布莱克曼窗平滑股价数据
我们对AAPL股价的小数据文件中的收盘价数据进行平滑处理。完成如下步骤。
(1) 将数据载入NumPy数组。调用
blackman
函数生成一个平滑窗并用它来平滑股价数据。import numpy as np from matplotlib.pyplot import plot, show, legend from matplotlib.dates import datestr2num import sys closes=np.loadtxt('AAPL.csv', delimiter=',', usecols=(6,), converters={ 1:datestr2num}, unpack=True) N = 5 window = np.blackman(N) smoothed = np.convolve(window/window.sum(), closes, mode='same')
(2) 使用Matplotlib绘制平滑后的股价图。在这个例子中,我们将省略最前面5个和最后面5个数据点。这是由于存在很强的边界效应。
plot(smoothed[N:-N], lw=2, label="smoothed") plot(closes[N:-N], label="closes") legend(loc='best') show()
经过布莱克曼窗平滑后的AAPL收盘价数据如下所示。
7.27 汉明窗
汉明窗(Hamming window)形式上是一个加权的余弦函数。公式如下所示。
NumPy中的hamming函数返回汉明窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
7.28 动手实践:绘制汉明窗
我们来绘制汉明窗。完成如下步骤。
(1) 调用
hamming
函数,以计算汉明窗:import numpy as np from matplotlib.pyplot import plot, show window = np.hamming(42)
(2) 使用Matplotlib绘制汉明窗:
plot(window) show()
绘制结果如下图所示。
7.29 凯泽窗
凯泽窗(Kaiser window)是以贝塞尔函数(Bessel function)定义的,公式如下所示。
这里的I0即为零阶的贝塞尔函数。 NumPy
中的kaiser
函数返回凯泽窗。该函数的第一个参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。第二个参数为β
值。
7.30 动手实践:绘制凯泽窗
我们来绘制凯泽窗。完成如下步骤。
(1) 调用
kaiser
函数,以计算凯泽窗:import numpy as np from matplotlib.pyplot import plot, show window = np.kaiser(42, 14)
(2) 使用Matplotlib绘制凯泽窗:
plot(window) show()
绘制结果如下图所示。
7.31 专用数学函数
贝塞尔函数(Bessel function)是贝塞尔微分方程的标准解函数(详见https://baike.baidu.com/item/贝塞尔函数)。在NumPy
中,以i0
表示第一类修正的零阶贝塞尔函数。
7.32 动手实践:绘制修正的贝塞尔函数
我们来看看第一类修正的零阶贝塞尔函数绘制出来是什么形状。
(1) 使用
NumPy
的linspace
函数生成一组均匀分布的数值。import numpy as np from matplotlib.pyplot import plot, show x = np.linspace(0, 4, 100)
(2) 调用
i0
函数进行计算:vals = np.i0(x)
(3) 使用Matplotlib绘制修正的贝塞尔函数:
plot(x, vals)
show<