使用Python3進行信號處理和分析(一):使用類Matlab的方式繪製波特圖(Bode Plot)

Preface

該系列文章是筆者複習研究生入學考試專業課,爲輔助理解使用Python進行實驗時所寫。要求讀者有電子信息方向本科大二及以上的基礎知識,包括模數電、信號與系統以及數字信號處理等。因此部分細節性的知識不再詳述。
本文使用的環境爲Matlab R2018b以及Python 3.7.1(由Anaconda管理)

波特圖

注意:此波特(Bode)非彼波特(Baud),後者是通信中的概念。

波特圖是線性非時變系統的傳遞函數對頻率的半對數座標圖,利用波特圖可以看出系統的頻率響應。又稱幅頻響應和相頻響應曲線圖。

以上摘自百度百科,波特圖在模擬系統的分析中十分重要。
頻率響應的計算來源於信號與系統的拉氏變換:將模擬系統看做線性時不變(LTI)系統,輸入電壓vi(t)v_i(t)看做激勵信號e(t)e(t),輸出電壓vo(t)v_o(t)看做響應信號r(t)r(t),那麼該系統就滿足(1)式:
(1)r(t)=e(t)h(t) r(t) = e(t) * h(t) \tag1
其中h(t)h(t)是系統的衝激響應,對其進行拉氏變換,有
(2)R(s)=E(s)H(s) R(s) = E(s)H(s) \tag2
(2)式中的H(s)H(s)稱爲系統函數,已知系統函數滿足(3)式:
(3)H(s)=H(s)eϕ(s) H(s) = \left| H(s)\right| e^{\phi(s)} \tag3
在理論分析中,一般認爲複頻率ss滿足(4)式(爲什麼?
(4)s=jω s = j\omega \tag4
於是綜合(3)(4)兩式,易得
(5)H(jω)=H(ω)eϕ(jω) H(j\omega) = \left| H(\omega) \right| e^{\phi(j\omega)} \tag5
其中H(ω)\left| H(\omega) \right|稱爲信號的幅頻特性,ϕ(jω)\phi(j\omega)稱爲信號的相頻特性,它們都反映了系統的頻率特性。波特圖正是直觀反映它們的工具。
現在設某系統的系統函數爲(6)式,逐一討論如何使用matlab和python3繪製波特圖
(6)H(s)=s+1s25s+6 H(s) = \frac{s+1}{s^2-5s+6} \tag6

使用matlab繪製波特圖

Matlab擁有極豐富的信號處理工具箱,可以輕易的繪製出系統的波特圖。
這裏主要藉助tf函數進行繪製

% 方法一:使用tf構建複頻率變量
s = tf('s');
sys = (s + 1) / (s ^ 2 - 5 * s + 6);
bode(sys)

% 方法二:直接使用tf構建系統函數
sys = tf([1, 1], [1, -5, 6]);
bode(sys)

可見,不論如何構建系統函數,都需要使用bode()函數進行繪圖,該函數可以一次性給出幅頻特性和相頻特性的曲線,極爲方便。

使用python3繪製波特圖

這裏必須安裝這麼幾個第三方庫:numpyscipymatplotlib。可以使用conda或者pip安裝。

# -*-coding: UTF-8 -*-
from scipy import signal
from pylab import *

def main():
	system = signal.lti([1, 1], [1, -5, 6])			# 類似tf函數,構建系統函數H(s)
	f = logspace(-2, 5)								# 取頻率座標,0.01Hz ~ 0.1MHz
	w = 2 * pi * f									# 取角頻率
	w, mag, phase = signal.bode(system, w)			# 計算各參量, mag爲幅頻特性,phase爲相頻特性
	semilogx(f, phase)								# 繪製半對數座標圖(頻率作爲橫軸採用對數座標),將phase換成mag即爲幅頻特性曲線

	show()											# 很重要,如無此函數則不顯示

if __name__ == "__main__":
	main()

注意

代碼較爲簡單,因此就不上圖了
這裏交代兩個問題:

  1. 爲什麼s=jωs=j\omega
    答:因爲模電的理論分析中常用正弦信號作爲輸入信號,由歐拉公式,cosjωt=ejωt+ejωt2cosj{\omega}t = \frac{e^{j\omega t} + e^{-j\omega t}}{2},因此複頻率爲純虛數

  2. tflti傳參的問題
    這兩個函數較爲相似,在直接構建系統函數時,接受的參數應爲系統函數分子和分母各項的係數組成的列表,係數的分配是從右到左的,這點不難從上面的代碼中觀察得出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章