Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找固定长度的重复传感器模式_C_Algorithm - Fatal编程技术网

C 查找固定长度的重复传感器模式

C 查找固定长度的重复传感器模式,c,algorithm,C,Algorithm,我试图解码一个射频传感器输出,它由72个脉冲组成,重复12次 由于中等不可靠性,某些位可能已损坏,句子可能从中间开始,结尾可能缺失。但是,如果重复3个序列,解码就会成功 程序的输入是边缘更改之间的延迟数组。位0有两个脉冲:500(±249)后接1000(±249)。位1有两个脉冲,500(±249)后接2000(±249)。公差可以设置为任何仍有意义的值 序列的开始由长脉冲(>3000)触发,但这可能会丢失 在一个序列中有36位(72个脉冲),位10是零,位25-28都是一。同样,在检测到3个正

我试图解码一个射频传感器输出,它由72个脉冲组成,重复12次

由于中等不可靠性,某些位可能已损坏,句子可能从中间开始,结尾可能缺失。但是,如果重复3个序列,解码就会成功

程序的输入是边缘更改之间的延迟数组。位0有两个脉冲:500(±249)后接1000(±249)。位1有两个脉冲,500(±249)后接2000(±249)。公差可以设置为任何仍有意义的值

序列的开始由长脉冲(>3000)触发,但这可能会丢失

在一个序列中有36位(72个脉冲),位10是零,位25-28都是一。同样,在检测到3个正确模式后,可以进行可靠解码

示例数据(为清晰起见,添加了换行符):

解码上述内容:

642 73 369 88 304 136 297 ...
^ garbage pulses              ^
615 3791 607 844 604 1836 618 1823 613 1821 638 1811 610 855 586 1859 602 853 618 1835
     ^start  0       1        1        1        1        0       1        0       1
有一个建议的解决方案,可在该解决方案下进行调整以适应工作

整数数组可能首先转换为二进制数组,取有效脉冲之间的最长序列(1或0)

O(n2+n)的蛮力方法找到重复模式,再加上另一个有效模式搜索(位10,25-28)是可行的,但我希望优化解决方案

数据每~80秒发送一次,每次发送的内容可能不同:

[noise] [long pulse] [sequence 1] [sequence 2] ... [sequence 12] [noise or no signal for ~80 seconds] [long pulse] ...

检测器可能在序列列的中间醒来:

[sequence 3 end] [sequence 4] [corrupted sequence 5] [sequence 6] [sequence 7] [incomplete sequence 8]
序列1到12表示36位的相同数据。 有效的二进制序列格式:

xxxxxxxxx0xxxxxxxxxxxxxx1111xxxxxxxx
其中x表示要解码的位,其他位是固定的


作为旁注,目的是使用微控制器上运行的EspPiLight对天气传感器进行解码。发送方在消息之间有一个随机延迟,以避免冲突和制造公差。公差也主要是由于制造公差和温度相关振荡器。解码是非关键的,误报和否定是可以接受的。由于多个解码器算法在微控制器上实时运行,因此性能优先,例如,如果检测到垃圾数据,则提前退出。

如果传递您提供的示例数据,您能否提供一个示例,说明您希望函数返回的内容。我在理解这个问题时遇到了一些困难。@vpaladino778输入的数字表示一个位序列,每个位有两个数字。500后跟3000表示起始位。500后跟2000表示
1
位。500后跟1000表示
0
位。消息由一个起始位后跟36个0和1组成。输入应该是同一消息的12个副本。但是,示例数据只有一些垃圾,后面是消息的两个副本。算法的输出应为消息或故障指示。该示例的输出是
0111010 1000 0000 1110 1000 1111 0010 1011
接近(或:Viterbi)(我将从重建信号开始,在eg 100 tics进行过采样)为什么您认为需要O(N*N)算法?您只需要对脉冲长度进行分类,同时保持长脉冲的同步。一旦接收到一组有效的72个半位,您就可以决定在结果中使用它(或不使用)。如果您验证位25-28而不存储它们,则消息将放入一个
uint32\t
,这样就很容易与消息的其他副本进行比较。
xxxxxxxxx0xxxxxxxxxxxxxx1111xxxxxxxx