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()

数字信号处理python工具包 python数字信号处理pdf_信号处理

  • 方波
    方波可以由正弦波获得
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()

结果如下

数字信号处理python工具包 python数字信号处理pdf_数字信号处理python工具包_02

  • 三角波
#从方波获得三角波
# 消除直流分量
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()

结果如下

数字信号处理python工具包 python数字信号处理pdf_Numpy_03

随机信号

  • 高斯白噪声
# 方差为4的高斯噪声
n1=np.random.randn(Size)*2
plt.plot(t,n1)
plt.show()

结果如下

数字信号处理python工具包 python数字信号处理pdf_数字信号_04

  • 均匀分布白噪声
# 在-0.5到0.5之间均匀分布的噪声
n2=np.random.rand(Size)
n2-=np.mean(n2)
plt.plot(t,n2)
plt.show()

结果如下

数字信号处理python工具包 python数字信号处理pdf_Python_05