C でバターワース フィルターを実装する必要があります。この機能を備えたライブラリを入手したり、コードを記述したりする方が簡単ですか?

最近取り組んだプロジェクトの一部のデータにバターワース フィルターを適用する必要がありました。 (測定器が熱くなるため、時間の経過とともに変動する圧力測定。)実際には、ライブラリを含めるよりもさらに簡単です。実際には、関数を 1 つインクルードし、それを使用する必要のある C ファイルに追加するだけです。

これは、フィルターを生成するために使用したサイトです:

http://www-users.cs.york.ac.uk/~fisher/mkfilter/

パラメータを指定すると、関数が生成されます。上記の Web サイトで生成されたコードに基づいて、アプリケーションで使用した関数の例を次に示します。 (これは PC で開発されているが、組み込みプラットフォームを対象としているため、DOUBLE を型定義します。サイズが変わらないことを確認する必要があります。)

私はこのサイトを読むのが大好きです。ついに何か貢献できることをうれしく思います!

/* Butterworth filter constants */

#define NZEROS 4
#define NPOLES 4
static DOUBLE xv[NZEROS+1], yv[NPOLES+1];

/* Sampling rate 3000 for testing existing */
/* raw data.  Change to 300 for final product */
#define SAMPLING_RATE 3000

/*******************************************************************************
 * Function:      ButterworthFilter
 *
 * Description:   This function uses the Butterworth filter and returns a new
 *                value for an individual floating point value.
 *
 * Access:        PRIVATE
 *
 * Parameters:    DOUBLE input - value to be converted
 *
 * Globals:       None
 *
 * Returns:       DOUBLE - new value that has been converted
 ******************************************************************************/
static DOUBLE ButterworthFilter (DOUBLE input)
{ 
    /* http://www-users.cs.york.ac.uk/~fisher/cgi-bin/mkfscript */
    /* Butterworth Bandpass filter */
    /* 2nd order */
    /* sample rate - choice of 300 or 3000 Hz */
    /* corner1 freq. = 0.5 or 1 Hz */
    /* corner2 freq. = 20 Hz */
    /* removes high and low frequency noise */

    DOUBLE dCoefficient1 = 0.0;
    DOUBLE dCoefficient2 = 0.0;
    DOUBLE dCoefficient3 = 0.0;
    DOUBLE dCoefficient4 = 0.0;
    DOUBLE dCoefficient5 = 0.0;
    DOUBLE dGain = 0.0;

    /* coefficients will vary depending on sampling rate */
    /* and cornering frequencies                         */
    switch(SAMPLING_RATE)
    {
        case 300:
            /* 1 to 20 Hz */
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.5698403540;
            dCoefficient3 = 2.5753677309;
            dCoefficient4 = -4.4374523505;
            dCoefficient5 = 3.4318654424;
            dGain = 3.198027802e+01;
            break; 

        case 3000:
        default:
            /* 0.5 to 20 Hz */ 
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.9438788347;
            dCoefficient3 = 3.8299315572;
            dCoefficient4 = -5.8282241502;
            dCoefficient5 = 3.9421714258;
            dGain = 2.406930558e+03;
            break;  
    } 

    xv[0] = xv[1]; 
    xv[1] = xv[2]; 
    xv[2] = xv[3]; 
    xv[3] = xv[4]; 
    xv[4] = (DOUBLE)(input / dGain);
    yv[0] = yv[1]; 
    yv[1] = yv[2]; 
    yv[2] = yv[3]; 
    yv[3] = yv[4]; 
    yv[4] = (DOUBLE)((xv[0] + xv[4]) - (dCoefficient1 * xv[2]) + (dCoefficient2 * yv[0]) +
                    (dCoefficient3 * yv[1]) + (dCoefficient4 * yv[2]) +
                    (dCoefficient5 * yv[3]));

    return (yv[4]);
}

自明ではないフィルタを自分でコーディングするよりも、十分にテストされた外部ライブラリを使用する方が (見つけることができると仮定して....Google はもう試しましたか?)、ほぼ間違いなく簡単で安全です。

しかし、アプリケーションやデータの形式などについて何も言われていないので、私たちがお伝えできることはこれ以上ありません.

あなたの IDE (CodeBlocks) がどのように機能するかはわかりませんが、ライブラリをどのように利用できるようにするかによって、通常のインポートは次の 3 つの形式のいずれかになります (詳細は後述)。

<オール>
  • ソース コードを入手する 1 つまたは複数の機能について (できれば適切なドキュメントがあれば):ドキュメントを読み、コードを適切なディレクトリにコピーし、ファイルをプロジェクトに追加し、コンパイルを試み、不足しているプリプロセッサ シンボルを修正するなど...
  • お使いのプラットフォーム用のプレーン バイナリ ライブラリとヘッダーを取得します (おそらく OS パッケージ管理システムから):ドキュメントを読み、IDE にヘッダーとライブラリの場所を伝え、リンクを試み、問題を修正します...
  • 機能を提供するフレームワークを取得します :これは少し手間がかかりますが、ドキュメントを読むことから始まり、おそらくライブラリの場合と同じように進みますが、さらに多くのコードを記述する必要があります...
  • いずれにせよ、あなたはある時点でやっているでしょう

    #include "library.h"
    

    おそらく、最初に候補となるライブラリを見つけて、それがどのような形で提供されているかを確認し、次に IDE について詳しく読んで、そこからどこへ行くかを確認したいと思うでしょう。

    あなたのニーズに関連する可能性のある別の SO の質問:アナログ回路シミュレーション ライブラリ?

    matlab を使用してから長い時間が経ちましたが、それが基本的なプログラミング経験である場合は、たくさんあることに注意してください。 単純なバニラではない、matlab が提供した機能の c.ほとんどの場合、フレームワークまたは別のフレームワークを使用して、そのサポートの一部を提供したいと考えています。


    Matlab を使用している場合、C コードから Matlab にリンクすることはタブーですか?これが出発点です。 C から呼び出して、Matlab インターフェイス内から実行できることは何でも実行するように、実際に Matlab エンジンに要求できます。

    バタワース フィルターは再帰的であるため、IIR フィルターとして実装する必要があります。 Matlab テストから安定したフィルター係数を取得したら、単純にそれらを一般的な IIR アルゴリズムにフィードできます (非常に単純です)。大規模な FIR フィルターと畳み込みを使用してフィルター応答を概算し、これを周波数領域に移動して位相の問題を解決できますが、それを行うと真のバターワースではありません。

    学習演習としてアルゴリズムをゼロから構築することをお勧めしますが、できるだけ早くそれが必要な場合は、おそらく役立つライブラリがたくさんあります。これは検索で出てきました。