8

私のプロジェクトはCで、CodeBlocksは私のIDEであり、WindowsVistaで実行しています。データにバターワースフィルターを適用する必要があります。この(および他の)フィルターが組み込み関数として含まれているため、Matlabを使用してこれを自動的に行うことができます。コンピューターとプログラミングは私の領域ではなく、新しいライブラリを「インポート」したことは一度もないので、これを行う方法がわかりません。複雑ですか?そして、私がするのが最善でしょうか?バターワースフィルターのコードを関数として記述しますか?または、ライブラリを「インポート」して、これを実行しますか?(個人的には、それほど複雑でない場合は、ライブラリを取得することをお勧めします。これは、おそらく他のタイプのフィルターもテストできるためです)

4

5 に答える 5

33

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

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

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

パラメータを指定すると、関数が生成されます。上記のウェブサイトで生成されたコードに基づいて、アプリケーションで使用した関数の例を次に示します。(PCで開発されているため、typedef 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]);
}
于 2009-03-20T04:27:33.970 に答える
5

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

しかし、あなたはあなたのアプリケーションやあなたのデータのフォーマットなどについて何も言っていないので、私たちがあなたに話すことができることはほとんどありません。


IDE(CodeBlocks)がどのように機能するかについては何も知りませんが、ライブラリを利用できるようにする方法に応じて、通常のインポートは3つの形式のいずれかを取ります(詳細は以下を参照)。

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

いずれにせよ、あなたはある時点でやっているでしょう

#include "library.h"

一部のソースファイルで、外部機能をコードから見えるようにします。

おそらく、最初に候補ライブラリを見つけて、それがどのような形式で提供されているかを確認してから、IDEの詳細を読んで、そこからどこに行くのかを確認する必要があります。


あなたのニーズに関連するかもしれないもう一つのSOの質問:アナログ回路シミュレーションライブラリ?


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

于 2009-03-20T03:37:39.907 に答える
3

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

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

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

于 2009-03-20T04:25:59.247 に答える
1

Steve Harris の SWH LADSPA プラグイン パッケージにはバターワース フィルターがあります。

http://plugin.org.uk

編集:Cコードがさまざまな理由でRDFに埋め込まれ、自動的に生成されたことを思い出しました。

于 2009-10-16T22:23:19.230 に答える
0

これは最高のフィルタージェネレーターです http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

残念ながら、C コード生成で失敗し始めました。しかし、 Mike が提案するものと同様のプログラムを再現できるように、C コードに近い形式で十分な情報を出力します。そのために追加のライブラリは必要ありません。ライブラリは、係数 (可変カットオフ周波数) を更新する場合に役立ちます。プログラムでこれらの係数を計算するアルゴリズムを知りません。

于 2013-05-27T16:23:47.190 に答える