《Python数据分析基础教程:NumPy学习指南(第2版)》笔记17:第七章 专用函数3——窗函数
当前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()
绘制结果如下图所示。
7.33 sinc 函数
sinc
函数在数学和信号处理领域被广泛应用。 NumPy
中有同名函数sinc
,并且也存在一个二维版本sinc2d
。 sinc
是一个三角函数,更多详细内容请访问https://baike.baidu.com/item/sinc函数。
7.34 动手实践:绘制 sinc 函数
我们将绘制sinc
函数。完成如下步骤。
-
(1) 使用NumPy的
linspace
函数生成一组均匀分布的数值。import numpy as np from matplotlib.pyplot import plot, show x = np.linspace(0, 4, 100)
-
(2) 调用
sinc
函数进行计算:vals = np.sinc(x)
-
(3) 使用Matplotlib绘制
sinc
函数:plot(x, vals) show()
绘制结果如下图所示。
sinc2d
函数需要输入一个二维数组。我们可以用outer
函数生成二维数组,便得到下图。
import numpy as np
from matplotlib.pyplot import imshow, show
x = np.linspace(0, 4, 100)
xx = np.outer(x, x)
vals = np.sinc(xx)
imshow(vals)
show()