Preface
該系列文章是筆者複習研究生入學考試專業課,爲輔助理解使用Python進行實驗時所寫。要求讀者有電子信息方向本科大二及以上的基礎知識,包括模數電、信號與系統以及數字信號處理等。因此部分細節性的知識不再詳述。
本文使用的環境爲Matlab R2018b以及Python 3.7.1(由Anaconda管理)
波特圖
注意:此波特(Bode)非彼波特(Baud),後者是通信中的概念。
波特圖是線性非時變系統的傳遞函數對頻率的半對數座標圖,利用波特圖可以看出系統的頻率響應。又稱幅頻響應和相頻響應曲線圖。
以上摘自百度百科,波特圖在模擬系統的分析中十分重要。
頻率響應的計算來源於信號與系統的拉氏變換:將模擬系統看做線性時不變(LTI)系統,輸入電壓看做激勵信號,輸出電壓看做響應信號,那麼該系統就滿足(1)式:
其中是系統的衝激響應,對其進行拉氏變換,有
(2)式中的稱爲系統函數,已知系統函數滿足(3)式:
在理論分析中,一般認爲複頻率滿足(4)式(爲什麼?)
於是綜合(3)(4)兩式,易得
其中稱爲信號的幅頻特性,稱爲信號的相頻特性,它們都反映了系統的頻率特性。波特圖正是直觀反映它們的工具。
現在設某系統的系統函數爲(6)式,逐一討論如何使用matlab和python3繪製波特圖
使用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繪製波特圖
這裏必須安裝這麼幾個第三方庫:numpy
,scipy
,matplotlib
。可以使用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()
注意
代碼較爲簡單,因此就不上圖了
這裏交代兩個問題:
-
爲什麼?
答:因爲模電的理論分析中常用正弦信號作爲輸入信號,由歐拉公式,,因此複頻率爲純虛數 -
tf
和lti
傳參的問題
這兩個函數較爲相似,在直接構建系統函數時,接受的參數應爲系統函數分子和分母各項的係數組成的列表,係數的分配是從右到左的,這點不難從上面的代碼中觀察得出