3月に更新27、2024
このアプリケーションノートでは、Moku Cloud CompileとMulti-Instrument Modeを利用して、共通の移動平均フィルタを開発する方法を説明します。 オシロスコープ の三脚と 周波数応答アナライザ この基本的な有限インパルス応答(FIR)フィルタを調べます。次に、5点メディアンフィルタを開発、展開、および調べます。 モク デバイス。この方法で線形フィルタと非線形フィルタを組み合わせると、多くの制御またはセンシング アプリケーションで過渡現象を効果的に除去し、ノイズを低減できます。
Mokuクラウドコンパイル
Mokuクラウドコンパイル (MCC) は、カスタム ハードウェア記述言語 (HDL) コードをすばやくコンパイルして Moku デバイスに展開できる Liquid Instruments サービスです。MCC は、Moku 内の FPGA をカスタム コードに開放し、ユーザーが特定の機能や特徴を開発できるようにします。カスタム機能の展開に役立つさまざまな例とサポートを提供します。
移動平均フィルター
移動平均フィルターは、非常に簡単に言うと、連続する信号サンプルの数 (n) の平均です。方程式は次のとおりです。
ここで、x(t) は離散時系列入力信号、y(t) は出力信号です。たとえば、n = 4 の場合は、次のようになります。
この単純なフィルターは、信号内のノイズを低減するのに非常に便利です。無相関のランダム (ホワイト) ノイズの場合、この移動平均関数はノイズを除去し、鋭いステップ応答を維持するのに最適ですが、阻止帯域のパフォーマンスは低くなります。これをハードウェアで実装すると、加算器と 2 つの除算だけが必要となるため、ハードウェア リソースが限られている場合に便利です。ハードウェアでの任意の数による除算は、FPGA では単純ではありません。通常、このフィルターは、n が 2 の累乗 (つまり、n = XNUMX^N) であることを保証し、除算を N バイナリ ビットの右シフトに減らすことによって実装されます。
図 1: バイナリビット単位のシフト
ハードウェアを直接実装すると、図 2 のようになります。
図 2: 移動平均を実装する一連の加算
この実装には 2^N-1 個の加算器が必要となり、ハードウェアの点で高価になります。一連の深い加算器では、適切なタイミング パフォーマンスを満たすためにクロック レジスタも必要になる可能性があります。次のことを理解することで、これを改善できます。

したがって、より一般的には図 3のようになります。
図 3: アキュムレータの実装
これにより、各出力が前の出力と現在の入力に依存していることが認識されます。 これで、移動平均関数をアキュムレータ、2 つの減算関数、および 2^N 除算のためのビット単位の右シフトが続く n 段シフト レジスタに縮小しました (図3)。 N > 4の場合、このハードウェア節約は重要になり、制限要因は2^N ステージシフトレジスタです。 さらに、タイミング制約を満たすためにクロックされる要素をさらに追加する必要はありません。
VHDLの実装
図4は、VHDL実装のコアを示しています。 このフィルターのコアは非常にシンプルで、コードはわずか 12行です。 p_moving_averageは最後の N 個のサンプルの時間履歴です。8行目は最新の入力を先頭に追加し、最も古い入力を削除しています。 ライン9では、アキュムレータ r_acc が新しい入力を加算しており、ライン10では出力に必要なビット単位のシフト (除算) を生成しています。
図 4: 移動平均 VHDL コード
コンパイルとデプロイ
この VHDL コードのコンパイルと合成は簡単です。始めるには、にアクセスしてください コンパイル.liquidinstruments.comをクリックし、コードをアップロードして、ビルドを選択します。 Liquid Instruments サーバーは、コードを実装するために FPGA 上で必要なハードウェア構成を定義するファイルまたはビットストリームを生成します。 Moku:Go および Moku:Lab の場合、コンパイルには約 5 分かかります。 Moku:Pro の場合、FPGA のサイズがはるかに大きいため、20 分近くかかります。
コンパイルと展開をガイドする詳細な手順が用意されています こちら.
MCC 移動平均フィルターのテスト
この移動平均フィルタをテストするために、図5に示すように、Moku:Goのマルチインストゥルメントモード(MiM)を使用します。このモードでは、31.25MHzのサンプルレートで312.5台の計測器を配置できます。また、このフィルタはMoku:Proでもテストできます。Moku:Proでは、MiMでXNUMX台の計測器を同時に使用でき、入力サンプルレートはXNUMXMHzです。
スロット1にはMoku Cloud Compileの移動平均フィルタが、スロット2にはオシロスコープが搭載されています。オシロスコープは、アナログ-デジタル(ADC)入力1から供給されるフィルタリング済み信号とフィルタリングなし信号を観測するために使用します。オシロスコープには、テスト信号を生成するための波形発生器も内蔵されています。今回は、オシロスコープ内蔵の波形発生器を用いて2kHzの矩形波を生成し、出力1に出力します。この信号を外部で60dB減衰させ、Moku:Goのノイズフロア付近まで減衰させます。その後、この信号を入力1に戻します。
図5: マルチインストゥルメントモードでのフィルタテストのセットアップ
図 6 では、青いトレースに減衰後のノイズの多い方形波が見られます。赤いトレースは、非常にきれいな方形波を持つ移動平均器の出力を示しています。これは、MCC と MiM の 1つのスロットを使用して有効になる便利なノイズ低減技術です。
図 6: MCC 移動平均フィルターを使用したノイズ低減
この最もシンプルなフィルタは、ノイズ低減に役立っています。また、演算量も非常に軽く、アキュムレータ、減算器、ビットシフトのみで動作します。そのため、Moku:Proでは312.5MSa/s、Moku:Goでは31.25MSa/sという非常に高速な速度で動作可能です。
ノイズ電力に注目すると、この平均フィルタによってノイズ電力が 2 分の XNUMX に低減されることがわかります。N;ノイズ振幅は√2で減少しますN。私たちの実装では N=8 を使用しているため、ノイズ振幅は元の 6.25% (1/16) に低減されるはずです。
図7は、Moku:Goの入力ノイズ(青いトレース)と移動平均信号(赤いトレース)を示しています。振幅はそれぞれ161.2 mVと9.162 mVです。このことから、フィルタ通過後のノイズの振幅は、元のノイズの1/16、つまり9.162 / 161.2 mV = 0.057という予想値に近いことがわかります。このフィルタは動作しており、期待通りの性能を示しています。
図 7: 平均入力ノイズ
周波数応答
Moku 周波数応答アナライザー (FRA) 機器を使用すると、移動平均の周波数応答を簡単に決定できます。 FRA は、出力で周波数掃引正弦波を駆動し、その結果の入力での振幅と位相を測定します。図 8 はテストのセットアップを示しています。
図 8: 周波数応答アナライザー MiM 構成
図9は、MCC フィルターの周波数応答を示しています。これを理想的な移動平均フィルターの MATLAB プロットである図10と比較すると、移動平均フィルターが特に良好な阻止帯域減衰にならないことがわかります。
図 9: 移動平均フィルターの周波数応答

図 10: 理想的な移動平均フィルターの MATLAB プロット
メディアンフィルター
メディアンフィルターは、小さな移動ウィンドウの中央値を決定する非線形フィルターです。入力サンプルはウィンドウを通過し、出力は任意の時点でのサンプルの中央値になります。移動平均フィルタは均一に分布したランダム ノイズのフィルタリングに適していますが、メディアン フィルタは非常に短いスパイクやインパルス ノイズのフィルタリングに適しています。画像処理に使用されることが多いですが、より一般的な信号処理にも役立ちます。
通常、ウィンドウの長さとして奇数のサンプル (3、5、または7ポイント) が選択されます。これは、出力が単に値順ウィンドウの中央のサンプルであることを意味します。
VHDLの実装
図11に、VHDLによる5点中央値関数の実装を示します。クロック信号の立ち上がりエッジごとに、図11の関数は5つの入力サンプルを低い値から高い値へと並べ替えます。この並べ替えは、12行目から20行目までの2つのネストされた「for」ループで行われます。したがって、中央値はソートされたウィンドウの3番目のサンプルとなり、これが22行目の出力に割り当てられます。
図 11: メディアン フィルターの VHDL コード
オシロスコープと Moku Cloud Compile スロットをオシロスコープの波形ジェネレータで使用することにより、移動平均フィルタと同じ方法でメディアン フィルタの時間領域パフォーマンスを分析できます。
図12はノイズピークが大幅に減少していることを示しています。フィルタリング前のノイズのピークツーピーク値は、フィルタリング後に3.66 mVから305 μVに低下しています。これは1/12の減少であり、移動平均フィルタ(1/16)ほど効果的ではありません。
図 12: メディアン フィルターの時間領域のパフォーマンス
メディアン フィルターの重要な機能はインパルス ノイズを除去することであるため、インパルスを追加した方形波を使用してそのパフォーマンスも調べます。図 13 は、前縁のスパイクと低レベル途中のスパイクを持つ方形波を示しています (青のチャネル B)。フィルタリングされた信号は、メディアン フィルタによってスパイクが除去されたものの、鋭い立ち上がりエッジと立ち下がりエッジが保持された後の方形波を示しています (赤色のチャネル A)。
図 13: スパイク ノイズを除去する中央値
このメジアンフィルタは、MCCクロックレートが31.25MHzのMoku:Goでコンパイルおよびテストしました。しかし、この例をMoku:Proでテストする際には、クロックレートが312.5MHzに上昇したため、実装を調整する必要がありました。図11の実装では、変数を含むネストされたforループを使用しています。これは、Moku:Proのクロックレートである14ns周期を超える伝搬遅延(図3.2)を持つ、大規模で深い組み合わせロジックネットに合成されます。タイミングを満たすには、クロックされた要素間のロジックの伝搬遅延がクロック周期よりも小さくなければなりません。
図 14: ロジックによる伝播遅延
大きな論理ブロックをレジスタまたはクロック要素によって区切られたセグメントに分割する必要があります。 VHDL では、変数ではなく信号を使用してこれを実現します。この場合、コーディングを容易にするためにロジックを5つの段階に分割します。入力から出力までの遅延が約5クロックサイクルであるため、このアプリケーションには適しています。
図 15 は、この XNUMX 段階のパイプライン化中央値アルゴリズムの XNUMX 段階を示しています。ダウンロード可能なプロジェクト ファイルで完全な VHDL を見つけます。 こちら.
図 15: パイプライン化されたメディアン フィルターの XNUMX ステージ
Moku:Proメディアンフィルターテスト
MiM の Moku:Pro と任意波形発生器 (AWG) を使用して、ノイズ スパイクのある方形波を作成します。次に、AWG の出力を MCC メディアン フィルターに接続し、オシロスコープで効果を観察します。
この MiM セットアップを図 16 に示します。図 17 に示すように AWG を構成しました。その出力は Moku:Pro の出力 3 にアナログ信号を駆動し、同軸ケーブルを介して入力 3 にループされます。 Moku Cloud Compile スロットのメディアン フィルターを使用し、オシロスコープを使用してパフォーマンスを観察しました。
図 16: Moku:Pro メディアン フィルター テスト システム
最後に、図 18に示すように、メディアンフィルターの性能を観察します。メディアンフィルターは、方形波の鋭いエッジを保持しながら、インパルスを除去しています。ステージングされたクロックパイプラインの挿入によって生じる処理遅延により、約44 ns の遅延が発生します。
図 17: 任意波形発生器、インパルスを含む方形波
図 18: Moku:Proメディアンフィルターの操作
製品概要
このアプリケーションノートでは、移動平均フィルタとメディアンフィルタの実装について説明しました。これらの実装では、Moku Cloud Compile を利用してフィルタを構築し、Moku:Go デバイスにデプロイしました。その後、Moku:Pro のクロックレート向上に対応できるよう設計を修正しました。MCC フィルタの動作を検証するために、マルチインストゥルメントモードを使用し、完全にカスタマイズ可能なフィルタ、オシロスコープ、任意波形発生器を接続しました。この実装により、デジタル信号処理アプリケーションにおいて、信号エッジを維持しながら効率的なノイズ低減が可能になります。
コードのダウンロード
アプリケーションノートのコードは、こちらからダウンロードできます。
Moku:デモ版
macOS および Windows 用の Moku: アプリは、次のサイトからダウンロードできます。 ウェブサイト。デモ モードはハードウェアなしで動作し、Moku:Go、Moku:Lab、または Moku:Pro の使用方法を紹介します。 Moku: アプリは次の目的でも利用できます。 iPadOS Apple App Storeで。
ご質問がありますか、または印刷可能なバージョンが必要ですか?
連絡先: support@liquidinstruments.com.
参 考
【1] www.mathworks.com/help/dsp/ug/how-is-moving-average-filter-Difference-from-an-fir-filter.html