一阶RC滤波器的算法实现(低通和高通)
目前,項(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)題。
- 上一篇: 仙剑5手游服务器维护,仙剑奇侠传手游5月
- 下一篇: 读书笔记-偷影子的人