40#ifndef INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H
41#define INCLUDED_volk_32fc_s32f_power_spectrum_32f_a_H
52 const float normalizationFactor,
53 unsigned int num_points)
56 const float normFactSq = 1.0 / (normalizationFactor * normalizationFactor);
80 volk_32fc_magnitude_squared_32f(logPowerOutput, complexFFTInput, num_points);
83 volk_32f_s32f_multiply_32f(logPowerOutput, logPowerOutput, normFactSq, num_points);
87 volk_32f_log2_32f(logPowerOutput, logPowerOutput, num_points);
88 volk_32f_s32f_multiply_32f(
96#ifdef LV_HAVE_LIB_SIMDMATH
103 const float normalizationFactor,
104 unsigned int num_points)
106 const float* inputPtr = (
const float*)complexFFTInput;
107 float* destPtr = logPowerOutput;
109 const float iNormalizationFactor = 1.0 / normalizationFactor;
110#ifdef LV_HAVE_LIB_SIMDMATH
112 magScalar =
_mm_div_ps(magScalar, logf4(magScalar));
118 const uint64_t quarterPoints = num_points / 4;
119 for (; number < quarterPoints; number++) {
127 input1 =
_mm_mul_ps(input1, invNormalizationFactor);
128 input2 =
_mm_mul_ps(input2, invNormalizationFactor);
141 power = logf4(power);
152 number = quarterPoints * 4;
156 for (; number < num_points; number++) {
163 const float real = *inputPtr++ * iNormalizationFactor;
164 const float imag = *inputPtr++ * iNormalizationFactor;
180 const float normalizationFactor,
181 unsigned int num_points)
183 float* logPowerOutputPtr = logPowerOutput;
184 const lv_32fc_t* complexFFTInputPtr = complexFFTInput;
185 const float iNormalizationFactor = 1.0 / normalizationFactor;
187 unsigned int quarter_points = num_points / 4;
188 float32x4x2_t fft_vec;
189 float32x4_t log_pwr_vec;
190 float32x4_t mag_squared_vec;
192 const float inv_ln10_10 = 4.34294481903f;
194 for (number = 0; number < quarter_points; number++) {
196 fft_vec = vld2q_f32((
float*)complexFFTInputPtr);
200 fft_vec.val[0] = vmulq_n_f32(fft_vec.val[0], iNormalizationFactor);
201 fft_vec.val[1] = vmulq_n_f32(fft_vec.val[1], iNormalizationFactor);
203 log_pwr_vec = vmulq_n_f32(
_vlogq_f32(mag_squared_vec), inv_ln10_10);
205 vst1q_f32(logPowerOutputPtr, log_pwr_vec);
207 complexFFTInputPtr += 4;
208 logPowerOutputPtr += 4;
212 for (number = quarter_points * 4; number < num_points; number++) {
213 const float real =
lv_creal(*complexFFTInputPtr) * iNormalizationFactor;
214 const float imag =
lv_cimag(*complexFFTInputPtr) * iNormalizationFactor;
218 complexFFTInputPtr++;