【问题标题】:Digital Filter, Math in Java,数字滤波器,Java 中的数学,
【发布时间】:2010-11-07 19:10:16
【问题描述】:

我需要您的帮助,感谢您阅读我的问题! 我目前正在编写一个使用 Direket Form 2 转置过滤器的 java 程序。我知道 Matlab 中的函数过滤器可以做到这一点,但我必须使用 Java。 那么有谁知道你要实现这个 Direkt Form 2 Transposed ,这个数学函数:

y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

任何编程语言?所需要的只是希望指向 wrigth 方向,所以我可以弄清楚!也许有一个 C Lib 实现了一些 matlab 函数,什么都可以。

感谢您的宝贵时间

你的电子

跟进:

我尝试了几天来了解您的功能,但我不能。

这是来自Matlab的函数:过滤器

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/filter.html&http://www.google.de/search?hl=de&q=filter+matlab&btnG=Google-Suche&meta=&aq=f&oq=

我只知道我在 matlab 中使用这样的函数:

newArray = filter(1,LPC_Faktor,OldArray)

我所要做的就是实现过滤功能。

那么你能再帮忙吗?

谢谢

电子

【问题讨论】:

    标签: java math signal-processing


    【解决方案1】:

    无论您使用哪种语言,直接形式 II 转置结构都非常简单。

    例如,在 C 中,它可能是这样的:

    float myFilter( float u)
    {
      static float[nb] x = {0,0,0,...,0);  // initialize x
      static float[na] y = {0,0,0,...,0);  // initialize y
      static float b1 = ....;  // put b(1) here
      static float[nb] b = {...,...,...,...,...}; // put b(2) to b(nb+1) here
      static float[na] a = {...,...,...,...,...}; // put a(2) to a(na+1) values here
    
      // initialization
      float sum = 0;
      int i=0;
    
      // compute the value
      for(i=0;i<nb;i++)
        sum += b[i]*x[i];
      for(i=0;i<na;i++)
        sum -= a[i]*y[i];
      sum += b1*u;
    
      // prepare the values for the next time
      for(i=1;i<nb;i++)
        x[i] = x[i-1];
      x[0] = u;
      for(i=1;i<na;i++)
        y[i] = y[i-1];
      y[0] = sum;
    
      // return the value
      return sum;
    }
    

    我没有测试代码,但它是这样的。

    直接形式 II 转置是实现 FIR 滤波器的最简单形式(在数值上,特别是在定点中,它不是最好的,但它是需要较少操作的形式)。

    当然,可以有更好的实现(例如,使用循环数组)。如果需要,我也可以提供。

    编辑:我回答得太快了。你提供的算法

    y(n) = b(1)x(n) + b(2)x(n-1) + ... + b(nb+1)x(n-nb) - a(2)y(n-1) - ... - a(na+1)*y(n-na)
    

    不是直接形式 II,而是直接形式 I。它需要存储 na+nb 值(n 是您的过滤器的顺序),而直接形式 II 只需要 max(na,nb)。 用于直接形式 II 的算法是

    e(n) = u(n) - a(1)*e(n-1) - a(2)*e(n-2) - ... - a(na)*e(n-na)
    y(n) = b(1)*e(n-1) + b(2)*e(n-2) + ... + b(nb)*e(n-nb)
    

    告诉我你是否需要这个表格。

    【讨论】:

    • float u 代表什么?
    • 那么上面的算法是针对我过滤的直接形式吗?有没有机会发给我直接形式 II 转置算法的实现?
    【解决方案2】:

    经过长时间的搜索,我找到了答案,

    谢谢你展示了正确的方式:

    filter(int ord, float *a, float *b, int np, float *x, float *y)
    {
        int i,j;
        y[0]=b[0] * x[0];
        for (i=1;i<ord+1;i++)
        {
            y[i]=0.0;
            for (j=0;j<i+1;j++)
                y[i]=y[i]+b[j]*x[i-j];
            for (j=0;j<i;j++)
                y[i]=y[i]-a[j+1]*y[i-j-1];
        }
        /* end of initial part */
        for (i=ord+1;i<np+1;i++)
        {
            y[i]=0.0;
            for (j=0;j<ord+1;j++)
                y[i]=y[i]+b[j]*x[i-j];
            for (j=0;j<ord;j++)
                y[i]=y[i]-a[j+1]*y[i-j-1];
        }
    } /* end of filter */
    

    【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2022-01-07
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多