返回介绍

第30单元 生成合成正弦波

发布于 2024-01-28 22:01:16 字数 1558 浏览 0 评论 0 收藏 0

现在我们来做一些数据科学家通常不会做的事情,打动那些不使用numpy的朋友:生成一个合成正弦波,我们可能已经在廉价的、不完美的,以及嘈杂的仪器中收到过小量的这种周期信号。这样的信号具体是从何处获得的以及仪器的性质并不重要。产生这类信号的仪器也许是一个插在电源插座上的电压表,或者是一个在周日晚放在草坪上而直到周五才收回的户外数字温度计,甚至可能是一个股票市场价格报价器。(顺便说一句,合成周期信号不仅可用于给朋友留下印象,还可用于测试新的数字信号处理算法。)

生成信号的代码如下,其中高亮显示的部分就是使用numpy的代码。这部分代码见证了矢量化的魔法:创建一个连续整数数组,将它们转换为浮点数,调整为正确的周期,取正弦,放大,置换,添加高斯噪声(参见第45单元),并模拟仪器测量得到的信号截断效果。

numpy_sinewave.py
# 导入所有优质的模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

# 定义了信号、噪声和“仪器”属性的常量
SIG_AMPLITUDE = 10; SIG_OFFSET = 2; SIG_PERIOD = 100
NOISE_AMPLITUDE = 3
N_SAMPLES = 5 * SIG_PERIOD
INSTRUMENT_RANGE = 9

➤ # 创建一个正弦波,并加入随机噪声
➤ times = np.arange(N_SAMPLES).astype(float)
➤ signal = SIG_AMPLITUDE * np.sin(2 * np.pi * times / SIG_PERIOD) + SIG_OFFSET
➤ noise = NOISE_AMPLITUDE * np.random.normal(size=N_SAMPLES)
➤ signal += noise
➤
➤ # 将仪器测量范围之外的峰值截断
➤ signal[signal > INSTRUMENT_RANGE] = INSTRUMENT_RANGE
➤ signal[signal < -INSTRUMENT_RANGE] = -INSTRUMENT_RANGE

# 绘制结果
matplotlib.style.use("ggplot")
plt.plot(times, signal)
plt.title("Synthetic sine wave signal")
plt.xlabel("Time")
plt.ylabel("Signal + noise")
plt.ylim(ymin = -SIG_AMPLITUDE, ymax = SIG_AMPLITUDE)

# 保存图片
plt.savefig("../images/signal.pdf")

其他未高亮显示的代码使用Matplotlib实现噪声信号的可视化。

Matplotlib作为numpy的姐妹包,是第8章“绘图”的重点内容。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文