加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

數(shù)字信號處理沒有Matlab?用Python一樣很爽

04/02 16:56
2343
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

通常,在數(shù)字信號處理時(shí),我們避不開matlab這個(gè)工具,因其它的強(qiáng)大的功能受到廣大工程師的好評,也一直都是業(yè)界的不二之選。但是,matlab畢竟是商業(yè)軟件,公司里如果使用的話,就需要支付高昂的費(fèi)用。即使公司購買了商業(yè)版本,也不會每個(gè)人都能隨時(shí)使用,這對我們平時(shí)的工作和學(xué)習(xí)將會帶來很多的不便之處。

不過,除了Matlab外,還有什么不錯(cuò)的工具推薦呢?在這里為大家推薦的是一直很受歡迎的Python。對Python有所了解的同學(xué)就會知道,Python擁有豐富的第三方庫,涉及到各個(gè)領(lǐng)域。應(yīng)該說,沒有你不知道的,只有你想不到的,它通通都有。在科學(xué)研究和數(shù)據(jù)處理上,它的應(yīng)用非常的廣泛。而且,他們通通都是免費(fèi)的。是不是很誘人?不過,按照Python后,需要我們根據(jù)需求自己手動安裝相關(guān)的第三方庫,今天和大家一起學(xué)習(xí)下如何使用Python替代matlab進(jìn)行數(shù)字信號處理。

numpy是一個(gè)支持多維度的數(shù)組和矩陣運(yùn)算庫,并包含了大量的數(shù)學(xué)函數(shù)庫,其科學(xué)數(shù)值運(yùn)算較為高效,而被廣泛應(yīng)用于各種工程研發(fā)中。安裝命令如下:

python -m pip install numpy

如下圖,出現(xiàn)安裝成功的提示即可。

我們使用numpy寫個(gè)代碼試試吧。

import numpy as np
import numpy.matlib

n1 = np.zeros((3,4), dtype=int) #創(chuàng)建數(shù)組并初始化為0
print("n1 = ")
print(n1)

print(" ---------- ")

n2 = np.ones((3,3), dtype=int) #創(chuàng)建數(shù)據(jù)并初始化為1
print("n2 = ")
print(n2)
print("n2 * n2 = ")
print(n2 * n2)

print(" ---------- ")

print("n3 = ")
n3 = np.matlib.zeros((3,4), dtype=int) #創(chuàng)建矩陣并初始化為0
print(n3)

print(" ---------- ")

n4 = np.matlib.ones((3,3), dtype=int) #創(chuàng)建矩陣并初始化為1
print("n4 = ")
print(n4)
print("n4 * n4 = ")
print(n4*n4)

代碼運(yùn)行的結(jié)果如下,上面的示例中,n1和n2是兩個(gè)數(shù)組,而n3和n4是兩個(gè)矩陣,不過,矩陣庫在numpy.matlab中。這里初始化我們用到了zeros和ones函數(shù),是不是和之前學(xué)習(xí)的C++的Eigen庫類似?

matplotlib是一個(gè)風(fēng)格類似matlab的繪圖庫,有著豐厚的圖表繪制功能,并且和matlab有著相似的函數(shù),對于熟悉matlab的同學(xué)可以無縫切入。安裝命令如下:

python -m pip install matplotlib

到這里我們已經(jīng)安裝了numpy和matplotlib這兩個(gè)庫,我們再結(jié)合numpy畫個(gè)曲線看看,例如: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的值:

關(guān)于x,y的曲線圖:

scipy是一個(gè)開源的科學(xué)計(jì)算庫,主要有最優(yōu)化、線性代數(shù)、積分、插值、擬合、特殊函數(shù)、快速傅里葉變換、信號處理、圖像處理、常微分方程求解器等功能。安裝命令如下:

python -m pip install scipy

scipy庫比上面兩個(gè)要大一些,下載速度可能較慢,同學(xué)們請耐心等待。

按照慣例,這里可以上代碼了,我們結(jié)合上面的numpy和matplotlib庫寫個(gè)正弦信號和正弦信號的傅立葉變換的例子。

import numpy as np
from matplotlib import pyplot as plt
import scipy as sci

fs = 100 # 采樣率
N = 256 # 數(shù)據(jù)點(diǎn)數(shù)
n = np.linspace(0,N-1,N)
print(n)

t = n / fs #時(shí)間序列

x = 0.5 * np.sin(2*np.pi*15*t) + 2*np.sin(2*np.pi*40*t) #實(shí)信號

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

執(zhí)行結(jié)果如下:

當(dāng)然,我們還可以用命令查看我們安裝了哪些庫。

python -m pip list

以上,這三個(gè)庫是平時(shí)數(shù)字信號處理用到的非常重要的三個(gè)庫。是不是已經(jīng)心動了?大家趕快動手試下吧!

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
TJA1052IT/5Y 1 NXP Semiconductors TJA1052i - Galvanically isolated high-speed CAN transceiver SOP 16-Pin

ECAD模型

下載ECAD模型
$7.84 查看
DP83867IRRGZR 1 Texas Instruments Industrial temperature, robust gigabit Ethernet PHY transceiver 48-VQFN -40 to 85

ECAD模型

下載ECAD模型
$59.73 查看
TJA1042T/3,118 1 NXP Semiconductors TJA1042 - High-speed CAN transceiver with Standby mode SOIC 8-Pin

ECAD模型

下載ECAD模型
$1.51 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜