低通濾波器和高通濾波器的程序實現原理推導

傅立葉變換,拉普拉斯變換和Z變換

對於信號分析而言,傅立葉變換是必不可少的,我們都知道傅立葉變換是把系統從時域變換到頻域進行分析,那麼拉普拉斯變換和Z變換是幹什麼的?簡單的來說,由於傅里葉變換的收斂有一個狄利克雷條件,要求信號絕對可積/絕對可和。對於那些不符合狄利克雷條件的信號該怎麼辦呢,我們將頻域的概念擴展到複頻域.首先要說明的是傅立葉變換大致有兩種,連續時間的傅立葉變換(CTFT)和離散的傅立葉變換(DTFT).而對於CTFT而言,拉普拉斯變換就是將連續時間系統的傅立葉變換擴展了;而對於DTFT而言,Z變換就是將離散時間系統的傅立葉變換擴展了.知乎上有一個很好的對三種變換的解釋:傅立葉變換、拉普拉斯變換、Z變換的聯繫


RC一階低通濾波器的算法推導

一階的RC電路如下:
這裏寫圖片描述
這裏直接給出其s域的傳遞函數:

VoutVin=1RCs+1,(s=jω)

對其進行z變換(一階後差分):
s=1z1T,T
則傳遞函數變爲:
Y(z)X(z)=TRC(1Z1)+T

又因爲Y(z)=Y(n)zn,Y(n1)Y(n)=z1 ,X(z)=X(n)zn,X(n1)X(n)=z1 ,代入到上式的傳遞函數得:
Y(n)=TT+RCX(n)+RCT+RCY(n1)

其中:
X(n):
Y(n1):
a=TT+RCTRC=ωT=2πfT
則濾波公式爲:
Y(n)=aX(n)+(1a)Y(n1)

這與px4代碼的lib庫中低通濾波是一樣的:
float BlockLowPass::update(float input)
{
    if (!PX4_ISFINITE(getState())) {
        setState(input);
    }

    float b = 2 * float(M_PI) * getFCut() * getDt();
    float a = b / (1 + b);
    setState(a * input + (1 - a)*getState());//input:本次採樣值 getState():上次濾波值
    return getState();
}

一階RC高通濾波器

RC高通濾波器原理圖如下,它和低通相反,電阻兩端的電壓作爲輸出,則其s域的傳遞函數爲:

VoutVin=RCsRCs+1

z 變換(一階後向差分):
s=1z1T

得到z 域的傳遞函數爲:
Y(z)X(z)=RC(1z1)RC(1z1)+T

同樣的,Y(z)=Y(n)zn,Y(n1)Y(n)=z1 ,X(z)=X(n)zn,X(n1)X(n)=z1 ,則有:
Y(n)=RCRC+T(X(n)X(n1)+Y(n1))

其中:
X(n):
X(n1):
Y(n1):
我們令令b=TT+RCTRC=ωT=2πfT ,a=11+b
則高通濾波的算法公式爲:
Y(n)=b(X(n)X(n1)+Y(n1))

這與px4中的高通濾波是一樣的:

float BlockHighPass::update(float input)
{
    float b = 2 * float(M_PI) * getFCut() * getDt();
    float a = 1 / (1 + b);
    setY(a * (getY() + input - getU()));//getY():上次濾波器輸出值;getU():上次濾波器輸入值
    setU(input);
    return getY();
}

這裏寫圖片描述


總結

關於低通濾波和高通濾波,最關鍵的是學到了三類變換的關係以及離散化的方法,留下各位大佬的博客鏈接在此:
【濾波器學習筆記】一階RC低通濾波
傅立葉變換、拉普拉斯變換、Z變換的聯繫
基礎電路—RC組成的低通、高通濾波器
雙線性變換
z變換

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