Vector Optimized Library of Kernels 2.5.1
Architecture-tuned implementations of math kernels
volk_32f_8u_polarbutterflypuppet_32f.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2015 Free Software Foundation, Inc.
4 *
5 * This file is part of GNU Radio
6 *
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3, or (at your option)
10 * any later version.
11 *
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Radio; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street,
20 * Boston, MA 02110-1301, USA.
21 */
22
23/*
24 * This puppet is for VOLK tests only.
25 * For documentation see 'kernels/volk/volk_32f_8u_polarbutterfly_32f.h'
26 */
27
28#ifndef VOLK_KERNELS_VOLK_VOLK_32F_8U_POLARBUTTERFLYPUPPET_32F_H_
29#define VOLK_KERNELS_VOLK_VOLK_32F_8U_POLARBUTTERFLYPUPPET_32F_H_
30
34
35
36static inline void sanitize_bytes(unsigned char* u, const int elements)
37{
38 int i;
39 unsigned char* u_ptr = u;
40 for (i = 0; i < elements; i++) {
41 *u_ptr = (*u_ptr & 0x01);
42 u_ptr++;
43 }
44}
45
46static inline void clean_up_intermediate_values(float* llrs,
47 unsigned char* u,
48 const int frame_size,
49 const int elements)
50{
51 memset(u + frame_size, 0, sizeof(unsigned char) * (elements - frame_size));
52 memset(llrs + frame_size, 0, sizeof(float) * (elements - frame_size));
53}
54
55static inline void
56generate_error_free_input_vector(float* llrs, unsigned char* u, const int frame_size)
57{
58 memset(u, 0, frame_size);
59 unsigned char* target = u + frame_size;
60 volk_8u_x2_encodeframepolar_8u_generic(target, u + 2 * frame_size, frame_size);
61 float* ft = llrs;
62 int i;
63 for (i = 0; i < frame_size; i++) {
64 *ft = (-2 * ((float)*target++)) + 1.0f;
65 ft++;
66 }
67}
68
69static inline void
70print_llr_tree(const float* llrs, const int frame_size, const int frame_exp)
71{
72 int s, e;
73 for (s = 0; s < frame_size; s++) {
74 for (e = 0; e < frame_exp + 1; e++) {
75 printf("%+4.2f ", llrs[e * frame_size + s]);
76 }
77 printf("\n");
78 if ((s + 1) % 8 == 0) {
79 printf("\n");
80 }
81 }
82}
83
84static inline int maximum_frame_size(const int elements)
85{
86 unsigned int frame_size = next_lower_power_of_two(elements);
87 unsigned int frame_exp = log2_of_power_of_2(frame_size);
88 return next_lower_power_of_two(frame_size / frame_exp);
89}
90
91#ifdef LV_HAVE_GENERIC
92static inline void volk_32f_8u_polarbutterflypuppet_32f_generic(float* llrs,
93 const float* input,
94 unsigned char* u,
95 const int elements)
96{
97 unsigned int frame_size = maximum_frame_size(elements);
98 unsigned int frame_exp = log2_of_power_of_2(frame_size);
99
100 sanitize_bytes(u, elements);
101 clean_up_intermediate_values(llrs, u, frame_size, elements);
102 generate_error_free_input_vector(llrs + frame_exp * frame_size, u, frame_size);
103
104 unsigned int u_num = 0;
105 for (; u_num < frame_size; u_num++) {
106 volk_32f_8u_polarbutterfly_32f_generic(llrs, u, frame_exp, 0, u_num, u_num);
107 u[u_num] = llrs[u_num] > 0 ? 0 : 1;
108 }
109
110 clean_up_intermediate_values(llrs, u, frame_size, elements);
111}
112#endif /* LV_HAVE_GENERIC */
113
114#ifdef LV_HAVE_AVX
115static inline void volk_32f_8u_polarbutterflypuppet_32f_u_avx(float* llrs,
116 const float* input,
117 unsigned char* u,
118 const int elements)
119{
120 unsigned int frame_size = maximum_frame_size(elements);
121 unsigned int frame_exp = log2_of_power_of_2(frame_size);
122
123 sanitize_bytes(u, elements);
124 clean_up_intermediate_values(llrs, u, frame_size, elements);
125 generate_error_free_input_vector(llrs + frame_exp * frame_size, u, frame_size);
126
127 unsigned int u_num = 0;
128 for (; u_num < frame_size; u_num++) {
129 volk_32f_8u_polarbutterfly_32f_u_avx(llrs, u, frame_exp, 0, u_num, u_num);
130 u[u_num] = llrs[u_num] > 0 ? 0 : 1;
131 }
132
133 clean_up_intermediate_values(llrs, u, frame_size, elements);
134}
135#endif /* LV_HAVE_AVX */
136
137#ifdef LV_HAVE_AVX2
138static inline void volk_32f_8u_polarbutterflypuppet_32f_u_avx2(float* llrs,
139 const float* input,
140 unsigned char* u,
141 const int elements)
142{
143 unsigned int frame_size = maximum_frame_size(elements);
144 unsigned int frame_exp = log2_of_power_of_2(frame_size);
145
146 sanitize_bytes(u, elements);
147 clean_up_intermediate_values(llrs, u, frame_size, elements);
148 generate_error_free_input_vector(llrs + frame_exp * frame_size, u, frame_size);
149
150 unsigned int u_num = 0;
151 for (; u_num < frame_size; u_num++) {
152 volk_32f_8u_polarbutterfly_32f_u_avx2(llrs, u, frame_exp, 0, u_num, u_num);
153 u[u_num] = llrs[u_num] > 0 ? 0 : 1;
154 }
155
156 clean_up_intermediate_values(llrs, u, frame_size, elements);
157}
158#endif /* LV_HAVE_AVX2 */
159
160
161#endif /* VOLK_KERNELS_VOLK_VOLK_32F_8U_POLARBUTTERFLYPUPPET_32F_H_ */
static void volk_32f_8u_polarbutterfly_32f_generic(float *llrs, unsigned char *u, const int frame_exp, const int stage, const int u_num, const int row)
Definition: volk_32f_8u_polarbutterfly_32f.h:157
static void volk_32f_8u_polarbutterfly_32f_u_avx(float *llrs, unsigned char *u, const int frame_exp, const int stage, const int u_num, const int row)
Definition: volk_32f_8u_polarbutterfly_32f.h:213
static void clean_up_intermediate_values(float *llrs, unsigned char *u, const int frame_size, const int elements)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:46
static void print_llr_tree(const float *llrs, const int frame_size, const int frame_exp)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:70
static void volk_32f_8u_polarbutterflypuppet_32f_generic(float *llrs, const float *input, unsigned char *u, const int elements)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:92
static int maximum_frame_size(const int elements)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:84
static void generate_error_free_input_vector(float *llrs, unsigned char *u, const int frame_size)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:56
static void sanitize_bytes(unsigned char *u, const int elements)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:36
static void volk_32f_8u_polarbutterflypuppet_32f_u_avx(float *llrs, const float *input, unsigned char *u, const int elements)
Definition: volk_32f_8u_polarbutterflypuppet_32f.h:115
static void volk_8u_x2_encodeframepolar_8u_generic(unsigned char *frame, unsigned char *temp, unsigned int frame_size)
Definition: volk_8u_x2_encodeframepolar_8u.h:65
static unsigned int log2_of_power_of_2(unsigned int val)
Definition: volk_8u_x2_encodeframepolar_8u.h:31
static unsigned int next_lower_power_of_two(const unsigned int val)
Definition: volk_8u_x3_encodepolarpuppet_8u.h:32
for i
Definition: volk_config_fixed.tmpl.h:25