通常,在數(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)心動了?大家趕快動手試下吧!