我正在尝试解码由72次重复12次的脉冲组成的RF传感器输出。
由于中等的不可靠性,某些位可能已损坏,句子可能从中间开始,结尾可能丢失。但是,如果重复3个序列,解码就会成功。
程序的输入是边沿变化之间的延迟数组。位0有2个脉冲:500(±249),然后是1000(±249)。位1有2个脉冲,500(±249),然后是2000(±249)。可以将公差设置为仍然有意义的任何值。
序列的开始是由一个长脉冲(> 3000)触发的,但这可能会丢失。
在一个序列中,共有36位(72个脉冲),位10为零,位25-28为全1。同样,在检测到3个正确的模式之后,可以进行可靠的解码。
示例数据(为清楚起见添加了换行符):
642 73 369 88 304 136 297 106 308 119 278 111 287 119 293 116 287 129 129 2054 1897 588 1830 614 588 645 382 98 97 619 337 634 463 106 285 1000 449 798 1647 1008 468 793 609 857 180
863 593 796 663 833 649 775 671 748 722 714 749 724 750 693 1757 639 1805 701 1741 660 799 685 1755 688 778 673 798 670 796 652 1792 645 1804 611 1828 632 1816 623 823 648 824 629 1816 644 813 643 1808 629 833 625 1826 601 1835
615 3791 607 844 604 1836 618 1823 613 1821 638 1811 610 855 586 1859 602 853 618 1835
604 859 611 844 619 856 595 863 604 867 591 882 590 868 537 1947 510 1928 516 1882 610 865 596 1853 587 858 609 868 587 869 603 1842 596 1844 601 1839 601 1841 598 876 582 875 596 1844 597 875 576 1866 569 911 572 1845 608 1836
595 3800 587 875 596 1856 589 1842 592 1855 588 1849 601 870 584 1860 577 879 597 1845 593 881 572 884 589 883 576 881 576 902 553 899 584 886 573 1871 584 1863 574 1852 588 884 561 1882 565 891 581 896 558 905 567 1869 577 1863 577 1865 584 1858 583 886 566 938 488 1950 497 977 497 1921 549 887 583 1865 582 1851
解码以上内容:
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
https://www.geeksforgeeks.org/longest-repeating-and-non-overlapping-substring/上有一个建议的解决方案,可以解决该问题。
应该首先将整数数组转换为二进制数组,并采用有效脉冲之间的最长序列(一个或一个零)。
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解码天气传感器。发送者在消息之间具有随机延迟,以避免冲突和由于制造公差。公差还主要归因于制造公差和与温度有关的振荡器。解码是非关键的,可以接受误报和误报。由于多种解码器算法在微控制器上实时运行,因此优先考虑性能,例如如果检测到垃圾数据,则提早退出。