2017-08-27 13 views
1

私はに、のAndroidでオーディオ信号のリアルタイムデジタルフィルタリングを実装しようとしています。私は私のハイパスフィルタのための標準的なコードを使用:の100 samplesと入力データのフィルタに200msjava Androidでのデジタルフィルタリングが遅すぎる

void doFilter(final short in[], short out[], int sizeIn) { 
    int i, j; 

    for (i = 0; i < sizeIn; i++) { 
     out[i] = 0; 
     for (j = 0; j < size; j++) 
      if (i >= j) out[i] += H[j] * in[i - j]; 
      else out[i] += H[j] * dataTail[i + size - j]; 
    } 
    System.arraycopy(in, sizeIn - size - 1, dataTail, 0, size); 
} 

問題は、このコードがリアルタイムでマイクからの信号をフィルタリングするために非常にゆっくりとを動作することですa 1700 samplesです。理由は何で、この問題を解決する方法は何ですか? アドバイス、高速信号フィルタリング用のライブラリを完成してください。ありがとうございます。

+0

変数を使用して合計を計算し、2番目(内側)のループの外側にあるout [i]に割り当てることができます。しかし、これだけが役に立つのかどうかはわかりません。 – h22

+0

@ h22これがどのように助けることができるのかよく分かりませんでした – SolderingIronMen

+0

配列メンバー[1]へのアクセスは1回の可変アクセスよりも遅く、ループで何度もやっています。私はAndroid Javaコンパイラがこれを最適化するのに十分スマートであるかどうかはわかりません。 – h22

答えて

1

C/C++と比較してJavaの計算が非常に遅いため、JNI用にAndroid NDKを使用してC/C++でメインロジックをコンパイルすることを検討してください。

+0

私はJNIを初めて使い慣れました。信号をフィルタリングするための準備ができているライブラリはありますか? – SolderingIronMen

+0

申し訳ありませんが、私は何らかの信号をフィルタリングしていません。基本的なCプログラミングを知っているなら、質問に載せたような単純な関数を実装するのは本当に簡単です。あなたがそれらを見つけることができない場合は、Android JNIを学ぶ、Googleでライブラリを検索します。 –

1

長さ100のFIRフィルタカーネルの場合、時間領域畳み込みではなく、ゼロ埋め込みのFFT/IFFTオーバーラップ加算/保存高速畳み込み法を使用する必要があります。これは、JNIの中でCで書かれた方が良いでしょう。私はライブラリを知らないが、アルゴリズムはいくつかのDSP教科書の中で説明されるかもしれない。

関連する問題