有限インパルス応答を持つデジタルフィルターの構築

遠くからの入場


最近、私は以前に出会ったことのないかなり興味深い仕事に直面しました-ノイズとの戦い。 センサーからアナログデジタルコンバーター(ADC)への信号を受信しました

そして、このトピックは(今では一部の場所で)私にとって暗い森だったので、質問でGoogleを苦しめに行きました。このトピックはあまり詳細にカバーされておらず、アクセス可能であるように思えたので、開発の例とすぐに使えるソースを含む記事を書くことにしました。



要点をつかむ


デジタルフィルターには、有限インパルス応答と無限インパルス応答(FIRおよびIIR)の2種類があります。 私の問題を解決するには、FIRフィルターが適しているので、それについて説明します。



まず、どのように機能するかを見てみましょう。







図に見られるように、ローパスフィルターの例がここに示されています。このフィルターは低周波数を通過させ、他の全員が遮断(抑制)または少なくとも弱化(遷移)を試みます。 通過帯域と抑制帯域の偏差は、受信信号に応じて選択されますが、さまざまな重み関数を使用する場合、一定の制限が課せられる場合があります。 たとえば、ハミング重み関数が使用される場合、これらの偏差は互いに等しくなります。

遷移帯域幅∆Fは、フィルター長と重み関数に依存します(ブラックマン関数の場合∆F = 5.5 | N)。



フィルターは非常に簡単に機能します。フィルターは値を受け取り、係数を使用して値を変換し、出力シーケンスを提供します。その後、フィルター自体の式ですべてが明らかになります。







サイクルを介して実装されますが、1分間待ちますが、必要な係数はどこで入手できますか? ここでは、1匹ではなく犬が埋葬されています。



フィルターオプション


当然、異なるフィルターには異なる係数が必要です。このため、フィルターパラメーターを決定する必要があります。これは通常、最初に理論的に行われ(スマートな外観で、信号の周波数を推定し、次にふるいにかける必要がある周波数を推定します)、実際の測定の周波数応答を調べます(そして実現します)どれだけ間違えたか)。

これらの周波数応答に基づいて、理想的な周波数応答(どの周波数が自由に通過するか、どの周波数を除去するか、どれだけ)を決定します。理想的な周波数応答のフーリエ変換として計算できる理想的なインパルス応答が必要になります。







ここで、H_D(w)は理想的な特性です。



しかし、より簡単な方法で行うことができます-たとえば、ローパスフィルターの場合、式は次のように事前に計算された理想的なインパルス特性が既にあります。









ここで、fcおよびwcはカットオフ周波数です。



したがって、少し理想が理想のままであり、私たちは練習に取り組んでおり、「本当の」インパルス応答が必要です。 それを計算するには、重み関数w(n)が必要です。フィルターの要件に応じていくつかの種類があります(Hamming、Henning、Blackman、Kaiser、記事はすでに大きいので、私はそれらについては話しません)。ブラックマン:







ここで、Nはフィルターの長さ、つまり 要因の数。



次に、理想的なインパルス応答と重み関数を乗算する必要があります。







フィニッシュライン


これで、フィルターの式に従って出力値を計算する準備が整いました。これがこの記事の最初であり、これですべてです。結論として、フィルターのソースコードを提供します。

void Filter (const double in[], double out[], int sizeIn) { const int N = 20; //  long double Fd = 2000; //    long double Fs = 20; //   long double Fx = 50; //   long double H [N] = {0}; //   long double H_id [N] = {0}; //   long double W [N] = {0}; //  //    double Fc = (Fs + Fx) / (2 * Fd); for (int i=0;i<N;i++) { if (i==0) H_id[i] = 2*M_PI*Fc; else H_id[i] = sinl(2*M_PI*Fc*i )/(M_PI*i); //    W [i] = 0.42 - 0.5 * cosl((2*M_PI*i) /( N-1)) + 0.08 * cosl((4*M_PI*i) /( N-1)); H [i] = H_id[i] * W[i]; } //   double SUM=0; for (int i=0; i<N; i++) SUM +=H[i]; for (int i=0; i<N; i++) H[i]/=SUM; //   1 //   for (int i=0; i<sizeIn; i++) { out[i]=0.; for (int j=0; j<N-1; j++)//     if(ij>=0) out[i]+= H[j]*in[ij]; } }
      
      







記事の準備に使用された:

主な特性とフィルターパラメーター。 analogiu.ru/6/6-5-2.html

Ayficher E. Jervis B.デジタル信号処理。 実用的なアプローチ。 第2版



All Articles