自用——python信号处理(如何绘制离散信号)
如何绘制离散信号的笔记
在信号处理和数字通信中,离散信号的可视化是一个非常重要的步骤,尤其是在频谱分析和相位分析时。Python 的 matplotlib
库提供了非常方便的工具来绘制离散信号和相关的频谱图。以下是如何使用 matplotlib
来绘制离散信号并展示其频谱和相位谱的详细笔记。
1. 导入必要的库
我们使用 matplotlib
来绘制图形,使用 numpy
来进行数值计算和生成数据。首先需要导入这两个库:
import matplotlib.pyplot as plt
import numpy as np
matplotlib.pyplot
:用于绘制各种类型的图形,包括离散信号图、频谱图等。numpy
:用于数值运算和数组处理,在生成信号数据时非常有用。
2. 设置字体和解决负号显示问题
在绘制图形时,如果需要显示中文字符(如标题、标签等),需要设置合适的字体。此外,处理负号显示问题是另一个常见的步骤。
# 设置字体为SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决坐标轴负号显示问题
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
:设置中文字体为黑体(SimHei),这样可以避免中文字符乱码。plt.rcParams['axes.unicode_minus'] = False
:解决负号显示问题,使负号能够正确显示在图形上。
3. 定义离散信号
离散信号通常由一个离散的时间序列和与之对应的信号幅度组成。在这段代码中,我们通过 numpy
的 linspace
和 array
创建了一个离散时间索引 N
和多个信号值 x1
、x2
、x3
和 x4
。
# 定义离散信号
N = np.linspace(-5, 5, 11, dtype=int) # 离散时间索引,从 -5 到 5,共 11 个采样点
x1 = np.array([0, 0, 0, 0, 0, 10, 0, 5, 0, 0, 4]) # 离散信号1的值
x2 = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.14/2]) # 离散信号2的值
x3 = np.array([2, 0, 0, 5/2, 0, 10, 0, 5/2, 0, 0, 2]) # 离散信号3的值
x4 = np.array([3.14/2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.14/2]) # 离散信号4的值
N
:离散时间索引,使用np.linspace(-5, 5, 11, dtype=int)
来生成从-5
到5
的时间序列,共有 11 个时间点。x1
,x2
,x3
,x4
:这些是与N
对应的离散信号幅度,可以是任何形式的离散信号,例如幅度谱、相位谱等。
4. 创建图形和子图
为了展示多个离散信号,我们使用 subplot
来创建多个子图,并将每个离散信号绘制在不同的子图中。
# 创建图形
fig = plt.figure(figsize=(10, 6)) # 创建图形,设置大小
plt.figure(figsize=(10, 6))
创建了一个 10 英寸宽,6 英寸高的图形,figsize
参数可以调整图形的大小。
5. 绘制子图
使用 add_subplot()
来在图形中创建多个子图。例如,我们可以将图形分成 2 行 2 列,分别绘制不同的离散信号。
# 在同一图形中创建子图
ax1 = fig.add_subplot(2, 2, 1) # 1 行 2 列的第 1 个子图
ax1.stem(N, x1)
ax1.set_title("单边谱") # 设置第一个子图的标题
ax1.set_xlabel("Cn") # 设置 X 轴标签
ax1.set_ylabel("幅度 (x)") # 设置 Y 轴标签
plt.grid(True)
ax2 = fig.add_subplot(2, 2, 2) # 1 行 2 列的第 2 个子图
ax2.stem(N, x2)
ax2.set_title("相位谱") # 设置第二个子图的标题
ax2.set_xlabel("频率(Omega)") # 设置 X 轴标签
ax2.set_ylabel("phi (φ)") # 设置 Y 轴标签
plt.grid(True)
ax3 = fig.add_subplot(2, 2, 3) # 1 行 2 列的第 3 个子图
ax3.stem(N, x3)
ax3.set_title("单边谱") # 设置第一个子图的标题
ax3.set_xlabel("Cn") # 设置 X 轴标签
ax3.set_ylabel("幅度 (x)") # 设置 Y 轴标签
plt.grid(True)
ax4 = fig.add_subplot(2, 2, 4) # 1 行 2 列的第 4 个子图
ax4.stem(N, x4)
ax4.set_title("相位谱") # 设置第二个子图的标题
ax4.set_xlabel("频率(Omega)") # 设置 X 轴标签
ax4.set_ylabel("phi (φ)") # 设置 Y 轴标签
plt.grid(True)
ax1.stem(N, x1)
:在第一个子图中绘制x1
的离散信号。ax2.stem(N, x2)
:在第二个子图中绘制x2
的离散信号。set_title()
、set_xlabel()
和set_ylabel()
用于设置每个子图的标题和坐标轴标签。plt.grid(True)
:在每个子图中添加网格线,使图形更加清晰。
6. 调整布局和显示图形
使用 plt.tight_layout()
来自动调整子图之间的间距,防止标签重叠。最后,通过 plt.show()
显示绘制的图形。
# 显示图形
plt.tight_layout() # 调整布局,防止重叠
plt.show() # 显示图形
7. 总结
- 离散信号定义:使用
numpy
创建离散时间序列和相应的信号幅度。 - 子图绘制:使用
add_subplot()
将多个信号绘制到同一个图形中的不同子图。 - 图形美化:使用
set_title()
、set_xlabel()
、set_ylabel()
设置标题和坐标轴标签,plt.grid(True)
显示网格线,plt.tight_layout()
调整子图间距。 - 显示图形:通过
plt.show()
显示最终图形。
8. VS使用时的utf-8问题
在高级保存设置里修改成