【问题标题】:Chart noise cancellation图表噪声消除
【发布时间】:2016-06-13 11:51:00
【问题描述】:

我正在使用 National Instrument 进行数据采集并将收集到的数据显示在图表上。但是,当我放大曲线时,曲线有一个尖锐的尖端,如图所示:

我正在使用以下代码来获取此图表:

  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 轴。如何获得直线或平滑线?

【问题讨论】:

    标签: c# charts noise


    【解决方案1】:

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

    // 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 可以为您平滑线条。

    【讨论】:

    • thz 这么多。我试过你的样品。但是我得到一个阻止我测试的错误:“DataPoint”不包含“Y”的定义,并且找不到接受“DataPoint”类型的第一个参数的扩展方法“Y”(您是否缺少 using 指令或程序集参考?)
    • 我忘了获取现有数据点的 Y 值,它来自YValues。我已经更改了代码。
    • 太厉害了。现在可以运行了。但是曲线仍然有那些尖锐的尖端
    • 我正在使用张力传感器收集数据,以便在图表上显示它们。是图表x轴与y轴不匹配的问题。由于我使用 [x++;] 来计算 x 轴,而我使用模拟数据 IN 来获取 Y 轴。
    • 只要您的张力传感器定期收集数据,x++ 就可以了。问题是图表 - 没有 ChartType 可以自动平滑这些尖锐的提示。您要么必须找到不同的图表,创建自己的“平滑”函数 - stackoverflow.com/questions/4388911/… - 要么平均分(就像我的回答一样)
    【解决方案2】:

    作为巴拉回答的变体:

    要创建移动平均线,您只需使用强大的 built-in statistical functions 之一:

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

    这将使Series S1 平滑超过15 个点,并将结果绘制到Series S2

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

    【讨论】:

    • 我已尝试将您的代码添加到我的函数中,但在我运行该函数时图表折叠了。我还在找错误,是不是输入的系列名错了?
    • 好吧,正如我所写,它是用Series S1 编写和测试的。如果您的输入系列是 'Series1' 并且您的输出系列 Series2 将其更改为 ..."15", "Series1:Y1", "Series2:Y" !确保在运行命令之前创建输出系列!
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多