17
17
#include < stdlib.h>
18
18
#include < assert.h>
19
19
#include < algorithm>
20
+
20
21
#include " timeutil.h"
22
+ #include " dsd_sync.h"
21
23
#include " dsd_decoder.h"
22
24
23
25
namespace DSDcc
24
26
{
25
27
26
- // Sync wods - Symbol mapping: 01(1):+3, 00(0):+1, 10(2):-1, 11(3):-3
27
- const unsigned char DSDDecoder::m_syncDMRDataBS[24 ] = {3 , 1 , 3 , 3 , 3 , 3 , 1 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 1 , 1 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 1 }; // DF F5 7D 75 DF 5D
28
- const unsigned char DSDDecoder::m_syncDMRVoiceBS[24 ] = {1 , 3 , 1 , 1 , 1 , 1 , 3 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 3 , 3 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 3 }; // 75 5F D7 DF 75 F7
29
- const unsigned char DSDDecoder::m_syncDMRDataMS[24 ] = {3 , 1 , 1 , 1 , 3 , 1 , 1 , 3 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 3 , 1 , 1 , 3 , 1 , 1 , 1 , 3 }; // D5 D7 F7 7F D7 57
30
- const unsigned char DSDDecoder::m_syncDMRVoiceMS[24 ] = {1 , 3 , 3 , 3 , 1 , 3 , 3 , 1 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 1 , 3 , 3 , 1 , 3 , 3 , 3 , 1 }; // 7F 7D 5D D5 7D FD
31
- const unsigned char DSDDecoder::m_syncDPMRFS1[24 ] = {1 , 1 , 1 , 3 , 3 , 3 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 3 , 1 , 1 , 3 , 1 , 1 , 1 , 1 , 3 , 1 , 3 }; // 57 FF 5F 75 D5 77 - non packet data header
32
- const unsigned char DSDDecoder::m_syncDPMRFS4[24 ] = {3 , 3 , 3 , 1 , 1 , 1 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 1 , 3 , 3 , 1 , 3 , 3 , 3 , 3 , 1 , 3 , 1 }; // FD 55 F5 DF 7F DD - packet data header
33
- const unsigned char DSDDecoder::m_syncDPMRFS2[12 ] = {1 , 1 , 3 , 3 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 1 }; // 5F F7 7D - superframe sync (each 2 384 bit frames)
34
- const unsigned char DSDDecoder::m_syncDPMRFS3[12 ] = {1 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 3 , 1 , 1 }; // 7D DF F5 end frame sync
35
- const unsigned char DSDDecoder::m_syncNXDNRDCHFull[19 ] = {3 , 1 , 3 , 1 , 1 , 3 , 3 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 1 };
36
- const unsigned char DSDDecoder::m_syncNXDNRDCHFullInv[19 ] = {1 , 3 , 1 , 3 , 3 , 1 , 1 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 3 };
37
- // const unsigned char DSDDecoder::m_syncNXDNRDCHFull[20] = {1, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 3, 1};
38
- // const unsigned char DSDDecoder::m_syncNXDNRDCHFullInv[20] = {3, 1, 3, 1, 3, 3, 1, 1, 1, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1, 3};
39
- const unsigned char DSDDecoder::m_syncNXDNRDCHFSW[10 ] = {3 , 1 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 1 };
40
- const unsigned char DSDDecoder::m_syncNXDNRDCHFSWInv[10 ] = {1 , 3 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 3 };
41
- const unsigned char DSDDecoder::m_syncDStarHeader[24 ] = {1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 1 };
42
- const unsigned char DSDDecoder::m_syncDStarHeaderInv[24 ] = {3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 3 };
43
- const unsigned char DSDDecoder::m_syncDStar[24 ] = {3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 3 , 1 , 3 , 1 , 1 , 1 , 3 , 3 , 1 , 3 , 1 , 1 , 1 };
44
- const unsigned char DSDDecoder::m_syncDStarInv[24 ] = {1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 1 , 3 , 1 , 3 , 3 , 3 , 1 , 1 , 3 , 1 , 3 , 3 , 3 };
45
- const unsigned char DSDDecoder::m_syncYSF[20 ] = {3 , 1 , 1 , 1 , 1 , 3 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 3 , 1 }; // D4 71 C9 63 4D => D5 75 DD 77 5D
46
- const unsigned char DSDDecoder::m_syncP25P1[24 ] = {1 , 1 , 1 , 1 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 3 , 3 };
47
- const unsigned char DSDDecoder::m_syncP25P1Inv[24 ] = {3 , 3 , 3 , 3 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 1 , 1 };
48
- const unsigned char DSDDecoder::m_syncX2TDMADataBS[24 ] = {3 , 3 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 3 , 3 , 3 , 1 , 1 , 3 , 3 };
49
- const unsigned char DSDDecoder::m_syncX2TDMAVoiceBS[24 ] = {1 , 1 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 1 , 1 , 1 , 3 , 3 , 1 , 1 };
50
- const unsigned char DSDDecoder::m_syncX2TDMADataMS[24 ] = {3 , 1 , 3 , 1 , 1 , 3 , 3 , 3 , 3 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 3 , 3 , 3 , 3 ,3 ,3 ,1 ,3 };
51
- const unsigned char DSDDecoder::m_syncX2TDMAVoiceMS[24 ] = {1 , 3 , 1 , 3 , 3 , 1 , 1 , 1 , 1 , 3 ,3 , 3 , 3 , 3 , 3 , 3 , 1 , 1 , 1 , 1 ,1 ,1 ,3 ,1 };
52
- const unsigned char DSDDecoder::m_syncProVoice[32 ] = {1 , 3 , 1 , 3 , 1 , 3 , 3 , 3 , 1 , 1 , 1 , 3 , 1 , 1 , 3 , 1 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 };
53
- const unsigned char DSDDecoder::m_syncProVoiceInv[32 ] = {3 , 1 , 3 , 1 , 3 , 1 , 1 , 1 , 3 , 3 , 3 , 1 , 3 , 3 , 1 , 3 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3 , 1 , 1 };
54
- const unsigned char DSDDecoder::m_syncProVoiceEA[32 ] = {3 , 1 , 1 , 3 , 1 , 3 , 1 , 1 , 3 , 3 , 1 , 3 , 3 , 1 , 1 , 1 , 1 , 1 , 3 , 3 , 1 , 3 , 1 , 3 , 1 , 1 , 3 ,1 ,1 ,1 , 3 ,3 };
55
- const unsigned char DSDDecoder::m_syncProVoiceEAInv[32 ] = {1 , 3 , 3 , 1 , 3 , 1 , 3 , 3 , 1 , 1 , 3 , 1 , 1 ,3 ,3 , 3 , 3 ,3 , 1 , 1 ,3 , 1 , 3 , 1 , 3 , 3 , 1 , 3 , 3 , 3 , 1 , 1 };
56
-
57
-
58
28
DSDDecoder::DSDDecoder () :
59
29
m_fsmState (DSDLookForSync),
60
30
m_dsdSymbol (this ),
@@ -666,12 +636,13 @@ int DSDDecoder::getFrameSync()
666
636
}
667
637
else // Sync identification starts here
668
638
{
639
+ DSDSync syncEngine;
669
640
m_dmrBurstType = DSDDMR::DSDDMRBurstNone;
670
- unsigned char tmp[ 64 ] ;
641
+ syncEngine. matchAll (m_dsdSymbol. getSyncDibitBack (DSDSync::m_history)) ;
671
642
672
643
if (m_opts.frame_p25p1 == 1 )
673
644
{
674
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncP25P1, 24 ) == 0 )
645
+ if (syncEngine. isMatching (DSDSync::SyncP25P1) )
675
646
{
676
647
m_state.carrier = 1 ;
677
648
m_dsdSymbol.setFSK (4 );
@@ -687,7 +658,7 @@ int DSDDecoder::getFrameSync()
687
658
m_mbeRate = DSDMBERate3600x2450;
688
659
return (int ) DSDSyncP25p1P;
689
660
}
690
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncP25P1Inv, 24 ) == 0 )
661
+ if (syncEngine. isMatching (DSDSync::SyncP25P1Inv) )
691
662
{
692
663
m_state.carrier = 1 ;
693
664
m_dsdSymbol.setFSK (4 , true );
@@ -706,7 +677,7 @@ int DSDDecoder::getFrameSync()
706
677
}
707
678
if (m_opts.frame_x2tdma == 1 )
708
679
{
709
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncX2TDMADataBS, 24 ) == 0 )
680
+ if (syncEngine. isMatching (DSDSync::SyncX2TDMADataBS) )
710
681
{
711
682
m_state.carrier = 1 ;
712
683
m_dsdSymbol.setFSK (4 );
@@ -724,7 +695,7 @@ int DSDDecoder::getFrameSync()
724
695
return (int ) DSDSyncX2TDMADataP; // done
725
696
}
726
697
727
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncX2TDMADataMS, 24 ) == 0 )
698
+ if (syncEngine. isMatching (DSDSync::SyncX2TDMADataMS) )
728
699
{
729
700
m_state.carrier = 1 ;
730
701
m_dsdSymbol.setFSK (4 );
@@ -742,7 +713,7 @@ int DSDDecoder::getFrameSync()
742
713
return (int ) DSDSyncX2TDMADataP; // done
743
714
}
744
715
745
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncX2TDMAVoiceBS, 24 ) == 0 )
716
+ if (syncEngine. isMatching (DSDSync::SyncX2TDMAVoiceBS) )
746
717
{
747
718
m_state.carrier = 1 ;
748
719
m_dsdSymbol.setFSK (4 );
@@ -760,7 +731,7 @@ int DSDDecoder::getFrameSync()
760
731
return (int ) DSDSyncX2TDMAVoiceP; // done
761
732
}
762
733
763
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncX2TDMAVoiceMS, 24 ) == 0 )
734
+ if (syncEngine. isMatching (DSDSync::SyncX2TDMAVoiceMS) )
764
735
{
765
736
m_state.carrier = 1 ;
766
737
m_dsdSymbol.setFSK (4 );
@@ -780,7 +751,7 @@ int DSDDecoder::getFrameSync()
780
751
}
781
752
if (m_opts.frame_ysf == 1 )
782
753
{
783
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 20 ), m_syncYSF, 20 ) == 0 )
754
+ if (syncEngine. isMatching (DSDSync::SyncYSF) )
784
755
{
785
756
m_state.carrier = 1 ;
786
757
m_dsdSymbol.setFSK (4 );
@@ -799,7 +770,7 @@ int DSDDecoder::getFrameSync()
799
770
}
800
771
if (m_opts.frame_dmr == 1 )
801
772
{
802
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDMRDataBS, 24 ) == 0 )
773
+ if (syncEngine. isMatching (DSDSync::SyncDMRDataBS) )
803
774
{
804
775
m_state.carrier = 1 ;
805
776
m_dsdSymbol.setFSK (4 );
@@ -820,7 +791,7 @@ int DSDDecoder::getFrameSync()
820
791
return (int ) DSDSyncDMRDataP; // done
821
792
}
822
793
823
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDMRDataMS, 24 ) == 0 )
794
+ if (syncEngine. isMatching (DSDSync::SyncDMRDataMS) )
824
795
{
825
796
m_state.carrier = 1 ;
826
797
m_dsdSymbol.setFSK (4 );
@@ -841,7 +812,7 @@ int DSDDecoder::getFrameSync()
841
812
return (int ) DSDSyncDMRDataMS; // done
842
813
}
843
814
844
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDMRVoiceBS, 24 ) == 0 )
815
+ if (syncEngine. isMatching (DSDSync::SyncDMRVoiceBS) )
845
816
{
846
817
m_state.carrier = 1 ;
847
818
m_dsdSymbol.setFSK (4 );
@@ -862,7 +833,7 @@ int DSDDecoder::getFrameSync()
862
833
return (int ) DSDSyncDMRVoiceP; // done
863
834
}
864
835
865
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDMRVoiceMS, 24 ) == 0 )
836
+ if (syncEngine. isMatching (DSDSync::SyncDMRVoiceMS) )
866
837
{
867
838
m_state.carrier = 1 ;
868
839
m_dsdSymbol.setFSK (4 );
@@ -885,8 +856,7 @@ int DSDDecoder::getFrameSync()
885
856
}
886
857
if (m_opts.frame_provoice == 1 )
887
858
{
888
- if ((memcmp (m_dsdSymbol.getSyncDibitBack (32 ), m_syncProVoice, 32 ) == 0 )
889
- || (memcmp (m_dsdSymbol.getSyncDibitBack (32 ), m_syncProVoiceEA, 32 ) == 0 ))
859
+ if (syncEngine.isMatching (DSDSync::SyncProVoice) || syncEngine.isMatching (DSDSync::SyncProVoiceEA))
890
860
{
891
861
m_state.carrier = 1 ;
892
862
m_dsdSymbol.setFSK (4 );
@@ -902,8 +872,7 @@ int DSDDecoder::getFrameSync()
902
872
m_mbeRate = DSDMBERate3600x2450;
903
873
return (int ) DSDSyncProVoiceP; // done
904
874
}
905
- else if ((memcmp (m_dsdSymbol.getSyncDibitBack (32 ), m_syncProVoiceInv, 32 ) == 0 )
906
- || (memcmp (m_dsdSymbol.getSyncDibitBack (32 ), m_syncProVoiceEAInv, 32 ) == 0 ))
875
+ else if (syncEngine.isMatching (DSDSync::SyncProVoiceInv) || syncEngine.isMatching (DSDSync::SyncProVoiceEAInv))
907
876
{
908
877
m_state.carrier = 1 ;
909
878
m_state.offset = m_synctest_pos;
@@ -924,7 +893,7 @@ int DSDDecoder::getFrameSync()
924
893
}
925
894
if ((m_opts.frame_nxdn96 == 1 ) || (m_opts.frame_nxdn48 == 1 ))
926
895
{
927
- if (countDiff (m_dsdSymbol. getSyncDibitBack ( 19 ), m_syncNXDNRDCHFull, tmp, 19 ) <= 1 ) // long sync (with preamble)
896
+ if (syncEngine. isMatching (DSDSync::SyncNXDNRDCHFull) ) // long sync (with preamble)
928
897
{
929
898
m_nxdnInterSyncCount = 0 ;
930
899
m_state.carrier = 1 ;
@@ -953,7 +922,7 @@ int DSDDecoder::getFrameSync()
953
922
m_mbeRate = DSDMBERate3600x2450;
954
923
return (int ) DSDSyncNXDNP; // done
955
924
}
956
- else if (countDiff (m_dsdSymbol. getSyncDibitBack ( 19 ), m_syncNXDNRDCHFullInv, tmp, 19 ) <= 1 ) // long sync (with preamble) inverted
925
+ else if (syncEngine. isMatching (DSDSync::SyncNXDNRDCHFullInv) ) // long sync (with preamble) inverted
957
926
{
958
927
m_nxdnInterSyncCount = 0 ;
959
928
m_state.carrier = 1 ;
@@ -982,7 +951,7 @@ int DSDDecoder::getFrameSync()
982
951
m_mbeRate = DSDMBERate3600x2450;
983
952
return (int ) DSDSyncNXDNN; // done
984
953
}
985
- else if (countDiff (m_dsdSymbol. getSyncDibitBack ( 10 ), m_syncNXDNRDCHFSW, tmp, 10 ) <= 1 ) // short sync
954
+ else if (syncEngine. isMatching (DSDSync::SyncNXDNRDCHFSW) ) // short sync
986
955
{
987
956
if ((m_nxdnInterSyncCount > 0 ) && (m_nxdnInterSyncCount % 192 == 0 ))
988
957
{
@@ -1016,7 +985,7 @@ int DSDDecoder::getFrameSync()
1016
985
m_nxdnInterSyncCount = 0 ;
1017
986
}
1018
987
}
1019
- else if (countDiff (m_dsdSymbol. getSyncDibitBack ( 10 ), m_syncNXDNRDCHFSWInv, tmp, 10 ) <= 1 ) // short sync inverted
988
+ else if (syncEngine. isMatching (DSDSync::SyncNXDNRDCHFSWInv) ) // short sync inverted
1020
989
{
1021
990
if ((m_nxdnInterSyncCount > 0 ) && (m_nxdnInterSyncCount % 192 == 0 ))
1022
991
{
@@ -1053,7 +1022,7 @@ int DSDDecoder::getFrameSync()
1053
1022
}
1054
1023
if (m_opts.frame_dpmr == 1 )
1055
1024
{
1056
- if ( memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDPMRFS1, 24 ) == 0 ) // dPMR classic (not packet)
1025
+ if (syncEngine. isMatching (DSDSync::SyncDPMRFS1) ) // dPMR classic (not packet)
1057
1026
{
1058
1027
m_state.carrier = 1 ;
1059
1028
m_dsdSymbol.setFSK (4 );
@@ -1072,7 +1041,7 @@ int DSDDecoder::getFrameSync()
1072
1041
}
1073
1042
if (m_opts.frame_dstar == 1 )
1074
1043
{
1075
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDStar, 24 ) == 0 )
1044
+ if (syncEngine. isMatching (DSDSync::SyncDStar) )
1076
1045
{
1077
1046
m_state.carrier = 1 ;
1078
1047
m_dsdSymbol.setFSK (2 );
@@ -1088,7 +1057,7 @@ int DSDDecoder::getFrameSync()
1088
1057
m_mbeRate = DSDMBERate3600x2400;
1089
1058
return (int ) DSDSyncDStarP;
1090
1059
}
1091
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDStarInv, 24 ) == 0 )
1060
+ if (syncEngine. isMatching (DSDSync::SyncDStarInv) )
1092
1061
{
1093
1062
m_state.carrier = 1 ;
1094
1063
m_dsdSymbol.setFSK (2 , true );
@@ -1104,7 +1073,7 @@ int DSDDecoder::getFrameSync()
1104
1073
m_mbeRate = DSDMBERate3600x2400;
1105
1074
return (int ) DSDSyncDStarN; // done
1106
1075
}
1107
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDStarHeader, 24 ) == 0 )
1076
+ if (syncEngine. isMatching (DSDSync::SyncDStarHeader) )
1108
1077
{
1109
1078
m_state.carrier = 1 ;
1110
1079
m_dsdSymbol.setFSK (2 );
@@ -1120,7 +1089,7 @@ int DSDDecoder::getFrameSync()
1120
1089
m_mbeRate = DSDMBERate3600x2400;
1121
1090
return (int ) DSDSyncDStarHeaderP; // done
1122
1091
}
1123
- if (memcmp (m_dsdSymbol. getSyncDibitBack ( 24 ), m_syncDStarHeaderInv, 24 ) == 0 )
1092
+ if (syncEngine. isMatching (DSDSync::SyncDStarHeaderInv) )
1124
1093
{
1125
1094
m_state.carrier = 1 ;
1126
1095
m_dsdSymbol.setFSK (2 , true );
@@ -1470,10 +1439,4 @@ int DSDDecoder::comp(const void *a, const void *b)
1470
1439
return 1 ;
1471
1440
}
1472
1441
1473
- int DSDDecoder::countDiff (const unsigned char *a, const unsigned char *b, unsigned char *t, unsigned int len)
1474
- {
1475
- std::transform (a, a + len, b, t, std::bit_xor<unsigned char >());
1476
- return std::count_if (t, t + len, [](unsigned char & c) { return c != 0 ; });
1477
- }
1478
-
1479
1442
} // namespace dsdcc
0 commit comments