3月に更新27、2024
このアプリケーションノートでは、Moku Cloud CompileとMulti-Instrument Modeを利用して、共通の移動平均フィルタを開発する方法を説明します。 オシロスコープ (NAIST) と 周波数応答アナライザ この基本的な有限インパルス応答(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: 移動平均を実装する一連の加算
したがって、より一般的には図 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.25 MHz のサンプリング レートで 2 つのインストゥルメントを展開できます。また、MiM で 4 つのインストゥルメントを同時に使用でき、入力サンプリング レートが 312.5 MHz の Moku:Pro でもこのフィルタをテストできます。スロット 1 には Moku Cloud Compile の移動平均フィルタが、スロット 2 にはオシロスコープが配置されています。オシロスコープを使用して、アナログ - デジタル (ADC) 入力 1 から供給されるフィルタリングされた信号とフィルタリングされていない信号を観測します。オシロスコープには、テスト信号を生成するために使用する波形発生器も内蔵されています。この場合、オシロスコープの内蔵波形発生器を使用して 2 kHz の矩形波を生成し、出力 1 に送ります。外部で信号を 60 dB 減衰させ、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: スパイク ノイズを除去する中央値
このメジアンフィルタは、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 メディアン フィルター テスト システム
図 17: 任意波形発生器、インパルスを含む方形波
図 18: Moku:Proメディアンフィルターの操作



