2016-03-01 80 views
1

我使用National Instrument进行数据采集并在图表上显示采集的数据。然而,该曲线具有一个锋利的尖端,当我在曲线缩放图像上,如下所示:enter image description here图表噪声消除

我使用以下代码来得到这个图表:

private void timer9_Tick(object sender, EventArgs e) 
    { 
     Task analogInTask1 = new Task(); 
     AIChannel myAIChannel1; 

     myAIChannel1 = analogInTask1.AIChannels.CreateVoltageChannel(
      "dev1/AI1", 
      "myAIChannel1", 
      AITerminalConfiguration.Rse, 
      0, 
      5, 
      AIVoltageUnits.Volts 
      ); 

     AnalogSingleChannelReader reader1 = new AnalogSingleChannelReader(analogInTask1.Stream); 
     double analogDataIn1 = reader1.ReadSingleSample(); 
     tension1Reading.Text = analogDataIn1.ToString("f2"); 


     DataPoint dp0 = new DataPoint(x, analogDataIn1); 
     chart2.Series[0].Points.RemoveAt(0); 
     chart2.Series[0].Points.Add(dp0); 
     x++; 

     if (checkBox1.Checked == true) 
      chart2.Series["Series1"].Enabled = true; 
     else 
      chart2.Series["Series1"].Enabled = false; 

    } 

我使用的张力传感器来收集数据,以便我可以在图表上显示它们。 x轴的问题与y轴不匹配吗?由于我使用[x ++;]来计算x轴,而我使用模拟数据输入来获取Y轴。我怎样才能得到一条直线或流畅的线条?

+0

您是否解决了问题? 如果您满意答案,请考虑[接受](http://stackoverflow.com/help/accepted-answer)它..! – TaW

回答

3

您是否尝试过移动平均线?这可以根据你的需要量身定做,并且看起来会“平滑”图表。这是一个非常简单的示例,说明如何使用它修改代码。

// get the last 4 points to average out (plus analogDataIn1) 
int pointsToAverage = 4; 
int pointCount = chart2.Series[0].Points.Count(); 
var buffer = chart2.Series[0].Points.Skip(Math.Max(0, pointCount - pointsToAverage)).Select(dp => dp.YValues[0]); 
// calculate the average Y from these points (along with analogDataIn1) 
double avgAnalogDataIn1; 
if (buffer.Count() == 0) 
{ 
    avgAnalogDataIn1 = analogDataIn1; 
} 
else 
{ 
    avgAnalogDataIn1 = (buffer.Sum() + analogDataIn1)/(double)(buffer.Count() + 1); 
} 

DataPoint dp0 = new DataPoint(x, avgAnalogDataIn1); 
chart2.Series[0].Points.RemoveAt(0); 
chart2.Series[0].Points.Add(dp0); 
x++; 

本例使用5点来平均。您可以通过将pointsToAverage增加到10来快速增加平均点数,这将使图表更加平滑。请注意,这些线条仍然会有'尖端技巧' - 没有ChartType可以为您平滑线条。

+0

thz太多了。我试过你的样品。但我得到1个错误,阻止我测试: 'DataPoint'不包含'Y'的定义,并且没有找到接受类型'DataPoint'的第一个参数的扩展方法'Y'(你是否缺少using指令或者是一个程序集引用?) –

+0

我忘了获取现有数据点的Y值,它来自'YValues'。我更改了代码。 – Balah

+0

太过如此了。它现在可以运行。但曲线仍然有那些尖锐的提示 –

1

由于Balah的的答案的变体:

要创建一个移动平均数,你可以简单地利用强大的built-in statistical functions之一:

chart1.DataManipulator.FinancialFormula(FinancialFormula.MovingAverage, 
             "15", "S1:Y1", "S2:Y"); 

这也就顺畅一个Series S1超过15分和将结果绘制成Series S2

enter image description here

请注意,找到正确的范围来平均完成取决于主要取决于您的数据和您的要求。在我的示例中,当范围跨越其中一个间隙时会创建工件。

+0

我试着将你的代码添加到我的函数中,但是当我运行该函数时图表崩溃了。我仍然在试图找出错误,是否输入系列名称错误? –

+0

好吧,正如我写的那样,它是用“S1系列”进行测试和测试的。如果你的输入系列是'Series1',而你的输出系列'Series2'变成'...“15”,“Series1:Y1”,“Series2:Y”'!确保在运行命令之前创建输出系列! – TaW