此鏈結的不太好不過可以看看,下邊的挺好
生成的濾波器係數檔案如下:
/* 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濾波器是有限長單位衝激響應濾波器,又稱為非遞迴型濾波器,是數字訊號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其...