23 #ifndef INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H
24 #define INCLUDED_volk_32fc_s32f_x2_power_spectral_density_32f_a_H
31 #include <immintrin.h>
33 #ifdef LV_HAVE_LIB_SIMDMATH
45 static inline 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){
46 const float* inputPtr = (
const float*)complexFFTInput;
47 float* destPtr = logPowerOutput;
49 const float iRBW = 1.0 / rbw;
50 const float iNormalizationFactor = 1.0 / normalizationFactor;
52 #ifdef LV_HAVE_LIB_SIMDMATH
53 __m256 magScalar = _mm256_set1_ps(10.0);
54 magScalar = _mm256_div_ps(magScalar, logf4(magScalar));
56 __m256 invRBW = _mm256_set1_ps(iRBW);
58 __m256 invNormalizationFactor = _mm256_set1_ps(iNormalizationFactor);
61 __m256 input1, input2;
62 const uint64_t eighthPoints = num_points / 8;
63 for(;number < eighthPoints; number++){
65 input1 =_mm256_load_ps(inputPtr);
67 input2 =_mm256_load_ps(inputPtr);
71 input1 = _mm256_mul_ps(input1, invNormalizationFactor);
72 input2 = _mm256_mul_ps(input2, invNormalizationFactor);
76 input1 = _mm256_mul_ps(input1, input1);
78 input2 = _mm256_mul_ps(input2, input2);
82 inputVal1 = _mm256_permute2f128_ps(input1, input2, 0x20);
83 inputVal2 = _mm256_permute2f128_ps(input1, input2, 0x31);
85 power = _mm256_hadd_ps(inputVal1, inputVal2);
88 power = _mm256_mul_ps(power, invRBW);
94 power = _mm256_mul_ps(power, magScalar);
97 _mm256_store_ps(destPtr, power);
102 number = eighthPoints*8;
105 for(; number < num_points; number++){
112 const float real = *inputPtr++ * iNormalizationFactor;
113 const float imag = *inputPtr++ * iNormalizationFactor;
115 *destPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
123 #include <pmmintrin.h>
125 #ifdef LV_HAVE_LIB_SIMDMATH
126 #include <simdmath.h>
137 static inline 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){
138 const float* inputPtr = (
const float*)complexFFTInput;
139 float* destPtr = logPowerOutput;
141 const float iRBW = 1.0 / rbw;
142 const float iNormalizationFactor = 1.0 / normalizationFactor;
144 #ifdef LV_HAVE_LIB_SIMDMATH
145 __m128 magScalar = _mm_set_ps1(10.0);
146 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
148 __m128 invRBW = _mm_set_ps1(iRBW);
150 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
153 __m128 input1, input2;
154 const uint64_t quarterPoints = num_points / 4;
155 for(;number < quarterPoints; number++){
157 input1 =_mm_load_ps(inputPtr);
159 input2 =_mm_load_ps(inputPtr);
163 input1 = _mm_mul_ps(input1, invNormalizationFactor);
164 input2 = _mm_mul_ps(input2, invNormalizationFactor);
168 input1 = _mm_mul_ps(input1, input1);
170 input2 = _mm_mul_ps(input2, input2);
174 power = _mm_hadd_ps(input1, input2);
177 power = _mm_mul_ps(power, invRBW);
180 power = logf4(power);
183 power = _mm_mul_ps(power, magScalar);
186 _mm_store_ps(destPtr, power);
191 number = quarterPoints*4;
194 for(; number < num_points; number++){
201 const float real = *inputPtr++ * iNormalizationFactor;
202 const float imag = *inputPtr++ * iNormalizationFactor;
204 *destPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * iRBW);
211 #ifdef LV_HAVE_GENERIC
220 static inline 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){
222 const float* inputPtr = (
float*)complexFFTInput;
223 float* realFFTDataPointsPtr = logPowerOutput;
225 const float invRBW = 1.0 / rbw;
226 const float iNormalizationFactor = 1.0 / normalizationFactor;
228 for(point = 0; point < num_points; point++){
235 const float real = *inputPtr++ * iNormalizationFactor;
236 const float imag = *inputPtr++ * iNormalizationFactor;
238 *realFFTDataPointsPtr = 10.0*log10f((((real * real) + (imag * imag)) + 1e-20) * invRBW);
240 realFFTDataPointsPtr++;
unsigned __int64 uint64_t
Definition: stdint.h:90
float complex lv_32fc_t
Definition: volk_complex.h:56