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