一階RC濾波器的演算法實現(低通和高通)3102
阿新 • • 發佈:2018-12-02
目前,專案需要處理訊號。目標訊號是特定頻率範圍內的訊號。高頻視為干擾。而一階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。
假設電路的輸出阻抗很大(即不帶任何負載),輸入阻抗很小(理想情況)。可以得到以下公式:
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 [email protected]=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存放濾波結果
}
}
}