python之 matplotlib模块

     老师布置了几道信号处理分析的题目作为期末作业,本来是要求让用matlab完成,但是想着以前学过python,反正是绘制图形,就想着拿python来完成,一来是回顾一下python中的 matplotlib模块,二来是为了方便以后在画图的时候可以回来查看。

程序如下:

# 时间: 2018.7.14

# 数字信号处理大作业
# 第一题:自己设计一个模拟信号(几个不同频率简谐信号之和,再加一个白噪声)。用不同的采样频率把信号离散(满足和不满足采样定理)
# (1)画出信号波形;
# (2)分别作信号的谱分析(幅值);对比采样频率的影响;

import  numpy as np
import matplotlib.pyplot as plt
import math


#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False


fs=1000                    # 采样频率
N=1000                     # 采样点数
fs1=500;fs2=160            # 采样频率fs1(满足采样定理),fs2(不满足采样定理)
N1=500; N2=160             # 对应的采样点数N1和N2


n = np.arange(0,N,1); t = n/fs        # 时间序列
# Numpy arange()函数根据传入的参数,按照特定的规则,生成包含一个数值序列的数组,
# 例如,如果要生成一个包含数字0到9的数组,只需要传入标识序列结束的数字作为参数即可。
# 例如: >>> np.arange(0,10)
#     结果: array([0,1,2,3,4,5,6,7,8,9])
# 如果不想以0作为起始值,可自己指定,这是需要使用两个参数:
# 第一个为起始值,第二个为结束值;第三个参数(不设置默认为1)表示序列中相邻两个值之间的差距有多大。
# 例如:>>> np.arange(0,12,3)
#     结果: array([0,3,6,9])


n1 = np.arange(0,N1,1); t1=n1/fs1        # 时间序列t1

n2 = np.arange(0,N2,1); t2=n2/fs2        # 时间序列t2



y = 2*np.sin(2*math.pi*10*t)+5*np.sin(2*math.pi*50*t)+10*np.sin(2*math.pi*100*t) + np.random.randn(1000)        # 原始信号
# np.random.randn该函数返回一个样本,具有标准正态分布。
# 例如: >>>  np.random.randn(10)
# 结果: array([-1.6765704 ,  0.66361856,  0.04029481,  1.19965741, -0.57514593,
#        -0.79603968,  1.52261545, -2.17401814,  0.86671727, -1.17945975])

y1 = 2*np.sin(2*math.pi*10*t1)+5*np.sin(2*math.pi*50*t1)+10*np.sin(2*math.pi*100*t1)+ np.random.randn(500)     # 满足采样定理的信号

y2 = 2*np.sin(2*math.pi*10*t2)+5*np.sin(2*math.pi*50*t2)+10*np.sin(2*math.pi*100*t2)+ np.random.randn(160)     # 不满足采样定理的信号


# 开始绘图
# 在一幅图形中有三个子图,如何绘制呢?subplot()函数不仅可以将图形分为不同的绘图区域,还能激活特定子图,以便用命令控制它。
# subplot()函数用参数设置分区模式和当前子图。只有当前子图会受到命令的影响。subplot()函数的参数由三个整数组成:
# 第一个数字决定图形沿垂直方向被分为几部分,第二个数字决定图形沿水平方向被分为几部分,第三个数字设定可以直接用命令控制的子图。
# 如果subplot()函数中的三个参数都小于10的话,可以把它们缩写成一个整数,例如:
# subplot(323)和subplot(3,2,3)是一样的。


# 设定画图板尺寸
plt.figure(figsize=(12,16))

plt.subplot(311)
plt.plot(t,y,'b-')
plt.xlabel(u'时间/s')
plt.ylabel(u'幅值')
plt.title(u'原始信号')

plt.subplot(312)
plt.plot(t1,y1,'r-')
plt.xlabel(u'时间/s')
plt.ylabel(u'幅值')
plt.title(u'满足采样定理的信号')

plt.subplot(313)
plt.plot(t2,y2,'g-')
plt.xlabel(u'时间/s')
plt.ylabel(u'幅值')
plt.title(u'不满足采样定理的信号')

plt.subplots_adjust( hspace = 0.5)     #调整子图间距
plt.show()



# 进行FFT变换,然后画出信号幅值谱
N1 = y1.shape[0]
xf1 = np.fft.fft(y1)
xf_abs1 = np.fft.fftshift(abs(xf1))
axis_xf1 = np.linspace(-N1/2,N1/2-1,num=N1)

N2 = y2.shape[0]
xf2 = np.fft.fft(y2)
xf_abs2 = np.fft.fftshift(abs(xf2))
axis_xf2 = np.linspace(-N2/2,N2/2-1,num=N2)


plt.figure(figsize=(12,16))
plt.subplot(211)
plt.plot(axis_xf1,xf_abs1,'b-')
plt.xlabel(u'频率/Hz')
plt.ylabel(u'幅值')
plt.title(u'满足采样定理得信号幅值谱')

plt.subplot(212)
plt.plot(axis_xf2,xf_abs2,'r-')
plt.xlabel(u'频率/Hz')
plt.ylabel(u'幅值')
plt.title(u'不满足采样定理得信号幅值谱')
plt.show()


运行程序,可以看到:



猜你喜欢

转载自blog.csdn.net/weixin_41695564/article/details/81048082