0

PSoC 上の ADC からシリアル経由でデータを読み取るプログラムがあります。

数値は<uint16>、'<' および '>' 記号を含む形式で送信され00111100 XXXXXXXX XXXXXXXX 00111110、'X' が 16 ビットの unsigned int を構成するバイナリ形式で送信されます。

読み取りがうまくいかない場合があり、プログラムは「>」記号のバイナリ データを数値の一部として使用するため、この 2500 サンプルのスクリーンショットに示すようにエラーが発生します (サンプル 800 から 1500 の間のドロップは無視してください。私はADC入力で遊んでいました):

スクリーンショット

グリッチが発生するたびに、データがほぼ同じ値をサンプリングすることが明確にわかります。

データは 1 秒間に 10 回送信されるので、私が計画していたのは、10 個のサンプルを取得し、グリッチ (値が他のサンプルから離れている場所) を取り除き、残りの値を平均して曲線を少し滑らかにすることでした。 . 出力は 0 から 50000+ までの範囲になるため、特定の数値を下回る値を削除することはできません。

このグリッチの影響を受けるサンプルが 2 つある場合があるため、10 サンプル グループの他の値の範囲から大きく外れている値を削除する方法がわかりません。おそらく、この不具合のあるデータを回避するのではなく、他の方法で修正することができます!

これを行う最善の方法は何ですか?これまでのコードは次のとおりです (これは DataReceivedEvent メソッド内にあります)。

SerialPort sp = (SerialPort)sender; //set up serial port
byte[] spBuffer = new byte[4];
int indata = 0;

sp.Read(spBuffer, 0, 4);
indata = BitConverter.ToUInt16(spBuffer, 1);

object[] o = { numSamples, nudDutyCycle.Value, freqMultiplied, nudDistance.Value, pulseWidth, indata };
lock (dt)    //lock for multithread safety
{
    dt.Rows.Add(o); //add data to datatable
}
4

3 に答える 3

1

工学における一般的な方法は、減衰機能を追加することです。減衰関数は、基本的にパラメータの差分、つまり連続する値の差分に作用します。ダンピング関数を選択する方法について厳格なルールはなく、ほとんどの場合、妥当な結果が得られるように微調整されます。

したがって、あなたの場合、それが意味することは、最新の値をその前の値と比較することです。一定の量よりも大きい場合は、最新の値を前の値にデフォルト設定するか、最新の値を固定係数 (10% または 1% など) だけ減らします。そうすれば、情報を失うことはありませんが、突然のジャンプやグリッチも発生しません。

于 2016-02-18T10:12:43.943 に答える
1

まず第一に、解析の問題を修正することを強くお勧めします。そうすれば、グリッチ値について心配する必要はありません。

ただし、後でデータを修正するルートをたどることに決めた場合: グリッチされたデータはすべて、特定の値 (~16000) 付近にあることがわかります。実際、グラフから判断すると、毎回ほぼ同じであると言えます。グリッチ値の範囲内にあるデータを単純に無視し (正確な境界を見つけるためにテストを行う必要があります)、代わりに最後の非グリッチ値を使用できます。

于 2016-02-18T10:22:12.083 に答える