55 #ifndef INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H 56 #define INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H 63 #include <immintrin.h> 65 #ifdef LV_HAVE_LIB_SIMDMATH 72 const float normalizationFactor,
74 unsigned int num_points)
76 const float* inputPtr = (
const float*)complexFFTInput;
77 float* destPtr = logPowerOutput;
79 const float iRBW = 1.0 / rbw;
80 const float iNormalizationFactor = 1.0 / normalizationFactor;
82 #ifdef LV_HAVE_LIB_SIMDMATH 83 __m256 magScalar = _mm256_set1_ps(10.0);
84 magScalar = _mm256_div_ps(magScalar, logf4(magScalar));
86 __m256 invRBW = _mm256_set1_ps(iRBW);
88 __m256 invNormalizationFactor = _mm256_set1_ps(iNormalizationFactor);
91 __m256 input1, input2;
92 const uint64_t eighthPoints = num_points / 8;
93 for (; number < eighthPoints; number++) {
95 input1 = _mm256_load_ps(inputPtr);
97 input2 = _mm256_load_ps(inputPtr);
101 input1 = _mm256_mul_ps(input1, invNormalizationFactor);
102 input2 = _mm256_mul_ps(input2, invNormalizationFactor);
106 input1 = _mm256_mul_ps(input1, input1);
108 input2 = _mm256_mul_ps(input2, input2);
112 inputVal1 = _mm256_permute2f128_ps(input1, input2, 0x20);
113 inputVal2 = _mm256_permute2f128_ps(input1, input2, 0x31);
115 power = _mm256_hadd_ps(inputVal1, inputVal2);
118 power = _mm256_mul_ps(power, invRBW);
121 power = logf4(power);
124 power = _mm256_mul_ps(power, magScalar);
127 _mm256_store_ps(destPtr, power);
132 number = eighthPoints * 8;
135 for (; number < num_points; number++) {
142 const float real = *inputPtr++ * iNormalizationFactor;
143 const float imag = *inputPtr++ * iNormalizationFactor;
145 *destPtr = 10.0 * log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
152 #include <pmmintrin.h> 155 #ifdef LV_HAVE_LIB_SIMDMATH 156 #include <simdmath.h> 162 const float normalizationFactor,
164 unsigned int num_points)
166 const float* inputPtr = (
const float*)complexFFTInput;
167 float* destPtr = logPowerOutput;
169 const float iRBW = 1.0 / rbw;
170 const float iNormalizationFactor = 1.0 / normalizationFactor;
172 #ifdef LV_HAVE_LIB_SIMDMATH 173 __m128 magScalar = _mm_set_ps1(10.0);
174 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
176 __m128 invRBW = _mm_set_ps1(iRBW);
178 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
181 __m128 input1, input2;
182 const uint64_t quarterPoints = num_points / 4;
183 for (; number < quarterPoints; number++) {
185 input1 = _mm_load_ps(inputPtr);
187 input2 = _mm_load_ps(inputPtr);
191 input1 = _mm_mul_ps(input1, invNormalizationFactor);
192 input2 = _mm_mul_ps(input2, invNormalizationFactor);
196 input1 = _mm_mul_ps(input1, input1);
198 input2 = _mm_mul_ps(input2, input2);
202 power = _mm_hadd_ps(input1, input2);
205 power = _mm_mul_ps(power, invRBW);
208 power = logf4(power);
211 power = _mm_mul_ps(power, magScalar);
214 _mm_store_ps(destPtr, power);
219 number = quarterPoints * 4;
222 for (; number < num_points; number++) {
229 const float real = *inputPtr++ * iNormalizationFactor;
230 const float imag = *inputPtr++ * iNormalizationFactor;
232 *destPtr = 10.0 * log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
239 #ifdef LV_HAVE_GENERIC 244 const float normalizationFactor,
246 unsigned int num_points)
249 const float* inputPtr = (
float*)complexFFTInput;
250 float* realFFTDataPointsPtr = logPowerOutput;
252 const float invRBW = 1.0 / rbw;
253 const float iNormalizationFactor = 1.0 / normalizationFactor;
255 for (point = 0; point < num_points; point++) {
262 const float real = *inputPtr++ * iNormalizationFactor;
263 const float imag = *inputPtr++ * iNormalizationFactor;
265 *realFFTDataPointsPtr =
266 10.0 * log10f((((real * real) + (imag * imag)) + 1e-20) * invRBW);
268 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:242
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:160
float complex lv_32fc_t
Definition: volk_complex.h:70
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:70