SciPy 簡易使用教程
- 1. 符號計算
- 2. 函數向量化
- 3. 波形處理scipy.signal
- 3.1 濾波器
- 3.2 波峰定位
基于numpy的一個高級模塊,為數學,物理,工程等方面的科學計算提供無可替代的支持。
做重要的思想是:符號計算和函數向量化
1. 符號計算
demo: n次多項式的表示,以及計算
from scipy import poly1dp = poly1d([3, 4, 5]) # p(x) = 3x^2 + 4x + 5
print(p)
print(p * p) # p*p = 9x^4 + 24x^3 + 46x^2 + 40x + 25
print(p.integ(k=6)) # 求p(x)的不定積分,指定常數項為6
print(p.deriv()) # 求p(x)的一階導數: 6x + 4
print(p([4, 5])) # 求p(4),p(5)的結果
輸出
2
3 x + 4 x + 54 3 2
9 x + 24 x + 46 x + 40 x + 253 2
1 x + 2 x + 5 x + 66 x + 4
[ 69 100]
2. 函數向量化
demo: 寫一個支持向量操作函數
def addsubtract(a, b):# 結合scipy的函數實現向量操作if a > b:return a - belse:return a + b
vec_addsubtract = np.vectorize(addsubtract)
print(vec_addsubtract([0, 3, 6, 9], [1, 3, 5, 7]))
vec_poly1d = np.vectorize(p)
print(vec_poly1d([4, 5])) # 輸出結果和p([4, 5]) 是一致的
3. 波形處理scipy.signal
3.1 濾波器
基本低通、高通、帶通、帶阻濾波器,關鍵點是計算Wn。假設采樣頻率為1000hz,信號本身最大的頻率為500hz,要濾除400hz以上頻率成分,即截止頻率為400hz,則wn=2*400/1000=0.8。Wn=0.8
數字信號Wn=1NT?21W_n =\frac{\frac{1}{N_T} * 2}{1}Wn?=1NT?1??2? 其中 N_T 為一個周期內的采樣點數
濾波器的階數: 物理上理解,有幾個濾波器串聯。
from scipy import signal
b, a = signal.butter(8, 0.8, 'lowpass') #8 為濾波器的階數
filtedData = signal.filtfilt(b, a, data) #data為要過濾的信號b, a = signal.butter(8, 0.2, 'highpass') #高通
b, a = signal.butter(8, [0.2,0.8], 'bandpass') #帶通
b, a = signal.butter(8, [0.2,0.8], 'bandstop') #帶阻
疑問:濾波器的數字實現、頻率濾波器和均值濾波器的關系。
參考文檔:Python實現信號濾波(基于scipy)
3.2 波峰定位
from scipy.signal import find_peaks
x = [......] # 波形信號
peaks, _ = find_peaks(x, height=0) # 高度大于0的峰
peaks, _ = find_peaks(x, height=(-border, border)) # 高度范圍
peaks, _ = find_peaks(x, distance=150) # 要求至少距離150個樣本的峰
peaks, properties = find_peaks(x, prominence=(None, 0.6)) # 嘈雜信號的識別,突出基線信號0.6 高度的峰
peaks, properties = find_peaks(x, prominence=1, width=20) # 寬度要求# 配套顯示工作
import matplotlib.pyplot as plt
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
突出程度:峰的突出度衡量一個峰從信號的周圍基線中突出多少,并定義為峰與其最低輪廓線之間的垂直距離,
參考文檔:python scipy signal.find_peaks用法及代碼示例