Android过滤器中的NaN值

时间:2014-04-06 14:05:47

标签: android filtering signal-processing

我使用以下函数来过滤信号。该代码适用于第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));
        }

    }

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')