IIR 巴特沃斯II型滤波器设计与实现
低通滤波器的设计与实现
打开Matlab ,运行命令filterDesigner,选择IIR,巴特沃斯滤波器,设置采样频率,和低通滤波器截止频率。点击设计滤波器,如图1:
默认配置是 巴特沃斯滤波器 ,直接II型二阶节。为了便于C语言的计算,可以选择生成单节型。点击编辑,转换成单节。如同2:
点击目标,生成.C头文件,生成滤波器系数。
const int NL = 11;
const real64_T NUM[11] = {1.894397002288e-08,1.894397002288e-07,8.524786510297e-07,2.273276402746e-06,3.978233704805e-06,4.773880445766e-06,3.978233704805e-06,2.273276402746e-06,8.524786510297e-07,1.894397002288e-07,1.894397002288e-08
};
const int DL = 11;
const real64_T DEN[11] = {1, -7.591034810035, 26.16244792022, -53.86859767765,73.33349935454, -68.93050956294, 45.28447142245, -20.52295845359,6.138318579144, -1.093760106583, 0.08814273308364
};
IIR滤波器C语言代码如下:
const int NL = 11;
const double NUM[11] = {1.894397002288e-08,1.894397002288e-07,8.524786510297e-07,2.273276402746e-06,3.978233704805e-06,4.773880445766e-06,3.978233704805e-06,2.273276402746e-06,8.524786510297e-07,1.894397002288e-07,1.894397002288e-08
};const int DL = 11;
const double DEN[11] = {1, -7.591034810035, 26.16244792022, -53.86859767765,73.33349935454, -68.93050956294, 45.28447142245, -20.52295845359,6.138318579144, -1.093760106583, 0.08814273308364
};double x_array[11];
double y_array[11];/** double plot::filter_iir_dfII(double* x_arr, double* y_arr,const double* filter_num,const double* filter_den, int filter_order, float input)* brief: IIR 直接II型滤波器*/
double plot::filter_iir_dfII(double* x_arr, double* y_arr,const double* filter_num,const double* filter_den, int filter_order, float input)
{int i = 0;double res = 0;res = res + input * filter_num[0];for (i=1; i<filter_order; i++){res = res + x_arr[i-1] * filter_num[i];res = res - y_arr[i-1] * filter_den[i];}for (i = filter_order-1; i > 0; i--){x_arr[i] = x_arr[i - 1];y_arr[i] = y_arr[i - 1];}x_arr[0] = input;y_arr[0] = res;return res;
}void plot::dataInit(void)
{//创建一个测试信号int fs = 1000; //采样频率
// float t = 0:1/fs:1; //时间向量 分辨率float t = 1.0 / fs;const float pi = 3.1415926;int i = 0;for (i = 0; i < _DATA_LENGTH; i++) {rawData[i] = sin(2 * pi * 50 * t * i) + sin(2 * pi * 150 * t * i) + sin(2 * pi * 250 * t * i);rawData2[i] = sin(2 * pi * 50 * t * i);}for (i = 0; i < _DATA_LENGTH; i += 1){filterData[i] = filter_iir_dfII(x_array,y_array,NUM,DEN,11,rawData[i]);}
}