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
}
