如何使用Python替代matlab进行数字信号处理数组和矩阵库?

通常,在数字信号处理中,我们离不开工具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 和 one 函数进行初始化。是不是和我们之前学过的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()

图片[1]-如何使用Python替代matlab进行数字信号处理数组和矩阵库?-老王博客

终端输出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

以上,这三个库是非常重要的三个库,通常用于数字信号处理。你已经兴奋了吗?让我们现在试试吧!

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论