IIR濾波器分階計算

2021-09-16 13:41:38 字數 3290 閱讀 1181

此鏈結的不太好不過可以看看,下邊的挺好

生成的濾波器係數檔案如下:

/* general type conversion for matlab generated c-code */

#include 「tmwtypes.h」

#define mwspt_nsec 7

const int nl[mwspt_nsec] = ;

const real64_t num[mwspt_nsec][3] = ;

const real64_t den[mwspt_nsec][3] = ,

, double b[3][3] = ,

, ,注意上面係數檔案中還有乙個增益:

double gain = 0.09065504059673;

這個增益最好在第一級實現以後加入運算。這樣可以減小誤差,保證資料 動態範圍不被溢位。尤其是在定點計算的時候尤為如此。

2階節iir濾波的直接實現

乙個2階節結構是下面這樣乙個表示式:

實現上面這個表示式需要4個過去的歷史值,把它定義在結構體

typedef struct tag_ iir_state_2order

float y2;

float y1;

float x1;

float x0;

} iir_state_2order;

呼叫下面函式之前需要把上述結構體所有值初始化為零。濾波按一幀一幀資料進行。

#define one_frame_sample_size 1024

void cy_signal_filter_by_iir(signed short* pcmin, iir_state_2order* filter_state, float a, float b, signed short* pcmout)

int i;

float x2;

float tmp;

for ( i = 0; i < one_frame_sample_size; i++ )

x2 = filter_state->x1;

filter_state->x1 = filter_state->x0;

filter_state->x0 = pcmin[i];

tmp = ( float )(b[0]* filter_state->x0 + b[1]* filter_state->x1 +

b[2] * x2 - a[1] * filter_state->y1 - a[2] * filter_state->y2);

if(tmp >= 32767)

if(tmp <= -32768)

pcmout[i] = (signed short)tmp;

filter_state->y2 = filter_state->y1;

filter_state->y1 = tmp;

有乙個簡單的技巧可以把上面的計算簡化,使得歷史狀態數由4減少為2。定義下面的表示式:

結構體定義如下:

typedef struct tag_ iir_state_2order

float st1;

float st2;

} iir_state_2order;

void cy_signal_filter_by_iir(signed short* pcmin, iir_state_2order* filter_state, float a, float b, signed short* pcmout)

int i;

float st;

float tmp_fl;

for ( i = 0; i < one_frame_sample_size; i++ )

st = (float)(pcmin[i] -  a[1] * filter_state->st1  - a[2] * filter_state-> st2);

tmp_fl = b[0] * st + b[1] * filter_state->st1 + b[2] * filter_state->st2;

filter_state->st2= filter_state->st1;

filter_state->st1 = st;

if(tmp_fl >= 32767.0)

if(tmp_fl <= -32768)

pcmout[i] = (signed short)tmp_fl;

6階節iir濾波的實現

有個上面的基礎,我們來實現上面設計的6階iir濾波器。

6階節分解為3個2階節級聯實現。每個2階節需要2個歷史狀態,總共需要6個歷史狀態。結構體定義如下:

typedef struct tag_iir_state_3order

double w01;

double w02;

double w11;

double w12;

double w21;

double w22;

}iir_state_6order;

**中陣列a,b,還有gain的定義見第一部分。

void cy_signal_filter_by_6th_iir(signed short* pcmin, iir_state_6order* filter_state, int sample_size)

double x1, x2, x3, tmp_f00, tmp_f10, tmp_f20;

int i;

double tmp_pcm;

for (i = 0; i < sample_size; i++)

if (x3 <= -32768)

pcmin[i] = (signed short)x3;

}

}

最後看下濾波的效果:

濾波之後的頻譜:

FIR濾波器與IIR濾波器

有限長單位衝激響應濾波器,又稱為非遞迴型濾波器 特點 fir濾波器的最主要的特點是沒有反饋迴路,穩定性強,故不存在不穩定的問題 fir具有嚴格的線性相位,幅度特性隨意設定的同時,保證精確的線性相位 fir設計方式是線性的,硬體容易實現 fir相對iir濾波器而言,相同效能指標時,階次較高,對cpu的...

IIR和FIR濾波器設計低通濾波器

設原始訊號為 採用iir濾波器和fir濾波器設計低通濾波器,比較兩類濾波器的濾波結果。要求 採用matlab語言實現,並分析結果。首先對原始訊號進行頻譜分析,確定濾波器引數。通過分析加噪訊號的頻譜,雜訊訊號為 原始訊號為 iir濾波器設計 按照數字濾波器技術指標 通帶邊界頻率wp 通帶最大衰減 阻帶...

FIR濾波器和IIR濾波器的區別

數字濾波器廣泛應用於硬體電路設計,在離散系統中尤為常見,一般可以分為fir濾波器和iir濾波器,那麼他們有什麼區別和聯絡呢。fir濾波器 定義 fir濾波器是有限長單位衝激響應濾波器,又稱為非遞迴型濾波器,是數字訊號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其...