📄 filterc.c
字号:
#include"math.h"
/*b:双精度实型二维数组,长度为ns*(n+1),存放滤波器分子多项式系数b[j][i]表示第j个n阶节的分子多项式的第i个系数;
a:双精度实型二维数组,长度为ns*(n+1),存放滤波器分母多项式系数a[j][i]表示第j个n阶节的分子多项式的第i个系数;
n:滤波器每节的阶数;
ns:滤波器的n阶节数:L;
x:长度len.开始存放滤波器输入序列,最后存放滤波器输出序列;分块处理时,用于表示当前块内的滤波器的输入序列和输出序列;
len:输入序列和输出序列长度;分块处理时,表示块的长度;
px:体积ns×(n+1);分块处理时,用于保存前一块滤波时的(n+1)个输入序列值px[j][]={x(k),x(k-1),...,x(k-m)};
py:体积ns×(n+1);分块处理时,用于保存前一块滤波时的n个输出序列值py[j][]={y(k-1),y(k-2),...,y(k-n)};
px、py为了防止x[k]过长而设,要初始化为0.*/
void filterc(b,a,n,ns,x,len,px,py)
int n,ns,len;
double a[],b[],x[],px[],py[];
{ int i,j,k,nl;
nl=n+1;
for( j=0;j<ns;j++)
{ for(k=0;k<len;k++)
{ px[j*nl+0]=x[k]; /*存放滤波器输入序列*/
x[k]=b[j*nl+0]*px[j*nl+0]; /*y(k)=b(j,0)*x(k);*/
for(i=1;i<=n;i++)
{ x[k]+=b[j*nl+i]*px[j*nl+i]-a[j*nl+i]*py[j*nl+i]; /*y(k)+=b(j,i)*x(k-i)-a(j,i)*y(k-i); i=1...n;*/
}
/*检验输出序列x[]的稳定性;*/
if(fabs(x[k])>1.0e10)
{ printf("This is an unstable filter!\n");
exit(0);
}
/*px,py向右平移一位;*/
for(i=n;i>=2;i--)
{ px[j*nl+i]=px[j*nl+i-1];
py[j*nl+i]=py[j*nl+i-1];
}
px[j*nl+1]=px[j*nl+0];
py[j*nl+1]=x[k]; /*存放运算后的输出序列x[k];*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -