【導(dǎo)讀】IIR濾波器又叫IIR數(shù)字濾波器,“遞歸濾波器”。遞歸濾波器,也就是IIR數(shù)字濾波器,顧名思義,具有反饋。FIR濾波器:有限長單位沖激響應(yīng)濾波器,又稱為非遞歸型濾波器,是數(shù)字信號處理系統(tǒng)中最基本的元件。
IR濾波器,F(xiàn)IR濾波器和窗口滑動濾波
通常,信號的頻譜處于有限的頻率范圍內(nèi),而噪聲的頻譜則散布在很廣的頻率范圍內(nèi),為了消除噪聲,可以把FIR濾波器或者IIR濾波器設(shè)計成合適的頻帶濾波器,進(jìn)行頻域濾波。
一般濾波器可以分為經(jīng)典濾波器和數(shù)字濾波器。
經(jīng)典濾波器:假定輸入信號中的有用成分和希望去除的成分各自占有不同的頻帶。如果信號和噪聲的頻譜相互重迭,經(jīng)典濾波器無能為力。比如 FIR 和 IIR 濾波器等。
現(xiàn)代濾波器:從含有噪聲的時間序列中估計出信號的某些特征或信號本身?,F(xiàn)代濾波器將信號和噪聲都視為隨機(jī)信號。包括 Wiener Filter、Kalman Filter、線性預(yù)測器、自適應(yīng)濾波器等
一、IIR濾波器
IIR濾波器又叫IIR數(shù)字濾波器,“遞歸濾波器”。遞歸濾波器,也就是IIR數(shù)字濾波器,顧名思義,具有反饋。IIR數(shù)字濾波器是一類遞歸型的線性時不變因果系統(tǒng)。
特點(diǎn):
lIR數(shù)字濾波器的系統(tǒng)函數(shù)可以寫成封閉函數(shù)的形式,具有反饋回路;
IIR數(shù)字濾波器的相位非線性,相位特性不好控制,隨截止頻率變化而變化,對相位要求較高時,需加相位校準(zhǔn)網(wǎng)絡(luò);
IIR濾波器有歷史的輸出參與反饋,同F(xiàn)IR相比在相同階數(shù)時取得更好的濾波效果;
IIR數(shù)字濾波器采用遞歸型結(jié)構(gòu),由于運(yùn)算中的舍入處理,使誤差不斷累積,有時會產(chǎn)生微弱的寄生振蕩。
IIR濾波原理圖
#define Pi 3.1415927f
/**************************************************************************
函數(shù)原型:void Calculate_FilteringCoefficient(float Time, float Cut_Off)
功 能:iir低通濾波參數(shù)計算
**************************************************************************/
void Calculate_FilteringCoefficient(float Time, float Cut_Off)
{
ACC_IIR_FACTOR = Time /( Time + 1/(2.0f*Pi*Cut_Off) );
// ACC_IIR_FACTOR為IIR濾波器因數(shù)
}
/**************************************************************************
函數(shù)原型: void ACC_IIR_Filter(struct _acc *Acc_in,struct _acc *Acc_out)
功 能: iir低通濾波
**************************************************************************/
void ACC_IIR_Filter(struct _acc *Acc_in,struct _acc *Acc_out)
{
Acc_out->x = Acc_out->x + ACC_IIR_FACTOR*(Acc_in->x - Acc_out->x);
Acc_out->y = Acc_out->y + ACC_IIR_FACTOR*(Acc_in->y - Acc_out->y);
Acc_out->z = Acc_out->z + ACC_IIR_FACTOR*(Acc_in->z - Acc_out->z);
}
二、FIR濾波器
FIR(Finite Impulse Response)濾波器:有限長單位沖激響應(yīng)濾波器,又稱為非遞歸型濾波器,是數(shù)字信號處理系統(tǒng)中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴(yán)格的線性相頻特性,同時其單位抽樣響應(yīng)是有限長的,因而濾波器是穩(wěn)定的系統(tǒng)。因此,F(xiàn)IR濾波器在通信、圖像處理、模式識別等領(lǐng)域都有著廣泛的應(yīng)用。
特點(diǎn):
FIR濾波器的最主要的特點(diǎn)是沒有反饋回路,穩(wěn)定性強(qiáng),故不存在不穩(wěn)定的問題;
FIR具有嚴(yán)格的線性相位,幅度特性隨意設(shè)置的同時,保證精確的線性相位;
FIR設(shè)計方式是線性的,硬件容易實現(xiàn);
FIR相對IIR濾波器而言,相同性能指標(biāo)時,階次較高,對CPU的性能要去較高。
FIR濾波原理圖
三、滑動窗口濾波
滑動平均濾波算法只采樣一次,將一次采樣值和過去的若干次采樣值一起求平均,得到的有效采樣值即可投入使用。如果取N個采樣值求平均,存儲區(qū)中必須開辟N個數(shù)據(jù)的暫存區(qū)。每新采集一個數(shù)據(jù)便存入暫存區(qū)中,同時去掉一個最老數(shù)據(jù),保存這N個數(shù)據(jù)始終是最新更新的數(shù)據(jù)。采用環(huán)型隊列結(jié)構(gòu)可以方便地實現(xiàn)這種數(shù)據(jù)存放方式。
#define Filter_Num 2
/**************************************************************************
函數(shù)原型: void Gyro_Filter(struct _gyro *Gyro_in,struct _gyro *Gyro_out)
功 能: gyro窗口滑動濾波
**************************************************************************/
void Gyro_Filter(struct _gyro *Gyro_in,struct _gyro *Gyro_out)
{
static int16_t Filter_x[Filter_Num],Filter_y[Filter_Num],Filter_z[Filter_Num];
static uint8_t Filter_count;
int32_t Filter_sum_x=0,Filter_sum_y=0,Filter_sum_z=0;
uint8_t i=0;
Filter_x[Filter_count] = Gyro_in->x;
Filter_y[Filter_count] = Gyro_in->y;
Filter_z[Filter_count] = Gyro_in->z;
for(i=0;i<Filter_Num;i++)
{
Filter_sum_x += Filter_x[i];
Filter_sum_y += Filter_y[i];
Filter_sum_z += Filter_z[i];
}
Gyro_out->x = Filter_sum_x / Filter_Num;
Gyro_out->y = Filter_sum_y / Filter_Num;
Gyro_out->z = Filter_sum_z / Filter_Num;
Filter_count++;
if(Filter_count == Filter_Num)
Filter_count=0;
}