Line | Branch | Exec | Source |
---|---|---|---|
1 | /* -*- c++ -*- */ | ||
2 | /* | ||
3 | * Copyright 2015 Free Software Foundation, Inc. | ||
4 | * | ||
5 | * This file is part of VOLK | ||
6 | * | ||
7 | * SPDX-License-Identifier: LGPL-3.0-or-later | ||
8 | */ | ||
9 | |||
10 | /*! | ||
11 | * \page volk_8u_x3_encodepolar_8u | ||
12 | * | ||
13 | * \b Overview | ||
14 | * | ||
15 | * encode given data for POLAR code | ||
16 | * | ||
17 | * <b>Dispatcher Prototype</b> | ||
18 | * \code | ||
19 | * void volk_8u_x3_encodepolar_8u(unsigned char* frame, const unsigned char* | ||
20 | * frozen_bit_mask, const unsigned char* frozen_bits, const unsigned char* info_bits, | ||
21 | * unsigned int frame_size, unsigned int info_bit_size) \endcode | ||
22 | * | ||
23 | * \b Inputs | ||
24 | * \li frame: buffer for encoded frame | ||
25 | * \li frozen_bit_mask: bytes with 0xFF for frozen bit positions or 0x00 otherwise. | ||
26 | * \li frozen_bits: values of frozen bits, 1 bit per byte | ||
27 | * \li info_bits: info bit values, 1 bit per byte | ||
28 | * \li frame_size: power of 2 value for frame size. | ||
29 | * \li info_bit_size: number of info bits in a frame | ||
30 | * | ||
31 | * \b Outputs | ||
32 | * \li frame: polar encoded frame. | ||
33 | * | ||
34 | * \b Example | ||
35 | * \code | ||
36 | * int frame_exp = 10; | ||
37 | * int frame_size = 0x01 << frame_exp; | ||
38 | * int num_info_bits = frame_size; | ||
39 | * int num_frozen_bits = frame_size - num_info_bits; | ||
40 | * | ||
41 | * // function sets frozenbit positions to 0xff and all others to 0x00. | ||
42 | * unsigned char* frozen_bit_mask = get_frozen_bit_mask(frame_size, num_frozen_bits); | ||
43 | * | ||
44 | * // set elements to desired values. Typically all zero. | ||
45 | * unsigned char* frozen_bits = (unsigned char) volk_malloc(sizeof(unsigned char) * | ||
46 | * num_frozen_bits, volk_get_alignment()); | ||
47 | * | ||
48 | * unsigned char* frame = (unsigned char) volk_malloc(sizeof(unsigned char) * frame_size, | ||
49 | * volk_get_alignment()); unsigned char* temp = (unsigned char) | ||
50 | * volk_malloc(sizeof(unsigned char) * frame_size, volk_get_alignment()); | ||
51 | * | ||
52 | * unsigned char* info_bits = get_info_bits_to_encode(num_info_bits); | ||
53 | * | ||
54 | * volk_8u_x3_encodepolar_8u_x2_generic(frame, temp, frozen_bit_mask, frozen_bits, | ||
55 | * info_bits, frame_size); | ||
56 | * | ||
57 | * volk_free(frozen_bit_mask); | ||
58 | * volk_free(frozen_bits); | ||
59 | * volk_free(frame); | ||
60 | * volk_free(temp); | ||
61 | * volk_free(info_bits); | ||
62 | * \endcode | ||
63 | */ | ||
64 | |||
65 | #ifndef VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_U_H_ | ||
66 | #define VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_U_H_ | ||
67 | #include <stdio.h> | ||
68 | #include <volk/volk_8u_x2_encodeframepolar_8u.h> | ||
69 | |||
70 | 10 | static inline void interleave_frozen_and_info_bits(unsigned char* target, | |
71 | const unsigned char* frozen_bit_mask, | ||
72 | const unsigned char* frozen_bits, | ||
73 | const unsigned char* info_bits, | ||
74 | const unsigned int frame_size) | ||
75 | { | ||
76 | unsigned int bit; | ||
77 |
2/2✓ Branch 0 taken 655360 times.
✓ Branch 1 taken 10 times.
|
655370 | for (bit = 0; bit < frame_size; ++bit) { |
78 |
2/2✓ Branch 0 taken 327145 times.
✓ Branch 1 taken 328215 times.
|
655360 | *target++ = *frozen_bit_mask++ ? *frozen_bits++ : *info_bits++; |
79 | } | ||
80 | 10 | } | |
81 | |||
82 | #ifdef LV_HAVE_GENERIC | ||
83 | |||
84 | static inline void | ||
85 | 2 | volk_8u_x3_encodepolar_8u_x2_generic(unsigned char* frame, | |
86 | unsigned char* temp, | ||
87 | const unsigned char* frozen_bit_mask, | ||
88 | const unsigned char* frozen_bits, | ||
89 | const unsigned char* info_bits, | ||
90 | unsigned int frame_size) | ||
91 | { | ||
92 | // interleave | ||
93 | 2 | interleave_frozen_and_info_bits( | |
94 | temp, frozen_bit_mask, frozen_bits, info_bits, frame_size); | ||
95 | 2 | volk_8u_x2_encodeframepolar_8u_generic(frame, temp, frame_size); | |
96 | 2 | } | |
97 | #endif /* LV_HAVE_GENERIC */ | ||
98 | |||
99 | |||
100 | #ifdef LV_HAVE_SSSE3 | ||
101 | #include <tmmintrin.h> | ||
102 | |||
103 | static inline void | ||
104 | 2 | volk_8u_x3_encodepolar_8u_x2_u_ssse3(unsigned char* frame, | |
105 | unsigned char* temp, | ||
106 | const unsigned char* frozen_bit_mask, | ||
107 | const unsigned char* frozen_bits, | ||
108 | const unsigned char* info_bits, | ||
109 | unsigned int frame_size) | ||
110 | { | ||
111 | // interleave | ||
112 | 2 | interleave_frozen_and_info_bits( | |
113 | temp, frozen_bit_mask, frozen_bits, info_bits, frame_size); | ||
114 | 2 | volk_8u_x2_encodeframepolar_8u_u_ssse3(frame, temp, frame_size); | |
115 | 2 | } | |
116 | |||
117 | #endif /* LV_HAVE_SSSE3 */ | ||
118 | |||
119 | #ifdef LV_HAVE_AVX2 | ||
120 | #include <immintrin.h> | ||
121 | static inline void | ||
122 | 2 | volk_8u_x3_encodepolar_8u_x2_u_avx2(unsigned char* frame, | |
123 | unsigned char* temp, | ||
124 | const unsigned char* frozen_bit_mask, | ||
125 | const unsigned char* frozen_bits, | ||
126 | const unsigned char* info_bits, | ||
127 | unsigned int frame_size) | ||
128 | { | ||
129 | 2 | interleave_frozen_and_info_bits( | |
130 | temp, frozen_bit_mask, frozen_bits, info_bits, frame_size); | ||
131 | 2 | volk_8u_x2_encodeframepolar_8u_u_avx2(frame, temp, frame_size); | |
132 | 2 | } | |
133 | #endif /* LV_HAVE_AVX2 */ | ||
134 | |||
135 | #endif /* VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_U_H_ */ | ||
136 | |||
137 | #ifndef VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_A_H_ | ||
138 | #define VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_A_H_ | ||
139 | |||
140 | #ifdef LV_HAVE_SSSE3 | ||
141 | #include <tmmintrin.h> | ||
142 | static inline void | ||
143 | 2 | volk_8u_x3_encodepolar_8u_x2_a_ssse3(unsigned char* frame, | |
144 | unsigned char* temp, | ||
145 | const unsigned char* frozen_bit_mask, | ||
146 | const unsigned char* frozen_bits, | ||
147 | const unsigned char* info_bits, | ||
148 | unsigned int frame_size) | ||
149 | { | ||
150 | 2 | interleave_frozen_and_info_bits( | |
151 | temp, frozen_bit_mask, frozen_bits, info_bits, frame_size); | ||
152 | 2 | volk_8u_x2_encodeframepolar_8u_a_ssse3(frame, temp, frame_size); | |
153 | 2 | } | |
154 | #endif /* LV_HAVE_SSSE3 */ | ||
155 | |||
156 | #ifdef LV_HAVE_AVX2 | ||
157 | #include <immintrin.h> | ||
158 | static inline void | ||
159 | 2 | volk_8u_x3_encodepolar_8u_x2_a_avx2(unsigned char* frame, | |
160 | unsigned char* temp, | ||
161 | const unsigned char* frozen_bit_mask, | ||
162 | const unsigned char* frozen_bits, | ||
163 | const unsigned char* info_bits, | ||
164 | unsigned int frame_size) | ||
165 | { | ||
166 | 2 | interleave_frozen_and_info_bits( | |
167 | temp, frozen_bit_mask, frozen_bits, info_bits, frame_size); | ||
168 | 2 | volk_8u_x2_encodeframepolar_8u_a_avx2(frame, temp, frame_size); | |
169 | 2 | } | |
170 | #endif /* LV_HAVE_AVX2 */ | ||
171 | |||
172 | #endif /* VOLK_KERNELS_VOLK_VOLK_8U_X3_ENCODEPOLAR_8U_X2_A_H_ */ | ||
173 |