一阶RC滤波器,数字滤波器
目前,項(xiàng)目需要處理信號(hào)。目標(biāo)信號(hào)是特定頻率范圍內(nèi)的信號(hào)。高頻視為干擾。而一階RC濾波器容易實(shí)現(xiàn)。但是網(wǎng)上資料往往沒有詳細(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),通過這個(gè)電路,輸出電壓和輸入電壓的關(guān)系式是
或者時(shí)域上的表達(dá)式:
上式離散后,可以得到:
假如要過濾掉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)
以上波特圖可見,在截止頻率處(,代入f=1k,可得截至角頻率是6283 rad/s),信號(hào)會(huì)衰減到原來的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高通濾波器的原理圖:
截止頻率
寫成時(shí)域上的表達(dá)式:
離散化后得到:
根據(jù)設(shè)定的截止頻率,假如目標(biāo)頻率是50Hz,截止頻率可以整定為0.5Hz,過濾低頻分量,而不影響目標(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)過濾波器。但是該濾波器對(duì)截至頻率以下的信號(hào),具有較大的影響。和截至頻率相比,頻率越小,衰減作用越明顯。同時(shí)在相位圖中可見,對(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)有衰減作用。
---------------------?
作者:xx健?
來源:CSDN?
原文:https://blog.csdn.net/qq_27158179/article/details/82661297?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的一阶RC滤波器,数字滤波器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批处理系统、分时处理系统、实时处理系统简
- 下一篇: 【2021祥云杯】 鸣雏恋