移動平均再帰フィルター





はい、読者のみなさん、これも起こりますし、美味しくて健康的です!



読者の皆さん、おそらく既にご存知のとおり、デジタルフィルターを作成するには2つの方法があります。 これらは再帰フィルターであり、無限インパルス応答(IIR)のフィルターであり、横断フィルターも有限インパルス応答(FIR)のフィルターです。 最も単純で最も広く使用されているFIRフィルターは、移動平均フィルターです。 このようなフィルターのフィルター結果は、入力信号の最後のN個のサンプルの算術平均です。







または、N = 4の場合、拡張形式で







移動平均フィルターを実装するCの関数:



#define N (4) int filter(int a) { static int m[N]; static int n; m[n]=a; n=(n+1)%N; a=0; for(int j=0;j<N;j++){a=a+m[j];} return a/N; }
      
      





サンプリング周波数に正規化された移動平均フィルターの複素透過係数は、インパルス応答のフーリエ変換として定義されます。







フィルター長のさまざまな値(N = 4; 8; 16)について、サンプリング周波数に対して正規化された振幅周波数特性(AFC)のグラフを図に示します。







したがって、位相周波数特性(PFC)のグラフ:







このフィルターは、その単純さなどの理由で信号処理で広く使用されていますが、その最も重要な特性は線形位相周波数特性であり、したがって、周波数帯域全体の信号遅延時定数です。 このフィルターは、位相に影響を与えることなく信号の振幅スペクトルを変換するため、制御システムでの使用に便利です。 移動平均フィルターは、線形過渡応答のため、線形補間、信号オーバーサンプリングなどに広く使用されています。



移動平均フィルターの主な欠点は、フィルターNの長さに比例する計算の複雑さです。この問題を解決するために、再帰的な移動平均フィルターがあります。 つまり、古典的な移動平均フィルターと同じ特性を持ちますが、再帰的に実装されたフィルターです。 これらのタイプのフィルターは狭い円で広く知られており、次のように呼ばれます。線形位相応答を備えた再帰フィルター 下。 編 Bogner R. M:1976]またはCICフィルター[ DspLib ]。 教授の科学的な学校があります。 トゥルリナI.I. [ RSL ]そのようなフィルターを研究しています。



N = 4の長さのフィルターの例を使用して、再帰的移動平均フィルターを構築する方法を示します。 その後、結果を任意のフィルター長に一般化するのは簡単です。



上記のように、フィルターの出力での信号のn番目のサンプルの値は、次のように定義できます。







そして、前の値、((n-1)-th)count:







最初の式から2番目の式を減算すると、次の結果が得られます。







任意のフィルター長Nの場合、方程式は次の形式で記述されていることが簡単にわかります。



(1)



上記の式に基づいて、フィルターコードをCで記述できますが、最初に計算を確認します。 再帰移動平均フィルターの周波数特性を見つけ、フィルター方程式のZ変換を実行します。 親愛なる読者に、Z変換を実行するには変数(x n 、y n )をZマップ(X、Y)に置き換える必要があることを思い出してください。







Y / Xフィルターゲインの結果の方程式を解きます







Z領域から周波数領域に渡して、 、および複素伝達係数を取得します。







N = 4.8.16のさまざまな値について、複素伝達係数のモジュール(フィルターのAFC)をプロットします。







また、複素伝達係数の引数(位相応答フィルター):







グラフからわかるように、古典的な移動平均フィルターと再帰移動平均フィルターの周波数特性は完全に同じです。



フィルターの実装に移りましょう。 整数演算の条件下でフィルター方程式(1)を直接実装すると、いくつかの問題が発生する可能性があります。 整数演算でNによる除算を実行すると、有効ビットの損失が発生し、フィルター出力での信号の非線形歪みが発生します。 これらの困難を解決するには、除算演算を再帰フィルター方程式から除外する必要があります。 フィルター式(1)の両側にNを掛けるのはなぜですか。







結果の式で、置換を実行します。









その結果、フィルター方程式(1)は方程式系に変換されます。









フィルター方程式のシステムに基づいて、Cでフィルターを実装するコードを記述します。



 #define N (4) int filter(int x) { static int n; static int m[N]; static int y; y=y+(xm[n]); m[n]=x; n=(n+1)%N; return y/N; }
      
      





「完全なコード」を愛する人は、フィルターNの長さに制限的な要件を課すことができます。フィルターの長さが2のべき乗(2,4,8,16 ...)に等しい場合、除算(/)を算術シフト(>>)に置き換えることができます。除算の剰余(%)-ビットごとの結合(&)。



おわりに



読者の皆様、この出版物の目的は、再帰的移動平均フィルターを紹介することではなく、それについて完全によく知っていることでしょう。 この出版物の目的は、読者の皆様に、デジタルフィルターの分析と合成のための実用的なテクニックを紹介することです。 トランスバーサルフィルターから再帰フィルターへの移行がどれほど簡単で、Z変換はペイントほど怖くないことを確認してください。 また、整数演算の条件で繰り返し式を計算する精度を高める方法が役立つことを願っています。



読者の皆さん、幸運を祈ります!



All Articles