检测图表系列中的脉冲计数

时间:2013-12-10 18:29:01

标签: c# math statistics

我的图表上有一个系列。这类似于下图所示的方波。如何计算C#中的脉冲数?

Sample Line Series

对于那些想看一些代码的人可以在下面看一下。这个想法设定了最小值和最大值。例如,如果该点在最小值和最大值之间,而下一次不是,则我确定存在边缘。但是我对这个想法有疑问,特别是对于一些嘈杂的信号。

var K = new Queue<Point>(); // Point is a class that holds DateTime and double value as well as some other properties.

                foreach (var Point in Source.Data.OrderBy(x => x.Timestamp))
                {
                    K.Enqueue(new Point() { Timestamp = Point.Timestamp, Value = Point.Value, InBand = (Point.Value >= Min) && (Point.Value <= Max) });
                }


var Points = new Point[3];

                foreach (var Point in K)
                {
                    if (null == Points[0])
                    {
                        Points[0] = Point;
                        continue;
                    }

                    if (null == Points[1])
                    {
                        Points[1] = Point;
                        continue;
                    }

                    if (null == Points[2])
                    {
                        Points[2] = Point;
                        continue;
                    }

                    if ((Points[0].InBand == false) && (Points[1].InBand == true) && (Points[2].InBand == true))
                    {
                        this.RunCount++;

                        Points[0] = null;
                        Points[1] = null;
                        Points[2] = null;

                        continue;
                    }

                    if ((Points[0].InBand == true) && (Points[1].InBand == false) && (Points[2].InBand == false))
                    {
                        this.StopCount++;

                        Points[0] = null;
                        Points[1] = null;
                        Points[2] = null;

                        continue;
                    }
                }

1 个答案:

答案 0 :(得分:0)

我假设您的数据存储在double[]中。在这种情况下,您可以迭代值,并计算值从低于某个阈值到高于同一阈值的次数。

以下是一些您应该能够适应的代码示例。我还没有对它进行测试,但它非常简单。请注意,如果您有非常嘈杂的信号,这可能会给您带来奇怪的结果,因此可能需要进行过滤。此外,该方法的名称有点不对,因为这会计算信号从低于阈值到高于阈值的次数。

public int CountCrossings(double[] waveform, double threshold) {
    int count = 0;
    for (int i = 0; i < waveform.Length - 1; i++) {
        if (waveform[i + 1] >= threshold && waveform[i] < threshold)
            count++;
    }
    return count;
}