2

Wiiリモコンから約100Hzの速度で加速度計データを継続的に取得するC#アプリケーションを作成しています。このデータは、到着するとリスト (軸ごとに 1 つのリスト) に格納されます。1秒ごとに起動するタイマーがあります(起動するまでに、リストには〜100個の要素が含まれます)。次に、リストにローパスフィルターを適用し(Signal Processing Math.NET Neodymライブラリを使用)、書き込みますデータをファイルに保存し、次のデータのバッチのためにすべてのリストをクリアします。

ここでの問題は、出力されたフィルター データが最初に大きなスイングを持っていることです。これは、フィルターが適用されるたびに発生するため、1 秒ごとに、データにいくつかの誤った値が含まれており、完全に役に立たなくなります。

これを修正して、フィルターが 1 秒ごとに適用されるようにするにはどうすればよいですか。ただし、トランジェントは回避できます。これは重複するウィンドウを使用して実行できるのではないかと疑っていますが、どうすればよいかわかりませんか?

これが私のフィルターのコードです。このコードは毎秒実行されます。

 listXLow = MathNet.SignalProcessing.Filter.OnlineFilter.CreateLowpass(MathNet.SignalProcessing.Filter.ImpulseResponse.Finite, 100, 1, 30).ProcessSamples(listX.ToArray()).ToList();

ImpulseResponse.Finite の直後の引数で、100 はサンプリング レート、1 はカットオフ周波数、30 はフィルター次数です。

これは、私の I/O がどのように見えるかを示すスクリーンショットです。入力データは最初のグラフで、2 番目のグラフはフィルター出力を示しています。 入力データと出力データを示すグラフ

4

2 に答える 2

4

OK、問題は解決しました。hotpaw2 が述べたように、同様の問題に直面している他の人のためにこれを残しておいてください。

問題は、タイマーが起動されるたびに新しいフィルターが作成されることでした。これを解決するには、グローバル フィルター オブジェクトを作成し、Timer tick イベント内で毎回その ProcessSamples メソッドを呼び出します。

そのため、プログラムの開始時にフィルター オブジェクトが作成されます。

  MathNet.SignalProcessing.Filter.OnlineFilter XlowFilter = MathNet.SignalProcessing.Filter.FIR.OnlineFirFilter.CreateLowpass(MathNet.SignalProcessing.Filter.ImpulseResponse.Finite, 100, 1.5, 30);

Timer Tick イベントでは、フィルターのメソッドのみが呼び出されます。

 listXLow = XlowFilter.ProcessSamples(listX.ToArray()).ToList();
于 2013-01-07T10:34:45.647 に答える
4

FIR フィルターには次数の長さのトランジェントがあります。トランジェントの長さが 30 の場合、前の 100 から最後の 30 サンプルを保存し、それらを現在のデータに追加してから、フィルタリング後にそのトランジェント (130 のフィルタリングされたサンプルの最初の 30) を破棄できます。

于 2013-01-07T03:05:21.813 に答える