Python信号处理(一)信号模型的建立
数字信号是由模拟信号取样得到的,因此建立数字信号模型首先需要确定采样频率Fs。
对于持续时间为1s的模拟信号以1000Hz的采样频率进行采样,得到的采样点数N=T*Fs=1000,因此需要建立一个长度为1000的数组来代表采样得到的数字信号;从另一个角度讲,如果要设置采样频率Fs=1000Hz,采样点数N=1000,则采样间隔Ts=1/Fs=1ms,该序列代表的是一个持续时间T=N * Ts=1000ms的信号。
在matlab中,一般通过一维数组来储存数字信号的模型,通过plot()或stem()函数绘制信号的图形。在Python中,我们可以通过列表来存储序列 ,但从便于处理的角度来看,使用numpy库,可以更加方便地完成对数字序列的各种运算处理。
Numpy基础功能
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 能够在一定程度上替代 MatLab
Ndarray 对象的建立
首先导入numpy库
import numpy as np
- 从列表创建
x=np.array([0,1,2,3])
print(type(x),x,sep='\n')
输出结果如下:
<class 'numpy.ndarray'>
[0 1 2 3]
- 建立全0序列
x=np.zeros(10)
print(type(x),x,sep='\n')
输出结果如下:
<class 'numpy.ndarray'>
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
- 建立递增序列
x=np.arange(10,20,1) #起点、终点、步长
print(type(x),x,sep='\n')
输出结果如下:
<class 'numpy.ndarray'>
[10 11 12 13 14 15 16 17 18 19]
- 建立随机序列
#U(0,1)均匀分布用rand,N(0,1)标准正态分布用rand
x=np.random.rand(5)
# x=np.random.randn(5)
print(type(x),x,sep='\n')
输出结果如下:
<class 'numpy.ndarray'>
[ 0.77699024 0.00390639 0.90295907 0.66632631 0.30767268]
基本操作
- 四则运算
相同shape的ndarray对象或ndarray对象与标量之间可以使用运算符直接进行四则运算
x=np.array([4,6,8,10])
y=np.arange(2,6,1)
print(x,y,x+y,x-y,x*y,x/y,sep='\n')
y=2
print(x,y,x+y,x-y,x*y,x/y,sep='\n')
第一次输出结果如下
[ 4 6 8 10]
[2 3 4 5]
[ 6 9 12 15]
[2 3 4 5]
[ 8 18 32 50]
[ 2. 2. 2. 2.]
第二次输出结果如下
[ 4 6 8 10]
2
[ 6 8 10 12]
[2 4 6 8]
[ 8 12 16 20]
[ 2. 3. 4. 5.]
- 增加元素或连接数组
x=np.array([1,5,3,2])
y=np.append(x,[2,3])
z=np.append(y,0)
w=np.append(x,z)
print(x,y,z,sep='\n')
输出结果如下
[1 5 3 2]
[1 5 3 2 2 3]
[1 5 3 2 2 3 0]
[1 5 3 2 1 5 3 2 2 3 0]
- 切片和索引
x=np.arange(0,7,1)
x1=x[4:]#取第五个元素到倒数第一个元素
x2=x[:3]#取第一个元素到第三个元素
x3=x[3:-1]#取第三个元素到倒数第二个元素
x4=x[0:3]#取第一个元素到倒数第三个元素
print(x,x1,x2,x3,x4,sep='\n')
输出结果
[0 1 2 3 4 5 6]
[4 5 6]
[0 1 2]
[3 4 5]
[0 1 2]
函数
- 三角函数
x=np.arange(0,2,0.5)
y=np.sin(x)
print(x,y,sep='\n')
输出结果如下
[ 0. 0.5 1. 1.5]
[ 0. 0.47942554 0.84147098 0.99749499]
- 指数函数
x=np.arange(0,4,1)
y=np.power(x,2)
z=np.power(y,x)
print(x,y,z,sep='\n')
输出结果如下
[0 1 2 3]
[0 1 4 9]
[ 1 1 16 729]
- 对数函数
x=np.array([10,100,1000,10000])
y=np.log10(x)
print(x,y,sep='\n')
输出结果如下
[ 10 100 1000 10000]
[ 1. 2. 3. 4.]
自然对数使用np.log()
,以2为底底对数使用np.log2()
几种常见信号的生成
确知信号
首先假设信号时长t=10s,采样率为100Hz,采样点数为1000
Fs=100
Size=1000
t=np.arange(0,Size)/Fs
- 正弦波
x1=np.sin(2*np.pi*1*t)
plt.plot(t,x1)
plt.show()
- 方波
方波可以由正弦波获得
x2=x1>0
plt.plot(t,x2)
plt.show()
或重新建立
x2=np.array([1,0])
x2=np.repeat(x2,Fs//2)
x2=np.tile(x2,Size//(Fs//1))
plt.plot(t,x2)
plt.show()
结果如下
- 三角波
#从方波获得三角波
# 消除直流分量
x2=x2-np.mean(x2)
x3=np.zeros(Size)
# 积分
sum=0
for i in range(Size):
sum += x2[i]
x3[i] = sum
# 归一化
x3 /= np.max(x2)
plt.plot(t,x3)
plt.show()
结果如下
随机信号
- 高斯白噪声
# 方差为4的高斯噪声
n1=np.random.randn(Size)*2
plt.plot(t,n1)
plt.show()
结果如下
- 均匀分布白噪声
# 在-0.5到0.5之间均匀分布的噪声
n2=np.random.rand(Size)
n2-=np.mean(n2)
plt.plot(t,n2)
plt.show()
结果如下