因为是从实线到实线的函数,任意两个连续样本之间有无限多的点,因此采样是数据的大量减少,因为它只需要有限数量的点来完全表征函数。 我们之前在傅立叶级数展开式中已经看到了将函数简化为离散数字集的概念,其中 (对于周期性) 我们有,
相应的重建为:
但是在这里我们通过对整个函数进行积分来生成离散点,而不仅仅是在单个点上对其进行采样。 这意味着我们收集有关整个函数的信息来计算单个离散点,而通过采样我们只是孤立地获取单个点。
另一方面,假设我们有一组样本,然后我们被要求重建函数。 我们会做什么? 也许最自然的做法是在每个点之间画一条直线,就像在线性插值中一样。下面代码在单个周期内采集正弦样本并在样本之间画一条线。
from __future__ import division
fig,ax = subplots()
f = 1.0 # Hz, signal frequency
fs = 5.0 # Hz, sampling rate (ie. >= 2*f)
t = arange(-1,1+1/fs,1/fs) # sample interval, symmetric
# for convenience later
x = sin(2*pi*f*t)
ax.plot(t,x,’o-’)
ax.set_xlabel(’Time’,fontsize=18)
ax.set_ylabel(’Amplitude’,fontsize=18)
上述代码,第一行确保我们使用浮点除法而不是 Python 的默认整数除法,其中 1/4=0 而不是 0.25。
第 3 行设置图形和相应的轴。 这遵循使用 Matplotlib 的现代约定。 fig 是绑定到图形的对象, ax 是在该图形中绘制的轴。 我们希望这些分开的原因是更复杂的图可能在同一图中嵌入了多个轴。 因为 Matplotlib 可以在 GUI 窗口、文件中或嵌入其他应用程序(等等)中渲染绘图,所以假设您的绘图命令正在对“当前活动”图形进行操作并不是一个好习惯。 使用 fig 和 ax 避免了这个陷阱。
在第 6 行,arange 函数创建了一个 Numpy 数字数组,从 -1 开始,直到 1+1/fs,步长为 1/fs。 回想一下 Python 中的内置 range 命令产生一个半开区间(即不包括右端点),arange 也是如此。 下一行计算我们刚刚创建的点数组的正弦函数并返回一个 Numpy 数组。 请注意,虽然 Python 本身在内置 math 模块中带有正弦函数,但这个正弦是 Numpy 版本。不同之处在于 Numpy 版本可以摄取一个 Numpy 数组并产生相应的输出,而无需 math 模块的任何额外循环。
ax.plot 命令将绘图附加到轴 ax。 接下来的两行将文本标签放在 x 轴和 y 轴上。 这些标签功能还为文本格式提供了许多可能性,包括潜在的 LATEX 字体。
图1 显示,即使函数是最曲线的,我们拥有与其他任何地方相同的点密度。这是因为采样定理并没有指定我们应该在哪里采样,只要我们以周期性间隔采样。这意味着在正弦的上下斜率上, 哪些是线性的,哪些需要更少的样本来表征,我们将样本密度取为靠近弯曲峰。代码清单1放大到第一个峰来说明这一点