我使用以下函数来过滤信号。该代码适用于第4阶段,但是当我使用更高阶,如5时,我在输出中得到NaN值。非常感谢您的帮助
void filt(int ord, double a[], double b[], int np, double x[], ArrayList<Double> array)
{
int i,j;
// y[0]=b[0]*x[0];
array.add(0, b[0]*x[0]);
for (i=1;i<ord+1;i++)
{
array.add(i, 0.0);
for (j=0;j<i+1;j++)
array.add(i, array.get(i)+b[j]*x[i-j]);
for (j=0;j<i;j++)
array.add(i, array.get(i)-a[j+1]*array.get(i-j-1));
}
for (i=ord+1;i<np;i++)
{
array.add(i, 0.0);
for (j=0;j<ord+1;j++)
array.add(i, array.get(i)+b[j]*x[i-j]);
for (j=0;j<ord;j++)
array.add(i, array.get(i)-a[j+1]*array.get(i-j-1));
}
}
答案 0 :(得分:0)
我尝试了Matlab的相同功能,并获得了NaN值。我深入研究了Matlab文档,发现以下内容解释了NaN值:
&#34;对于高阶滤波器(可能从8阶开始),当使用[b,a]语法形成传递函数时,可能会发生由于舍入误差引起的数值问题。&#34; 因此,对于更高的订单,butterworth过滤器是不稳定的。
要在Matlab中解决此问题,请尝试以下操作:
n = 6; Wn = [2.5e6 29e6]/500e6;
ftype = 'bandpass';
% Transfer Function design
[b,a] = butter(n,Wn,ftype);
h1=dfilt.df2(b,a); % This is an unstable filter.
% Zero-Pole-Gain design
[z, p, k] = butter(n,Wn,ftype);
[sos,g]=zp2sos(z,p,k);
h2=dfilt.df2sos(sos,g);
% Plot and compare the results
hfvt=fvtool(h1,h2,'FrequencyScale','log');
legend(hfvt,'TF Design','ZPK Design')