@@ -29,8 +29,8 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U
29
29
#define WRITE_BIT1 (p,i,b ) p[(i)>>3 ] = (b) ? (p[(i)>>3 ] | BIT_MASK_TABLE[(i)&7 ]) : (p[(i)>>3 ] & ~BIT_MASK_TABLE[(i)&7 ])
30
30
#define READ_BIT1 (p,i ) (p[(i)>>3 ] & BIT_MASK_TABLE[(i)&7 ])
31
31
32
- const unsigned char BRANCH_TABLE1[] = {0U , 0U , 0U , 0U , 1U , 1U , 1U , 1U };
33
- const unsigned char BRANCH_TABLE2[] = {0U , 1U , 1U , 0U , 0U , 1U , 1U , 0U };
32
+ const uint8_t BRANCH_TABLE1[] = {0U , 0U , 0U , 0U , 1U , 1U , 1U , 1U };
33
+ const uint8_t BRANCH_TABLE2[] = {0U , 1U , 1U , 0U , 0U , 1U , 1U , 0U };
34
34
35
35
CYSFConvolution::CYSFConvolution () :
36
36
m_metrics1(NULL ),
@@ -40,9 +40,9 @@ m_newMetrics(NULL),
40
40
m_decisions(NULL ),
41
41
m_dp(NULL )
42
42
{
43
- m_metrics1 = new unsigned short [16U ];
44
- m_metrics2 = new unsigned short [16U ];
45
- m_decisions = new unsigned long long [100U ];
43
+ m_metrics1 = new uint16_t [16U ];
44
+ m_metrics2 = new uint16_t [16U ];
45
+ m_decisions = new uint64_t [100U ];
46
46
}
47
47
48
48
CYSFConvolution::~CYSFConvolution ()
@@ -54,44 +54,44 @@ CYSFConvolution::~CYSFConvolution()
54
54
55
55
const unsigned int NUM_OF_STATES_D2 = 8U ;
56
56
const unsigned int NUM_OF_STATES = 16U ;
57
- const unsigned int M = 3U ;
57
+ const uint32_t M = 3U ;
58
58
const unsigned int K = 5U ;
59
59
60
60
void CYSFConvolution::start ()
61
61
{
62
- ::memset (m_metrics1, 0x00U , NUM_OF_STATES * sizeof (unsigned short ));
63
- ::memset (m_metrics2, 0x00U , NUM_OF_STATES * sizeof (unsigned short ));
62
+ ::memset (m_metrics1, 0x00U , NUM_OF_STATES * sizeof (uint16_t ));
63
+ ::memset (m_metrics2, 0x00U , NUM_OF_STATES * sizeof (uint16_t ));
64
64
65
65
m_oldMetrics = m_metrics1;
66
66
m_newMetrics = m_metrics2;
67
67
m_dp = m_decisions;
68
68
}
69
69
70
- void CYSFConvolution::decode (unsigned char s0, unsigned char s1)
70
+ void CYSFConvolution::decode (uint8_t s0, uint8_t s1)
71
71
{
72
72
*m_dp = 0U ;
73
73
74
- for (unsigned int i = 0U ; i < NUM_OF_STATES_D2; i++) {
75
- unsigned int j = i * 2U ;
74
+ for (uint8_t i = 0U ; i < NUM_OF_STATES_D2; i++) {
75
+ uint8_t j = i * 2U ;
76
76
77
- unsigned short metric = (BRANCH_TABLE1[i] ^ s0) + (BRANCH_TABLE2[i] ^ s1);
77
+ uint16_t metric = (BRANCH_TABLE1[i] ^ s0) + (BRANCH_TABLE2[i] ^ s1);
78
78
79
- unsigned short m0 = m_oldMetrics[i] + metric;
80
- unsigned short m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric);
81
- unsigned char decision0 = (m0 >= m1) ? 1U : 0U ;
79
+ uint16_t m0 = m_oldMetrics[i] + metric;
80
+ uint16_t m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric);
81
+ uint8_t decision0 = (m0 >= m1) ? 1U : 0U ;
82
82
m_newMetrics[j + 0U ] = decision0 != 0U ? m1 : m0;
83
83
84
84
m0 = m_oldMetrics[i] + (M - metric);
85
85
m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + metric;
86
- unsigned char decision1 = (m0 >= m1) ? 1U : 0U ;
86
+ uint8_t decision1 = (m0 >= m1) ? 1U : 0U ;
87
87
m_newMetrics[j + 1U ] = decision1 != 0U ? m1 : m0;
88
88
89
- *m_dp |= (( unsigned long long )( decision1) << (j + 1U )) | (( unsigned long long ) (decision0) << (j + 0U ));
89
+ *m_dp |= (uint64_t ( decision1) << (j + 1U )) | (uint64_t (decision0) << (j + 0U ));
90
90
}
91
91
92
92
++m_dp;
93
93
94
- unsigned short * tmp = m_oldMetrics;
94
+ uint16_t * tmp = m_oldMetrics;
95
95
m_oldMetrics = m_newMetrics;
96
96
m_newMetrics = tmp;
97
97
}
@@ -100,16 +100,43 @@ void CYSFConvolution::chainback(unsigned char* out)
100
100
{
101
101
assert (out != NULL );
102
102
103
- unsigned int state = 0U ;
103
+ uint32_t state = 0U ;
104
104
105
- unsigned char nbits = 96U ;
105
+ uint8_t nbits = 96U ;
106
106
while (nbits-- > 0 ) {
107
107
--m_dp;
108
108
109
- unsigned int i = state >> (9 - K);
110
- unsigned char bit = ( unsigned char ) (*m_dp >> i) & 1 ;
109
+ uint32_t i = state >> (9 - K);
110
+ uint8_t bit = uint8_t (*m_dp >> i) & 1 ;
111
111
state = (bit << 7 ) | (state >> 1 );
112
112
113
113
WRITE_BIT1 (out, nbits, bit != 0U );
114
114
}
115
115
}
116
+
117
+ void CYSFConvolution::encode (const unsigned char * in, unsigned char * out, unsigned int nBits) const
118
+ {
119
+ assert (in != NULL );
120
+ assert (out != NULL );
121
+ assert (nBits > 0U );
122
+
123
+ uint8_t d1 = 0U , d2 = 0U , d3 = 0U , d4 = 0U ;
124
+ uint32_t k = 0U ;
125
+ for (unsigned int i = 0U ; i < nBits; i++) {
126
+ uint8_t d = READ_BIT1 (in, i) ? 1U : 0U ;
127
+
128
+ uint8_t g1 = (d + d3 + d4) & 1 ;
129
+ uint8_t g2 = (d + d1 + d2 + d4) & 1 ;
130
+
131
+ d4 = d3;
132
+ d3 = d2;
133
+ d2 = d1;
134
+ d1 = d;
135
+
136
+ WRITE_BIT1 (out, k, g1 != 0U );
137
+ k++;
138
+
139
+ WRITE_BIT1 (out, k, g2 != 0U );
140
+ k++;
141
+ }
142
+ }
0 commit comments