图表噪音消除

时间:2016-03-01 06:56:31

标签: c# charts noise

我正在使用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轴。我怎样才能得到直线或平滑线?

2 个答案:

答案 0 :(得分: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为你平滑线条。

答案 1 :(得分: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

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