加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

数字信号处理没有Matlab?用Python一样很爽

04/02 16:56
775
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

通常,在数字信号处理时,我们避不开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

以上,这三个库是平时数字信号处理用到的非常重要的三个库。是不是已经心动了?大家赶快动手试下吧!

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
KSZ8873MLLV 1 Microchip Technology Inc LAN Switching Circuit, PQFP64
暂无数据 查看
AD73311ARSZ 1 Analog Devices Inc Single-Channel, 3 V and 5 V Front-End Processor for General Purpose Applications Including Speech and Telephony

ECAD模型

下载ECAD模型
$10.72 查看
TJA1042T/1J 1 NXP Semiconductors TJA1042 - High-speed CAN transceiver with Standby mode SOIC 8-Pin

ECAD模型

下载ECAD模型
$1.57 查看

相关推荐

电子产业图谱

分享各种技术学习笔记和心得,品味技术人生,一个理想主义的精神食堂。主要涉及无线通信,射频,半导体,软件开发,数据分析等。