非EE、ソフトウェアAPIコンテキストの「ローパスフィルター」


12

私は経験豊富なソフトウェアエンジニアであり、スマートフォンセンサーに取り組んでいます。DSPの基本的なEEクラスを受講し、自分の知識を応用しようとしています。畳み込み、伝達関数、z変換などを理解していると思います。FIRおよびIIRフィルターについて少し知っています。

今、ソフトウェアAPIとドキュメントを読むと、時間領域のセンサーデータにLPFを適用していることがわかります。私はあなたが差分方程式を使用してそれを行うことを知っています(例えば、y [i] = y [i-1] + 2 * x [i])ここで、時間信号を(たとえば)sinc波の係数と特定のカットオフ周波数で畳み込みます。したがって、「ローパスフィルター」の口語的な使用は、私にとって十分に正確ではありません。

たとえば、Google Android APIには次のドキュメントがあります:http : //developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

そのローパスフィルターをどのように解釈しますか?カットオフ周波数は何ですか?遷移帯域幅とは何ですか?平均化を行うためだけにこのLPFを使用していますか?


それは私にも迷惑を
かける

回答:


11

この例のフィルターは、一次無限インパルス応答(IIR)フィルターです。その伝達関数は次のとおりです。

Hz=1α1αz1

これは、次の差分方程式に対応します。

y[n]=αy[n1]+1αバツ[n]

ここで、はフィルター入力で、y [ n ]はフィルター出力です。バツ[n]y[n]

このタイプのフィルターは、多くの場合、低複雑度のローパスフィルターとして使用され、多くの場合、リーキーインテグレーターと呼ばます。単純な実装、計算の複雑さの低さ、および調整可能性のために好まれます。カットオフ周波数はの値に依存します。αは、間隔に値をとることができ、[ 0 1 α = 0の場合、フィルタリングはまったく行われません(出力は入力と等しくなります)。αが増加すると、フィルタのカットオフ周波数が低下します。α = 1は、カットオフ周波数が無限に低い(フィルター出力が常にゼロである)境界の場合と考えることができます。αα[01α=0αα=1

あなたは、フィルタ入力がによって重み付けされることを通知することにより、直感的に、この考えることができる量、したがって、パラメータが増加するにつれて、1 - α各入力サンプルは、任意の特定の出力サンプルの値に小さな比例効果を有しているので、減少します。これは、フィルターのインパルス応答を長期間にわたって塗りつぶす効果があります。長時間にわたる合計は、長い移動平均の計算に似ています。移動平均の長さが増加すると、平均のカットオフ周波数は減少します。α1α

たとえば、場合、フィルターの周波数応答は次のようになります。 α=0.8ここに画像の説明を入力してください

例から、このフィルターは、センサーからの測定値の時系列から高周波ノイズを平滑化するために使用され、関心のある比較的低周波の信号を抽出しようとしていると思います。これは、この種のフィルターの非常に典型的なアプリケーションです。

他のサブ質問では、入力信号とフィルターのインパルス応答の畳み込みによってフィルタリングが実装されることが多いことは正しいです。ほとんどの場合、これは有限インパルス応答(FIR)フィルターでのみ行われます。このようなIIRフィルターは通常、フィルターの差分方程式を使用して実装されます。IIRシステムのインパルス応答は無限に長いため、畳み込みを処理しやすいように有限の長さに切り捨てる必要があり、その時点でフィルターはIIRではなくなります。差分方程式の形式は、ほとんど常に計算的に実装する方が安価ですが、その構造に固有のフィードバックは、対処する必要のある数値の問題(内部オーバーフローや丸め誤差の累積など)につながる可能性があります。


ありがとう!いくつかのフォローアップの質問:(1)あなたの方程式H(z)= ...は差分方程式であると言いました。それは本当に伝達関数ですよね?差分方程式は厳密に時間領域のものであると思いました。(2)リーキーインテグレータでは、1.0は(Matlabのように)sampling_frequency / 2に対応しますか?(3)FIR vs IIRに関して、IIR差分方程式はO(N)で適用できますが、畳み込みはO(N ^ 2)またはO(N lgN)でFFTベースの畳み込みであるという私の理解は正しいですか?(4)これらのDSPのアイデアを実装するためのソフトウェアプログラマ向けの本を推奨できますか?Androidのコード例が行っていることと同じです。
stackoverflowuser2010

π+πONNN

(i)差分方程式の適用はO(N)であることを知っています。しかし、(ii)積和(songho.ca/dsp/convolution/convolution.html)での加算を使用した畳み込み演算は、FFTベースの実装ではO(N ^ 2)またはO(N lgN)であると考えました。すべての場合において、Nはフィルター次数です。ここで、フィルター次数と時間信号の長さは同じ大きさであると仮定しています(たとえば、両方とも256)。(i)と(ii)は違いませんか?また、LyonsがAmazon.comで本を読んだこともありましたが、C / Javaソフトウェアプログラマ向けにもっと書かれたものを期待していました。
stackoverflowuser2010

1
単一の時間サンプル出力の計算の複雑さはON NON2MNOMNMN
ジェイソンR

死んだ馬を倒してすみません。一般的な差分方程式(OM×N+MNON2ONM
stackoverflowuser2010

2

要約すると、RCフィルターなどの単純な理想化された物理モデルに基づくIIRフィルターは、極と零点の数が少ないため、通常、微分方程式として実装されます。極または零点の数が少ないと、算術演算が非常に少ない差分方程式を使用したサンプルごと。

IIRは無限の長さのインパルス応答を意味するので、畳み込みは計算に永遠に必要になるか、近似を使用する必要があります。

FIRフィルターは通常、有限長のインパルス応答を使用した畳み込み(または、フィルターが計算効率に十分な長さの場合はFFT高速畳み込み)によって実装されます。これらの種類のフィルターは、Z平面の極と零点がどこにあるかを知るのではなく、有限長のインパルス応答で目的の周波数応答仕様を近似できる場合によく使用されます。

ただし、仕様がシャープなフィルターは長いFIR畳み込みを意味するため、FIRフィルターの実装はかなり遅くなる可能性があり、セットアップには多くのコード行が含まれる場合があります。例。


0

私は何度も何度もこのポストに戻ってきています。質問してくれてありがとう。これは、Cの漏れやすい積分器の優れた、計算上使いやすい実装です(マイクロコントローラー用)。

最初に、再配置:y =α* x +(1 −α)* y_last =α*(x-y_last)+ y_last

αを約12%、25%、50%(1 / 8、1 / 4、1 / 2、...)に制限する場合。効率的なビットシフトを活用できます。1/8の場合、8 => 2 ^ 3 =>(ダウンシフト3回)

=(x-y_last)/ 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

それが役に立てば幸い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.