日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

低通滤波器和高通滤波器的程序实现原理推导

發布時間:2024/3/7 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 低通滤波器和高通滤波器的程序实现原理推导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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


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

一階的RC電路如下:

這里直接給出其s域的傳遞函數:

VoutVin=1RCs+1,(s=jω)VoutVin=1RCs+1,(s=jω)
對其進行z變換(一階后差分):
s=1?z?1T,Ts=1?z?1T,T表示采樣周期
則傳遞函數變為:
Y(z)X(z)=TRC(1?Z?1)+TY(z)X(z)=TRC(1?Z?1)+T
又因為 Y(z)=Y(n)z?n,Y(n?1)Y(n)=z?1Y(z)=Y(n)z?n,且Y(n?1)Y(n)=z?1, X(z)=X(n)z?n,X(n?1)X(n)=z?1X(z)=X(n)z?n,且X(n?1)X(n)=z?1,代入到上式的傳遞函數得:
Y(n)=TT+RCX(n)+RCT+RCY(n?1)Y(n)=TT+RCX(n)+RCT+RCY(n?1)
其中:
X(n):X(n):本次采樣值
Y(n?1):Y(n?1):上次濾波值
a=TT+RCTRC=ωT=2πfTa=TT+RC≈TRC=ωT=2πfT
則濾波公式為:
Y(n)=a?X(n)+(1?a)?Y(n?1)Y(n)=a?X(n)+(1?a)?Y(n?1)
這與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+1VoutVin=RCsRCs+1
zz變換(一階后向差分):
s=1?z?1Ts=1?z?1T
得到 zz域的傳遞函數為:
Y(z)X(z)=RC(1?z?1)RC(1?z?1)+TY(z)X(z)=RC(1?z?1)RC(1?z?1)+T
同樣的, Y(z)=Y(n)z?n,Y(n?1)Y(n)=z?1Y(z)=Y(n)z?n,且Y(n?1)Y(n)=z?1, X(z)=X(n)z?n,X(n?1)X(n)=z?1X(z)=X(n)z?n,且X(n?1)X(n)=z?1,則有:
Y(n)=RCRC+T(X(n)?X(n?1)+Y(n?1))Y(n)=RCRC+T(X(n)?X(n?1)+Y(n?1))
其中:
X(n):X(n):本次采樣值
X(n?1):X(n?1):上次采樣值
Y(n?1):Y(n?1):上次濾波值
我們令令 b=TT+RCTRC=ωT=2πfTb=TT+RC≈TRC=ωT=2πfT, a=11+ba=11+b
則高通濾波的算法公式為:
Y(n)=b?(X(n)?X(n?1)+Y(n?1))Y(n)=b?(X(n)?X(n?1)+Y(n?1))
這與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變換

總結

以上是生活随笔為你收集整理的低通滤波器和高通滤波器的程序实现原理推导的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。