您好我正在实时获取数据,其值从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;
答案 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)
无需复杂的移位,历史记录或过滤。根据应用程序的不同,您可以进行去抖动(持久性检查)以忽略虚假样本(只是跟踪下降/上升,或者下降/上升为简单的切换状态,跨越所需数量的样本)。
模式的代码,而不是具体的值;使用常数或可调参数来控制值灵敏度。