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 70 const float normalizationFactor,
71 unsigned int num_points)
73 const float* inputPtr = (
const float*)complexFFTInput;
74 float* destPtr = logPowerOutput;
76 const float iNormalizationFactor = 1.0 / normalizationFactor;
77 #ifdef LV_HAVE_LIB_SIMDMATH 78 __m128 magScalar = _mm_set_ps1(10.0);
79 magScalar = _mm_div_ps(magScalar, logf4(magScalar));
81 __m128 invNormalizationFactor = _mm_set_ps1(iNormalizationFactor);
84 __m128 input1, input2;
85 const uint64_t quarterPoints = num_points / 4;
86 for (; number < quarterPoints; number++) {
88 input1 = _mm_load_ps(inputPtr);
90 input2 = _mm_load_ps(inputPtr);
94 input1 = _mm_mul_ps(input1, invNormalizationFactor);
95 input2 = _mm_mul_ps(input2, invNormalizationFactor);
99 input1 = _mm_mul_ps(input1, input1);
101 input2 = _mm_mul_ps(input2, input2);
105 power = _mm_hadd_ps(input1, input2);
108 power = logf4(power);
111 power = _mm_mul_ps(power, magScalar);
114 _mm_store_ps(destPtr, power);
119 number = quarterPoints * 4;
123 for (; number < num_points; number++) {
130 const float real = *inputPtr++ * iNormalizationFactor;
131 const float imag = *inputPtr++ * iNormalizationFactor;
133 *destPtr = 10.0 * log10f(((real * real) + (imag * imag)) + 1e-20);
141 #include <arm_neon.h> 147 const float normalizationFactor,
148 unsigned int num_points)
150 float* logPowerOutputPtr = logPowerOutput;
151 const lv_32fc_t* complexFFTInputPtr = complexFFTInput;
152 const float iNormalizationFactor = 1.0 / normalizationFactor;
154 unsigned int quarter_points = num_points / 4;
155 float32x4x2_t fft_vec;
156 float32x4_t log_pwr_vec;
157 float32x4_t mag_squared_vec;
159 const float inv_ln10_10 = 4.34294481903f;
161 for (number = 0; number < quarter_points; number++) {
163 fft_vec = vld2q_f32((
float*)complexFFTInputPtr);
167 fft_vec.val[0] = vmulq_n_f32(fft_vec.val[0], iNormalizationFactor);
168 fft_vec.val[1] = vmulq_n_f32(fft_vec.val[1], iNormalizationFactor);
170 log_pwr_vec = vmulq_n_f32(
_vlogq_f32(mag_squared_vec), inv_ln10_10);
172 vst1q_f32(logPowerOutputPtr, log_pwr_vec);
174 complexFFTInputPtr += 4;
175 logPowerOutputPtr += 4;
179 for (number = quarter_points * 4; number < num_points; number++) {
180 const float real =
lv_creal(*complexFFTInputPtr) * iNormalizationFactor;
181 const float imag =
lv_cimag(*complexFFTInputPtr) * iNormalizationFactor;
182 *logPowerOutputPtr = 10.0 * log10f(((real * real) + (imag * imag)) + 1e-20);
183 complexFFTInputPtr++;
190 #ifdef LV_HAVE_GENERIC 195 const float normalizationFactor,
196 unsigned int num_points)
199 const float* inputPtr = (
float*)complexFFTInput;
200 float* realFFTDataPointsPtr = logPowerOutput;
201 const float iNormalizationFactor = 1.0 / normalizationFactor;
203 for (point = 0; point < num_points; point++) {
210 const float real = *inputPtr++ * iNormalizationFactor;
211 const float imag = *inputPtr++ * iNormalizationFactor;
213 *realFFTDataPointsPtr = 10.0 * log10f(((real * real) + (imag * imag)) + 1e-20);
214 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:145
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:193
static float32x4_t _vmagnitudesquaredq_f32(float32x4x2_t cmplxValue)
Definition: volk_neon_intrinsics.h:87
#define __VOLK_PREFETCH(addr)
Definition: volk_common.h:62
float complex lv_32fc_t
Definition: volk_complex.h:70
static float32x4_t _vlogq_f32(float32x4_t x)
Definition: volk_neon_intrinsics.h:157
#define lv_creal(x)
Definition: volk_complex.h:92
#define lv_cimag(x)
Definition: volk_complex.h:94