实时数据的变化数量明显不同

时间:2015-07-21 13:37:04

标签: for-loop real-time increment labview

您好我正在实时获取数据,其值从1009,1008 1007到0.我试图计算出现这种情况的不同时间的数量,例如下面的代码段应该计算2个不同的变化周期。



1008
1009
1008
0
0
0
1008
1007
1008
1008
1009
9
0
0
1009
1008




我已经编写了一个for循环,但是我无法弄清楚逻辑是否正确,因为我获得了多个增量而不仅仅是一个



if(current != previous && current < 100)
x++;
else 
x = x;
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:0)

您使用LabVIEW标签标记了此标记。这实际上应该是LabVIEW代码吗?

你的逻辑有一个与你说的噪音有关的错误 - 如果该值小于100并且它发生变化(例如从9变为0),则将其记录为更改。你也有一行不做任何事情(x = x),虽然如果这应该是LV代码,那么这可能是有意义的。

答案 1 :(得分:0)

如果我了解你的目标,那么你在这里发布的代码对我来说似乎没有意义。我的理解是你要确定这个特定的模式:

1009 1008 1007 0

任何与这一数字序列的偏差都会构成应该被忽略的数据。为此,您应该监视过去3个数字的历史记录。在C中,您可以通过以下方式编写此逻辑:

#include <stdio.h>

//Function to get the next value from our data stream.
int getNext(int *value) {

  //Variable to hold our return code.
  int code;

  //Replace following line to get gext number from the stream.  Possible read from a file?
  *value = 0;

  //Replace following logic to set 'code' appropriately.
  if(*value == -1)
    code = -1;
  else
    code = 0;

  //Return 'code' to the caller.
  return code;

}

//Example application for counting the occurrences of the sequence '1009','1008','1007','0'.
int main(int argc, char **argv) {

  //Declare 4 items to store the past 4 items in the sequence (x0-x3)
  //Declare a count and a flag to monitor the occurrence of our pattern
  int x0 = 0, x1 = 0, x2 = 0, x3 = 0, count = 0, occurred = 0;

  //Run forever (just as an example, you would provide your own looping structure or embed the algorithm in your app).
  while(1) {

    //Get the next element (implement getNext to provide numbers from your data source).
    //If the function returns non-zero, exit the loop and print the count.
    if( getNext(&x0) != 0 )
         break;

    //If the newest element is 0, we can trigger a check of the prior 3.
    if(x0 == 0) {

      //Set occurred to 0 if the prior elements don't match our pattern.
      occurred = (x1 == 1007) && (x2 == 1008) && (x3 == 1009);
      if(occurred) {
        //Occurred was 1, meaning the pattern was matched.  Increment our count.
        count++;
        //Reset occurred
        occurred = 0;
      }

    //If the newest element is not 0, dont bother checking.  Just shift the elements down our list.
    } else {

      x3 = x2;  //Shift 3rd element to 4th position
      x2 = x1;  //Shift 2nd element to 3rd position
      x1 = x0;  //Shift 1st element to 2nd position

    }

  }

  printf("The pattern count is %d\n", count);

  //Exit application
  return 0;

}

请注意,此处仅显示了getNext函数作为示例,但显然我实现的内容不起作用。应根据从流中提取数据的方式实现此功能。

以这种方式编写应用程序可能在您的大型应用程序中没有意义,但算法是您应该从中获取的。基本上你想要在滚动窗口中缓冲4个元素。您将最新元素推入x0并将其他元素向下移动。在此过程之后,检查四个元素以查看它们是否与所需模式匹配,并相应地增加计数。

答案 2 :(得分:0)

如果要求计算下降沿并且您不关心特定级别,并且想要在稳定状态下拒绝噪声带或纹波,那么只需使条件类似

if ((previous - current) > threshold)

无需复杂的移位,历史记录或过滤。根据应用程序的不同,您可以进行去抖动(持久性检查)以忽略虚假样本(只是跟踪下降/上升,或者下降/上升为简单的切换状态,跨越所需数量的样本)。

模式的代码,而不是具体的值;使用常数或可调参数来控制值灵敏度。