我有一个程序可以从 PSoC 上的 ADC 串行读取数据。
数字以格式发送<uint16>
,包括“<”和“>”符号,以二进制格式传输,00111100 XXXXXXXX XXXXXXXX 00111110
其中“X”构成 16 位无符号整数。
有时读取不会很好,程序使用“>”符号的二进制数据作为其数字的一部分,导致出现故障,如 2500 个样本的截图所示(忽略样本 800 到 1500 之间的下降,即我在玩 ADC 输入吗):
您可以清楚地看到,故障导致数据在每次发生时都对大致相同的值进行采样。
数据每秒发送 10 次,所以我计划做的是取 10 个样本,消除任何毛刺(值远离其他样本的地方),然后平均剩余的值以稍微平滑曲线. 输出可以从 0 到 50000+,所以我不能只删除低于某个数字的值。
我不确定如何删除远离 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
}