53 #ifndef INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H
54 #define INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H
60 #ifdef LV_HAVE_GENERIC
65 const float normalizationFactor,
66 unsigned int num_points)
69 const float normFactSq = 1.0 / (normalizationFactor * normalizationFactor);
93 volk_32fc_magnitude_squared_32f(logPowerOutput, complexFFTInput, num_points);
96 volk_32f_s32f_multiply_32f(logPowerOutput, logPowerOutput, normFactSq, num_points);
100 volk_32f_log2_32f(logPowerOutput, logPowerOutput, num_points);
101 volk_32f_s32f_multiply_32f(
107 #include <pmmintrin.h>
109 #ifdef LV_HAVE_LIB_SIMDMATH
110 #include <simdmath.h>
116 const float normalizationFactor,
117 unsigned int num_points)
119 const float* inputPtr = (
const float*)complexFFTInput;
120 float* destPtr = logPowerOutput;
122 const float iNormalizationFactor = 1.0 / normalizationFactor;
123 #ifdef LV_HAVE_LIB_SIMDMATH
124 __m128 magScalar = _mm_set_ps1(10.0);
125 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
127 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
130 __m128 input1, input2;
131 const uint64_t quarterPoints = num_points / 4;
132 for (; number < quarterPoints; number++) {
134 input1 = _mm_load_ps(inputPtr);
136 input2 = _mm_load_ps(inputPtr);
140 input1 = _mm_mul_ps(input1, invNormalizationFactor);
141 input2 = _mm_mul_ps(input2, invNormalizationFactor);
145 input1 = _mm_mul_ps(input1, input1);
147 input2 = _mm_mul_ps(input2, input2);
151 power = _mm_hadd_ps(input1, input2);
154 power = logf4(power);
157 power = _mm_mul_ps(power, magScalar);
160 _mm_store_ps(destPtr, power);
165 number = quarterPoints * 4;
169 for (; number < num_points; number++) {
176 const float real = *inputPtr++ * iNormalizationFactor;
177 const float imag = *inputPtr++ * iNormalizationFactor;
187 #include <arm_neon.h>
193 const float normalizationFactor,
194 unsigned int num_points)
196 float* logPowerOutputPtr = logPowerOutput;
197 const lv_32fc_t* complexFFTInputPtr = complexFFTInput;
198 const float iNormalizationFactor = 1.0 / normalizationFactor;
200 unsigned int quarter_points = num_points / 4;
201 float32x4x2_t fft_vec;
202 float32x4_t log_pwr_vec;
203 float32x4_t mag_squared_vec;
205 const float inv_ln10_10 = 4.34294481903f;
207 for (number = 0; number < quarter_points; number++) {
209 fft_vec = vld2q_f32((
float*)complexFFTInputPtr);
213 fft_vec.val[0] = vmulq_n_f32(fft_vec.val[0], iNormalizationFactor);
214 fft_vec.val[1] = vmulq_n_f32(fft_vec.val[1], iNormalizationFactor);
216 log_pwr_vec = vmulq_n_f32(
_vlogq_f32(mag_squared_vec), inv_ln10_10);
218 vst1q_f32(logPowerOutputPtr, log_pwr_vec);
220 complexFFTInputPtr += 4;
221 logPowerOutputPtr += 4;
225 for (number = quarter_points * 4; number < num_points; number++) {
226 const float real =
lv_creal(*complexFFTInputPtr) * iNormalizationFactor;
227 const float imag =
lv_cimag(*complexFFTInputPtr) * iNormalizationFactor;
231 complexFFTInputPtr++;
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:114
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:63
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:191
#define volk_log2to10factor
Definition: volk_common.h:160
static float log2f_non_ieee(float f)
Definition: volk_common.h:150
#define __VOLK_PREFETCH(addr)
Definition: volk_common.h:62
#define lv_cimag(x)
Definition: volk_complex.h:89
#define lv_creal(x)
Definition: volk_complex.h:87
float complex lv_32fc_t
Definition: volk_complex.h:65
static float32x4_t _vlogq_f32(float32x4_t x)
Definition: volk_neon_intrinsics.h:157
static float32x4_t _vmagnitudesquaredq_f32(float32x4x2_t cmplxValue)
Definition: volk_neon_intrinsics.h:87