matlab设计数字滤波器以及C语⾔实现
1、通过matlab设计数字滤波器如下图所⽰:
现在matlab⾃动给的是直接II型和⼆阶节,为了⽅便理解和书写,把它转换为直接I型,和单节点形式,在通过滤波器差分⽅程定义来实现C 预⾔的编写 2、转换为直接I型和单节点,并记录滤波器的核系数,在编辑中选择转换为单节,在编辑中选择转换结构转换为直接I型 于是就可以看到滤波器的核系数了:
3、c代码编写
double fenzi[9] = { 0.000806359865037099550304222628227535097 , 0,-0.003225439460148398201216890512910140387 , 0 , 0.004838159190222597084984901272264323779 ,0 ,-0.003225439460148398201216890512910140387 , 0 ,
0.000806359865037099550304222628227535097 };
double fenmu[9] = { 1.000 , -6.464172081463741115214816090883687138557 , 18.76567908459470146453895722515881061554 ,
-31.928376738735259721124748466536402702332 , 34.809516166787368263157986802980303764343 ,
-24.89914491212426739252805418800562620163 , 11.414211408951089765650976914912462234497,
-3.068150389674379141524696024134755134583 , 0.370814215929453461217946141914580948651 };
#define MAXPOINT 20
double xintemp[MAXPOINT];
double youtemp[MAXPOINT];
static int16_t fliterfun (float *pdatain , float *pdataout , uint16_t sizeofdata , uint16_t filterN , double *fenzi , double *fenmu) {
int16_t errorcode = 0;
uint16_t i = 0;
uint16_t j = 0;
memset((void*)&xintemp[0], 0, sizeof(double) * 20);
memset((void*)&youtemp[0], 0, sizeof(double) * 20);
if (filterN > MAXPOINT) {
errorcode = -1;
return errorcode;
}
for (i = 0; i < sizeofdata; i++) {
for(j = MAXPOINT-1 ; j > 0 ; j--){
xintemp[j] = xintemp[j-1];
youtemp[j] = youtemp[j-1];
}
xintemp[0] = (double)pdatain[i];
youtemp[0] = 0;
for (j = 0; j < filterN; j++) {
youtemp[0] = youtemp[0] + ((fenzi[j] * xintemp[j]) / fenmu[0]);
}
for (j = 1; j < filterN; j++) {
youtemp[0] = youtemp[0] - ((fenmu[j] * youtemp[j]) / fenmu[0]);
}
pdataout[i] = (float)youtemp[0];
}
return errorcode;
}
//调⽤
fliterfun(&ODATA[0], &ODATA[0] , 512, 9, &fenzi[0], &fenmu[0]);