2009-07-02 4 views
3

私はあなたの助けが必要です、そして私の質問を読んでくれてありがとう! 現在、Direket Form 2 Transposed Filterを使用するJavaプログラムを作成中です。私はMatlabの関数フィルタはそれだけでうまくいくことを知っていますが、私はJavaを使用する必要があります。 このDirekt Form 2 Transposeを実装することを知っている人はいますか?この数学関数は、この数学関数です。デジタルフィルタ、Javaの数学、

y(n)= b(1)* x(n)+ b(2)* x(n-1)+。 (n + 1)* y(n-na)

··························+ b(nb + 1)* x(n-nb) - 任意のプログラム言語で

?それが必要なのはうまくいけば方向を指すことなので、私はそれを理解することができます!たぶんmatlab関数のいくつかを実装するC Libがあります。

だからあなたの時間をありがとうございました

あなたELEKTRO

はフォローアップ:

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

これは、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 =フィルタ(1、LPC_Faktor、OldArray)

私がしなければならないことは、フィルタ機能を実装することだけです。

もう一度お手伝いできますか?直接型II転置構造が非常にシンプルであるものは何でもあなたが使用している言語、

ELEKTRO

答えて

9

感謝。

例えば、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フィルタを実装するための最も簡単なフォームです(数値的に、特に固定小数点では最適ではありませんが、少ない操作しか必要としません)。

もちろん、より良い実装(サイクリングアレイなど)は可能です。必要な場合は、私もそれを提供することができます。

編集:私はあまりにも早く答えました。直接型IIが唯一最大を必要とするのに対し、あなたは

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) 

を提供するアルゴリズムは、それは+ナNB値を格納するために必要な(nはごフィルタの順で)直接型IIが、直接型I.ではありません(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) 

を教えてくださいです。

+0

はuが表すフロート何ですか? –

+0

uは答えです – ThibThib

+0

上記のアルゴリズムは直接フォームIフィルタですか?ダイレクトフォームIIトランスポーズアルゴリズムの実装を投稿する可能性はありますか? –

2

長い検索の後、私は

はあなたに感謝、答えを見つけることがrigth方法を示した:

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 */ 
+0

npとordは何ですか? – Nestor

+0

なぜそれを繰り返すのですか? – GorillaApe

+0

これを提供してくれてありがとう、非常に便利です。私はnpがこのリンクに従う配列のサイズだと思う:http://code.google.com/p/stevens-ssp-plugin/wiki/DataStructure – user261002