Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _GR_MATH_H_
00028 #define _GR_MATH_H_
00029
00030 #include <gr_complex.h>
00031
00032 static inline bool
00033 gr_is_power_of_2(long x)
00034 {
00035 return x != 0 && (x & (x-1)) == 0;
00036 }
00037
00038 long gr_gcd (long m, long n);
00039
00040
00041 int gr_isnan (double value);
00042
00043
00044
00045
00046
00047
00048
00049 int gr_signbit (double x);
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 float gr_fast_atan2f(float y, float x);
00068
00069 static inline float gr_fast_atan2f(gr_complex z)
00070 {
00071 return gr_fast_atan2f(z.imag(), z.real());
00072 }
00073
00074
00075 static inline float gr_branchless_clip(float x, float clip)
00076 {
00077 float x1 = fabsf(x+clip);
00078 float x2 = fabsf(x-clip);
00079 x1 -= x2;
00080 return 0.5*x1;
00081 }
00082
00083 static inline float gr_clip(float x, float clip)
00084 {
00085 float y = x;
00086 if(x > clip)
00087 y = clip;
00088 else if(x < -clip)
00089 y = -clip;
00090 return y;
00091 }
00092
00093
00094 static inline unsigned int gr_binary_slicer(float x)
00095 {
00096 if(x >= 0)
00097 return 1;
00098 else
00099 return 0;
00100 }
00101
00102 static inline unsigned int gr_quad_45deg_slicer(float r, float i)
00103 {
00104 unsigned int ret = 0;
00105 if((r >= 0) && (i >= 0))
00106 ret = 0;
00107 else if((r < 0) && (i >= 0))
00108 ret = 1;
00109 else if((r < 0) && (i < 0))
00110 ret = 2;
00111 else
00112 ret = 3;
00113 return ret;
00114 }
00115
00116 static inline unsigned int gr_quad_0deg_slicer(float r, float i)
00117 {
00118 unsigned int ret = 0;
00119 if(fabsf(r) > fabsf(i)) {
00120 if(r > 0)
00121 ret = 0;
00122 else
00123 ret = 2;
00124 }
00125 else {
00126 if(i > 0)
00127 ret = 1;
00128 else
00129 ret = 3;
00130 }
00131
00132 return ret;
00133 }
00134
00135 static inline unsigned int gr_quad_45deg_slicer(gr_complex x)
00136 {
00137 return gr_quad_45deg_slicer(x.real(), x.imag());
00138 }
00139
00140 static inline unsigned int gr_quad_0deg_slicer(gr_complex x)
00141 {
00142 return gr_quad_0deg_slicer(x.real(), x.imag());
00143 }
00144
00145
00146 static inline unsigned int gr_branchless_binary_slicer(float x)
00147 {
00148 return (x >= 0);
00149 }
00150
00151 static inline unsigned int gr_branchless_quad_0deg_slicer(float r, float i)
00152 {
00153 unsigned int ret = 0;
00154 ret = (fabsf(r) > fabsf(i)) * (((r < 0) << 0x1));
00155 ret |= (fabsf(i) > fabsf(r)) * (((i < 0) << 0x1) | 0x1);
00156
00157 return ret;
00158 }
00159
00160 static inline unsigned int gr_branchless_quad_0deg_slicer(gr_complex x)
00161 {
00162 return gr_branchless_quad_0deg_slicer(x.real(), x.imag());
00163 }
00164
00165 static inline unsigned int gr_branchless_quad_45deg_slicer(float r, float i)
00166 {
00167 char ret = (r <= 0);
00168 ret |= ((i <= 0) << 1);
00169 return (ret ^ ((ret & 0x2) >> 0x1));
00170 }
00171
00172 static inline unsigned int gr_branchless_quad_45deg_slicer(gr_complex x)
00173 {
00174 return gr_branchless_quad_45deg_slicer(x.real(), x.imag());
00175 }
00176
00177
00178
00179
00180
00181
00182 static inline size_t
00183 gr_p2_round_down(size_t x, size_t pow2)
00184 {
00185 return x & -pow2;
00186 }
00187
00188
00189
00190
00191
00192
00193 static inline size_t
00194 gr_p2_round_up(size_t x, size_t pow2)
00195 {
00196 return gr_p2_round_down(x + pow2 - 1, pow2);
00197 }
00198
00199
00200
00201
00202
00203
00204 static inline size_t
00205 gr_p2_modulo(size_t x, size_t pow2)
00206 {
00207 return x & (pow2 - 1);
00208 }
00209
00210
00211
00212
00213
00214
00215 static inline size_t
00216 gr_p2_modulo_neg(size_t x, size_t pow2)
00217 {
00218 return pow2 - gr_p2_modulo(x, pow2);
00219 }
00220
00221 #endif