53 #ifndef INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H 54 #define INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H 61 #include <pmmintrin.h> 63 #ifdef LV_HAVE_LIB_SIMDMATH 69 const float normalizationFactor,
unsigned int num_points)
71 const float* inputPtr = (
const float*)complexFFTInput;
72 float* destPtr = logPowerOutput;
74 const float iNormalizationFactor = 1.0 / normalizationFactor;
75 #ifdef LV_HAVE_LIB_SIMDMATH 76 __m128 magScalar = _mm_set_ps1(10.0);
77 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
79 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
82 __m128 input1, input2;
83 const uint64_t quarterPoints = num_points / 4;
84 for(;number < quarterPoints; number++){
86 input1 =_mm_load_ps(inputPtr);
88 input2 =_mm_load_ps(inputPtr);
92 input1 = _mm_mul_ps(input1, invNormalizationFactor);
93 input2 = _mm_mul_ps(input2, invNormalizationFactor);
97 input1 = _mm_mul_ps(input1, input1);
99 input2 = _mm_mul_ps(input2, input2);
103 power = _mm_hadd_ps(input1, input2);
106 power = logf4(power);
109 power = _mm_mul_ps(power, magScalar);
112 _mm_store_ps(destPtr, power);
117 number = quarterPoints*4;
121 for(; number < num_points; number++){
128 const float real = *inputPtr++ * iNormalizationFactor;
129 const float imag = *inputPtr++ * iNormalizationFactor;
131 *destPtr = 10.0*log10f(((real * real) + (imag * imag)) + 1e-20);
140 #include <arm_neon.h> 146 float* logPowerOutputPtr = logPowerOutput;
147 const lv_32fc_t* complexFFTInputPtr = complexFFTInput;
148 const float iNormalizationFactor = 1.0 / normalizationFactor;
150 unsigned int quarter_points = num_points / 4;
151 float32x4x2_t fft_vec;
152 float32x4_t log_pwr_vec;
153 float32x4_t mag_squared_vec;
155 const float inv_ln10_10 = 4.34294481903f;
157 for(number = 0; number < quarter_points; number++) {
159 fft_vec = vld2q_f32((
float*)complexFFTInputPtr);
163 fft_vec.val[0] = vmulq_n_f32(fft_vec.val[0], iNormalizationFactor);
164 fft_vec.val[1] = vmulq_n_f32(fft_vec.val[1], iNormalizationFactor);
166 log_pwr_vec = vmulq_n_f32(
_vlogq_f32(mag_squared_vec), inv_ln10_10);
168 vst1q_f32(logPowerOutputPtr, log_pwr_vec);
170 complexFFTInputPtr+=4;
171 logPowerOutputPtr+=4;
175 for(number = quarter_points * 4; number < num_points; number++) {
176 const float real =
lv_creal(*complexFFTInputPtr) * iNormalizationFactor;
177 const float imag =
lv_cimag(*complexFFTInputPtr) * iNormalizationFactor;
178 *logPowerOutputPtr = 10.0 * log10f(((real * real) + (imag * imag)) + 1e-20);
179 complexFFTInputPtr++;
186 #ifdef LV_HAVE_GENERIC 190 const float normalizationFactor,
unsigned int num_points)
193 const float* inputPtr = (
float*)complexFFTInput;
194 float* realFFTDataPointsPtr = logPowerOutput;
195 const float iNormalizationFactor = 1.0 / normalizationFactor;
197 for(point = 0; point < num_points; point++){
204 const float real = *inputPtr++ * iNormalizationFactor;
205 const float imag = *inputPtr++ * iNormalizationFactor;
207 *realFFTDataPointsPtr = 10.0*log10f(((real * real) + (imag * imag)) + 1e-20);
208 realFFTDataPointsPtr++;
static void volk_32fc_s32f_power_spectrum_32f_neon(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, unsigned int num_points)
Definition: volk_32fc_s32f_power_spectrum_32f.h:144
static void volk_32fc_s32f_power_spectrum_32f_a_sse3(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, unsigned int num_points)
Definition: volk_32fc_s32f_power_spectrum_32f.h:68
static void volk_32fc_s32f_power_spectrum_32f_generic(float *logPowerOutput, const lv_32fc_t *complexFFTInput, const float normalizationFactor, unsigned int num_points)
Definition: volk_32fc_s32f_power_spectrum_32f.h:189
static float32x4_t _vmagnitudesquaredq_f32(float32x4x2_t cmplxValue)
Definition: volk_neon_intrinsics.h:88
#define __VOLK_PREFETCH(addr)
Definition: volk_common.h:53
float complex lv_32fc_t
Definition: volk_complex.h:61
static float32x4_t _vlogq_f32(float32x4_t x)
Definition: volk_neon_intrinsics.h:156
#define lv_creal(x)
Definition: volk_complex.h:83
#define lv_cimag(x)
Definition: volk_complex.h:85