我的图表上有一个系列。这类似于下图所示的方波。如何计算C#中的脉冲数?
对于那些想看一些代码的人可以在下面看一下。这个想法设定了最小值和最大值。例如,如果该点在最小值和最大值之间,而下一次不是,则我确定存在边缘。但是我对这个想法有疑问,特别是对于一些嘈杂的信号。
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;
}
}
答案 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;
}