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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

一阶RC滤波器,数字滤波器

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一阶RC滤波器,数字滤波器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目前,項目需要處理信號。目標信號是特定頻率范圍內的信號。高頻視為干擾。而一階RC濾波器容易實現。但是網上資料往往沒有詳細的推導。因此在這里把筆記記下。本文的優勢是比較詳細,參數配置都有公式依據。

目錄

1、一階RC低通濾波器的算法實現

1.1 算法推導

1.2 波特圖

1.3 用C語言實現

?2、一階RC高通濾波器的原理以及實現

2.1 原理推導

2.2 波特圖

2.3 用C語言實現

3 上機測試

1、一階RC低通濾波器的算法實現
1.1 算法推導
一階RC濾波器的硬件電路如圖:

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

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

電容的阻抗是。

截止頻率,此頻率下的信號,通過這個電路,輸出電壓和輸入電壓的關系式是

或者時域上的表達式:

上式離散后,可以得到:

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

1.2 波特圖
用Octave或者Matlab可以得到傳遞函數的波特圖:

fcut =1000;
RC=1/2/pi/fcut;
%pkg load control ? %Octave用的讀取control包
y1 = tf(1,[RC,1])
bode(y1)


以上波特圖可見,在截止頻率處(,代入f=1k,可得截至角頻率是6283 rad/s),信號會衰減到原來的0.707。這電路對頻率大于截止頻率的高頻信號,具有比較強的衰減作用,同時對該信號有比較大的相位移動。

?

1.3 用C語言實現
C語言的實現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;?? ??? ?
}
調用例子:

?
float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
?
?
LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);
C語言實現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;
?
調用方式:

...
int main(void)
{
? ? ...
? ? LPF_1orderRC_F_init(&lpf_1orderrc_handle); ? ?//初始化
? ? while(1)
? ? {
? ? ? ? ...
? ? ? ? if(flag_1ms==1)
? ? ? ? {
? ? ? ? ? ? lpf_1orderrc_handle.Vi = ADCresult; ? ? ? ?//假設ADCresult是ADC采樣結果
? ? ? ? ? ? LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle); ? ?//usage
?? ? ? ?FilteredResult = lpf_1orderrc_handle.Vo; ? ?//FilteredResult存放濾波結果
? ? ? ? }
? ? }
}
?
?

?

?

?2、一階RC高通濾波器的原理以及實現
2.1 原理推導
這是一節RC高通濾波器的原理圖:

截止頻率

寫成時域上的表達式:

離散化后得到:

根據設定的截止頻率,假如目標頻率是50Hz,截止頻率可以整定為0.5Hz,過濾低頻分量,而不影響目標信號的采集。

2.2 波特圖
傳遞函數可又頻域函數轉換得到,將帶入頻域公式。得到:

Octave繪制波特圖:

fcut =0.5;
RC=1/2/pi/fcut;
pkg load control
y1 = tf([RC,0],[RC,1])
bode(y1)
?

?

高通濾波器對截至頻率以上的信號無大影響,信號能正常經過濾波器。但是該濾波器對截至頻率以下的信號,具有較大的影響。和截至頻率相比,頻率越小,衰減作用越明顯。同時在相位圖中可見,對頻率越低的信號,相位移動也越大。

?

2.3 用C語言實現
C語言的實現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;?? ??? ?
}
調用例子:

?
float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
?
?
HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);
調用時,1000是指每秒需要執行這個函數1000次。

C語言實現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;
調用例子:

...
int main(void)
{
? ? ...
? ? HPF_1orderRC_F_init(&hpf_1orderrc_handle); ? ?//初始化
? ? while(1)
? ? {
? ? ? ? ...
? ? ? ? if(flag_1ms==1)
? ? ? ? {
? ? ? ? ? ? hpf_1orderrc_handle.Vi = ADCresult; ? ? ? ?//假設ADCresult是ADC采樣結果
? ? ? ? ? ??
? ? ? ? ? ? FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放濾波結果 ?
? ? ? ? }
? ? }
}
?
?

3 上機測試
板子上面MCU采用STM32F103C8,外擴了USB轉UART模塊,外擴了PIR+運放模塊。

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

單片機對PA7的采樣信號進行濾波處理,目的是把目標信號的直流部分和高頻部分濾除,得到0.05Hz-5Hz以內的分量。

上位機使用了SerialChart-0.3.4,把信號波形顯示。效果如下圖。數據第一列是時間戳,第二列是原始數據,第三列是濾波后的數據。Chart中,藍色是第二列原始數據,紅色是第三列濾波后的數據。

可以看到,濾波器對直流信號有衰減作用。
---------------------?
作者:xx健?
來源:CSDN?
原文:https://blog.csdn.net/qq_27158179/article/details/82661297?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

總結

以上是生活随笔為你收集整理的一阶RC滤波器,数字滤波器的全部內容,希望文章能夠幫你解決所遇到的問題。

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