通常,在数字信号处理时,我们避不开matlab这个工具,因其它的强大的功能受到广大工程师的好评,也一直都是业界的不二之选。但是,matlab毕竟是商业软件,公司里如果使用的话,就需要支付高昂的费用。即使公司购买了商业版本,也不会每个人都能随时使用,这对我们平时的工作和学习将会带来很多的不便之处。
不过,除了Matlab外,还有什么不错的工具推荐呢?在这里为大家推荐的是一直很受欢迎的Python。对Python有所了解的同学就会知道,Python拥有丰富的第三方库,涉及到各个领域。应该说,没有你不知道的,只有你想不到的,它通通都有。在科学研究和数据处理上,它的应用非常的广泛。而且,他们通通都是免费的。是不是很诱人?不过,按照Python后,需要我们根据需求自己手动安装相关的第三方库,今天和大家一起学习下如何使用Python替代matlab进行数字信号处理。
numpy是一个支持多维度的数组和矩阵运算库,并包含了大量的数学函数库,其科学数值运算较为高效,而被广泛应用于各种工程研发中。安装命令如下:
python -m pip install numpy
如下图,出现安装成功的提示即可。
我们使用numpy写个代码试试吧。
import numpy as np
import numpy.matlib
n1 = np.zeros((3,4), dtype=int) #创建数组并初始化为0
print("n1 = ")
print(n1)
print(" ---------- ")
n2 = np.ones((3,3), dtype=int) #创建数据并初始化为1
print("n2 = ")
print(n2)
print("n2 * n2 = ")
print(n2 * n2)
print(" ---------- ")
print("n3 = ")
n3 = np.matlib.zeros((3,4), dtype=int) #创建矩阵并初始化为0
print(n3)
print(" ---------- ")
n4 = np.matlib.ones((3,3), dtype=int) #创建矩阵并初始化为1
print("n4 = ")
print(n4)
print("n4 * n4 = ")
print(n4*n4)
代码运行的结果如下,上面的示例中,n1和n2是两个数组,而n3和n4是两个矩阵,不过,矩阵库在numpy.matlab中。这里初始化我们用到了zeros和ones函数,是不是和之前学习的C++的Eigen库类似?
matplotlib是一个风格类似matlab的绘图库,有着丰厚的图表绘制功能,并且和matlab有着相似的函数,对于熟悉matlab的同学可以无缝切入。安装命令如下:
python -m pip install matplotlib
到这里我们已经安装了numpy和matplotlib这两个库,我们再结合numpy画个曲线看看,例如:y=3x+2。
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(0, 10)
y = 3*x + 2
print("x=")
print(x)
print("y=")
print(y)
plt.plot(x, y)
plt.title("y = 3x + 2")
plt.show()
终端输出x,y的值:
关于x,y的曲线图:
scipy是一个开源的科学计算库,主要有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解器等功能。安装命令如下:
python -m pip install scipy
scipy库比上面两个要大一些,下载速度可能较慢,同学们请耐心等待。
按照惯例,这里可以上代码了,我们结合上面的numpy和matplotlib库写个正弦信号和正弦信号的傅立叶变换的例子。
import numpy as np
from matplotlib import pyplot as plt
import scipy as sci
fs = 100 # 采样率
N = 256 # 数据点数
n = np.linspace(0,N-1,N)
print(n)
t = n / fs #时间序列
x = 0.5 * np.sin(2*np.pi*15*t) + 2*np.sin(2*np.pi*40*t) #实信号
y1 = sci.fft.fft(x, N) #信号傅立叶变换
y2 = sci.fft.fftshift(y1)
mag1 = abs(y1) #对信号取模求振幅
mag2 = abs(y2)
f1 = n * fs / N #频率序列
f2 = n * fs / N - fs/2
plt.subplot(3,1,1)
plt.title("usual FFT")
plt.xlabel("freq/Hz")
plt.ylabel("Amp")
plt.plot(f1, mag1) #随频率变化的振幅
plt.subplot(3,1,2)
plt.title("FFT without fftshift")
plt.xlabel("Freq/Hz")
plt.ylabel("Amp")
plt.plot(f2, mag1) #随频率变化的振幅
plt.subplot(3,1,3)
plt.title("FFT after fftshift")
plt.xlabel("Freq/Hz")
plt.ylabel("Amp")
plt.plot(f2, mag2) #随频率变化的振幅
plt.show()
执行结果如下:
当然,我们还可以用命令查看我们安装了哪些库。
python -m pip list
以上,这三个库是平时数字信号处理用到的非常重要的三个库。是不是已经心动了?大家赶快动手试下吧!