3

あなたの助けが必要です。私の質問を読んでくれてありがとう!私は現在、Direket Form 2 Transposed Filter を使用する Java Programm を作成しています。Matlab の関数フィルターがうまく機能することはわかっていますが、Java を使用する必要があります。この Direkt Form 2 Transposed 、この Math Function を実装することを知っている人はいますか?

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)

任意の Programmm 言語で? 必要なのは、うまくいけば、ライトの方向へのポイントです。そうすれば、私はそれを理解することができます! たぶん、いくつかの matlab 関数を実装する C Lib があるかもしれません。

それでは、お時間をいただきありがとうございます

あなたのエレクトロ

ファローアップ:

私はあなたの機能を理解するために数日間試みましたが、できませんでした.

これは 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)

フィルター機能を実装するだけです。

じゃあまた手伝ってくれる?

ありがとう

エレクトロ

4

2 に答える 2

9

どの言語を使用しても、直接形 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) のみを必要とします。Direct Form 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)

このフォームが必要かどうか教えてください。

于 2009-07-02T22:56:35.773 に答える
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 */
于 2009-07-11T11:51:47.400 に答える