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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一阶RC滤波器的算法实现(低通和高通)

發(fā)布時(shí)間:2024/3/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一阶RC滤波器的算法实现(低通和高通) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目前,項(xiàng)目需要處理信號(hào)。目標(biāo)信號(hào)是特定頻率范圍內(nèi)的信號(hào)。高頻視為干擾。而一階RC濾波器容易實(shí)現(xiàn)。但是網(wǎng)上資料往往沒(méi)有詳細(xì)的推導(dǎo)。因此在這里把筆記記下。本文的優(yōu)勢(shì)是比較詳細(xì),參數(shù)配置都有公式依據(jù)。

目錄

1、一階RC低通濾波器的算法實(shí)現(xiàn)

1.1 算法推導(dǎo)

1.2 波特圖

1.3 用C語(yǔ)言實(shí)現(xiàn)

?2、一階RC高通濾波器的原理以及實(shí)現(xiàn)

2.1 原理推導(dǎo)

2.2 波特圖

2.3 用C語(yǔ)言實(shí)現(xiàn)

3 上機(jī)測(cè)試


1、一階RC低通濾波器的算法實(shí)現(xiàn)

1.1 算法推導(dǎo)

一階RC濾波器的硬件電路如圖:

圖中輸入電壓是Vi,電阻R,電容C,輸出電壓為Vo。

假設(shè)電路的輸出阻抗很大(即不帶任何負(fù)載),輸入阻抗很小(理想情況)。可以得到以下公式:

電容的阻抗是。

截止頻率,此頻率下的信號(hào),通過(guò)這個(gè)電路,輸出電壓和輸入電壓的關(guān)系式是

或者時(shí)域上的表達(dá)式:

上式離散后,可以得到:

假如要過(guò)濾掉10KHz以上的頻率,可以選擇fcut = 1K,并計(jì)算RC的值,代入上式。

1.2 波特圖

用Octave或者M(jìn)atlab可以得到傳遞函數(shù)的波特圖:

  • fcut =1000;

  • RC=1/2/pi/fcut;

  • %pkg load control %Octave用的讀取control包

  • y1 = tf(1,[RC,1])

  • bode(y1)

  • 以上波特圖可見(jiàn),在截止頻率處(,代入f=1k,可得截至角頻率是6283 rad/s),信號(hào)會(huì)衰減到原來(lái)的0.707。這電路對(duì)頻率大于截止頻率的高頻信號(hào),具有比較強(qiáng)的衰減作用,同時(shí)對(duì)該信號(hào)有比較大的相位移動(dòng)。

    ?

    1.3 用C語(yǔ)言實(shí)現(xiàn)

    C語(yǔ)言的實(shí)現(xiàn)1

  • /**

  • * @brief implement 1 order RC low pass filter

  • * raw data filtered by a simple RC low pass filter@cufoff=5Hz

  • * @param Vi : Vi(k)

  • * @param Vi_p : Vi(k-1)

  • * @param Vo : Vo(k)

  • * @param Vo_p : Vo(k-1)

  • * @note This example shows a simple way to report end of conversion

  • * and get conversion result. You can add your own implementation.

  • * @retval None

  • */

  • void LowPassFilter_RC_1order(float *Vi, float *Vo, float *Vo_p, float sampleFrq )

  • {

  • float CutFrq, RC, Cof1, Cof2;

  • ?
  • //low pass filter @cutoff frequency = 5 Hz

  • CutFrq = 5;

  • RC = (float)1.0/2.0/PI/CutFrq;

  • Cof1 = 1/(1+RC*sampleFrq);

  • Cof2 = RC*sampleFrq/(1+RC*sampleFrq);

  • *Vo = Cof1 * (*Vi) + Cof2 * (*Vo_p);

  • ?
  • //update

  • *Vo_p = *Vo;

  • }

  • 調(diào)用例子:

  • ?
  • float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  • ?
  • ?
  • LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

  • C語(yǔ)言實(shí)現(xiàn)2:

  • ?
  • //*********** Structure Definition ********//

  • typedef struct {

  • float Vi;

  • float Vo_prev;

  • float Vo;

  • float Fcutoff;

  • float Fs;

  • } LPF_1orderRC_F;

  • //*********** Structure Init Function ****//

  • void LPF_1orderRC_F_init(LPF_1orderRC_F *v)

  • {

  • v->Vi=0;

  • v->Vo_prev=0;

  • v->Vo=0;

  • ?
  • //low pass filter @cutoff frequency = 5 Hz

  • v->Fcutoff=5;

  • ?
  • // execute 1000 every second

  • v->Fs=1000;

  • }

  • ?
  • //*********** Function Definition ********//

  • float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)

  • {

  • float RC, Cof1, Cof2;

  • ?
  • RC = (float)1.0/2.0/PI/v->Fcutoff;

  • Cof1 = 1/(1+RC*v->Fs);

  • Cof2 = RC*v->Fs/(1+RC*v->Fs);

  • ?
  • v->Vo = Cof1 * v->Vi + Cof2 * v->Vo_prev;

  • ?
  • v->Vo_prev = v->Vo;

  • ?
  • return v->Vo;

  • }

  • ?
  • LPF_1orderRC_F lpf_1orderrc_handle;

  • ?
  • 調(diào)用方式:

  • ...

  • int main(void)

  • {

  • ...

  • LPF_1orderRC_F_init(&lpf_1orderrc_handle); //初始化

  • while(1)

  • {

  • ...

  • if(flag_1ms==1)

  • {

  • lpf_1orderrc_handle.Vi = ADCresult; //假設(shè)ADCresult是ADC采樣結(jié)果

  • LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle); //usage

  • FilteredResult = lpf_1orderrc_handle.Vo; //FilteredResult存放濾波結(jié)果

  • }

  • }

  • }

  • ?
  • ?

    ?

    ?

    ?2、一階RC高通濾波器的原理以及實(shí)現(xiàn)

    2.1 原理推導(dǎo)

    這是一節(jié)RC高通濾波器的原理圖:

    截止頻率

    寫(xiě)成時(shí)域上的表達(dá)式:

    離散化后得到:

    根據(jù)設(shè)定的截止頻率,假如目標(biāo)頻率是50Hz,截止頻率可以整定為0.5Hz,過(guò)濾低頻分量,而不影響目標(biāo)信號(hào)的采集。

    2.2 波特圖

    傳遞函數(shù)可又頻域函數(shù)轉(zhuǎn)換得到,將帶入頻域公式。得到:

    Octave繪制波特圖:

  • fcut =0.5;

  • RC=1/2/pi/fcut;

  • pkg load control

  • y1 = tf([RC,0],[RC,1])

  • bode(y1)

  • ?

    ?

    高通濾波器對(duì)截至頻率以上的信號(hào)無(wú)大影響,信號(hào)能正常經(jīng)過(guò)濾波器。但是該濾波器對(duì)截至頻率以下的信號(hào),具有較大的影響。和截至頻率相比,頻率越小,衰減作用越明顯。同時(shí)在相位圖中可見(jiàn),對(duì)頻率越低的信號(hào),相位移動(dòng)也越大。

    ?

    2.3 用C語(yǔ)言實(shí)現(xiàn)

    C語(yǔ)言的實(shí)現(xiàn)1:

  • void HighPassFilter_RC_1order(float *Vi, float *Vi_p, float *Vo, float *Vo_p, float sampleFrq )

  • {

  • float CutFrq, RC, Coff;

  • ?
  • //high pass filter @cutoff frequency = 0.5 Hz

  • CutFrq = 0.5;

  • RC = (float)1.0/2.0/PI/CutFrq;

  • Coff = RC/(RC + 1/sampleFrq);

  • *Vo = ((*Vi) - (*Vi_p) +(*Vo_p) )*Coff ;

  • ?
  • //update

  • *Vo_p = *Vo;

  • *Vi_p = *Vi;

  • }

  • 調(diào)用例子:

  • ?
  • float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;

  • ?
  • ?
  • HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

  • 調(diào)用時(shí),1000是指每秒需要執(zhí)行這個(gè)函數(shù)1000次。

    C語(yǔ)言實(shí)現(xiàn)2:

  • ?
  • #define PI 3.1415

  • ?
  • ?
  • //*********** Structure Definition ********//

  • typedef struct {

  • float Vi;

  • float Vi_prev;

  • float Vo_prev;

  • float Vo;

  • float Fcutoff;

  • float Fs;

  • } HPF_1orderRC_F;

  • //*********** Structure Init Function ****//

  • void HPF_1orderRC_F_init(HPF_1orderRC_F *v)

  • {

  • v->Vi=0;

  • v->Vi_prev=0;

  • v->Vo_prev=0;

  • v->Vo=0;

  • ?
  • //high pass filter @cutoff frequency = 0.05 Hz

  • v->Fcutoff=0.05;

  • ?
  • // execute 1000 every second

  • v->Fs=1000;

  • }

  • ?
  • //*********** Function Definition ********//

  • float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)

  • {

  • float RC, Coff;

  • ?
  • RC = (float)1.0/2.0/PI/v->Fcutoff;

  • Coff = RC/(RC + 1/v->Fs);

  • v->Vo = (v->Vi - v->Vi_prev + v->Vo_prev ) * Coff;

  • ?
  • //update

  • v->Vo_prev = v->Vo;

  • v->Vi_prev = v->Vi;

  • ?
  • return v->Vo;

  • }

  • ?
  • HPF_1orderRC_F hpf_1orderrc_handle;

  • 調(diào)用例子:

  • ...

  • int main(void)

  • {

  • ...

  • HPF_1orderRC_F_init(&hpf_1orderrc_handle); //初始化

  • while(1)

  • {

  • ...

  • if(flag_1ms==1)

  • {

  • hpf_1orderrc_handle.Vi = ADCresult; //假設(shè)ADCresult是ADC采樣結(jié)果

  • ?
  • FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放濾波結(jié)果

  • }

  • }

  • }

  • ?
  • ?

    3 上機(jī)測(cè)試

    板子上面MCU采用STM32F103C8,外擴(kuò)了USB轉(zhuǎn)UART模塊,外擴(kuò)了PIR+運(yùn)放模塊。

    在STM32F103C8上面,PA7連接了某信號(hào)源。USART1和FT232模塊連接,與電腦通信。

    單片機(jī)對(duì)PA7的采樣信號(hào)進(jìn)行濾波處理,目的是把目標(biāo)信號(hào)的直流部分和高頻部分濾除,得到0.05Hz-5Hz以內(nèi)的分量。

    上位機(jī)使用了SerialChart-0.3.4,把信號(hào)波形顯示。效果如下圖。數(shù)據(jù)第一列是時(shí)間戳,第二列是原始數(shù)據(jù),第三列是濾波后的數(shù)據(jù)。Chart中,藍(lán)色是第二列原始數(shù)據(jù),紅色是第三列濾波后的數(shù)據(jù)。

    可以看到,濾波器對(duì)直流信號(hào)有衰減作用。

    總結(jié)

    以上是生活随笔為你收集整理的一阶RC滤波器的算法实现(低通和高通)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。