54 #ifndef INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H 55 #define INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H 62 #include <immintrin.h> 64 #ifdef LV_HAVE_LIB_SIMDMATH 70 const float normalizationFactor,
const float rbw,
71 unsigned int num_points)
73 const float* inputPtr = (
const float*)complexFFTInput;
74 float* destPtr = logPowerOutput;
76 const float iRBW = 1.0 / rbw;
77 const float iNormalizationFactor = 1.0 / normalizationFactor;
79 #ifdef LV_HAVE_LIB_SIMDMATH 80 __m256 magScalar = _mm256_set1_ps(10.0);
81 magScalar = _mm256_div_ps(magScalar, logf4(magScalar));
83 __m256 invRBW = _mm256_set1_ps(iRBW);
85 __m256 invNormalizationFactor = _mm256_set1_ps(iNormalizationFactor);
88 __m256 input1, input2;
89 const uint64_t eighthPoints = num_points / 8;
90 for(;number < eighthPoints; number++){
92 input1 =_mm256_load_ps(inputPtr);
94 input2 =_mm256_load_ps(inputPtr);
98 input1 = _mm256_mul_ps(input1, invNormalizationFactor);
99 input2 = _mm256_mul_ps(input2, invNormalizationFactor);
103 input1 = _mm256_mul_ps(input1, input1);
105 input2 = _mm256_mul_ps(input2, input2);
109 inputVal1 = _mm256_permute2f128_ps(input1, input2, 0x20);
110 inputVal2 = _mm256_permute2f128_ps(input1, input2, 0x31);
112 power = _mm256_hadd_ps(inputVal1, inputVal2);
115 power = _mm256_mul_ps(power, invRBW);
118 power = logf4(power);
121 power = _mm256_mul_ps(power, magScalar);
124 _mm256_store_ps(destPtr, power);
129 number = eighthPoints*8;
132 for(; number < num_points; number++){
139 const float real = *inputPtr++ * iNormalizationFactor;
140 const float imag = *inputPtr++ * iNormalizationFactor;
142 *destPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
150 #include <pmmintrin.h> 154 #ifdef LV_HAVE_LIB_SIMDMATH 155 #include <simdmath.h> 160 const float normalizationFactor,
const float rbw,
161 unsigned int num_points)
163 const float* inputPtr = (
const float*)complexFFTInput;
164 float* destPtr = logPowerOutput;
166 const float iRBW = 1.0 / rbw;
167 const float iNormalizationFactor = 1.0 / normalizationFactor;
169 #ifdef LV_HAVE_LIB_SIMDMATH 170 __m128 magScalar = _mm_set_ps1(10.0);
171 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
173 __m128 invRBW = _mm_set_ps1(iRBW);
175 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
178 __m128 input1, input2;
179 const uint64_t quarterPoints = num_points / 4;
180 for(;number < quarterPoints; number++){
182 input1 =_mm_load_ps(inputPtr);
184 input2 =_mm_load_ps(inputPtr);
188 input1 = _mm_mul_ps(input1, invNormalizationFactor);
189 input2 = _mm_mul_ps(input2, invNormalizationFactor);
193 input1 = _mm_mul_ps(input1, input1);
195 input2 = _mm_mul_ps(input2, input2);
199 power = _mm_hadd_ps(input1, input2);
202 power = _mm_mul_ps(power, invRBW);
205 power = logf4(power);
208 power = _mm_mul_ps(power, magScalar);
211 _mm_store_ps(destPtr, power);
216 number = quarterPoints*4;
219 for(; number < num_points; number++){
226 const float real = *inputPtr++ * iNormalizationFactor;
227 const float imag = *inputPtr++ * iNormalizationFactor;
229 *destPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
237 #ifdef LV_HAVE_GENERIC 241 const float normalizationFactor,
const float rbw,
242 unsigned int num_points)
245 const float* inputPtr = (
float*)complexFFTInput;
246 float* realFFTDataPointsPtr = logPowerOutput;
248 const float invRBW = 1.0 / rbw;
249 const float iNormalizationFactor = 1.0 / normalizationFactor;
251 for(point = 0; point < num_points; point++){
258 const float real = *inputPtr++ * iNormalizationFactor;
259 const float imag = *inputPtr++ * iNormalizationFactor;
261 *realFFTDataPointsPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * invRBW);
263 realFFTDataPointsPtr++;
static void volk_32fc_s32f_x2_power_spectral_density_32f_generic(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, const float rbw, unsigned int num_points)
Definition: volk_32fc_s32f_x2_power_spectral_density_32f.h:240
static void volk_32fc_s32f_x2_power_spectral_density_32f_a_sse3(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, const float rbw, unsigned int num_points)
Definition: volk_32fc_s32f_x2_power_spectral_density_32f.h:159
float complex lv_32fc_t
Definition: volk_complex.h:61
static void volk_32fc_s32f_x2_power_spectral_density_32f_a_avx(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, const float rbw, unsigned int num_points)
Definition: volk_32fc_s32f_x2_power_spectral_density_32f.h:69