23 #ifndef INCLUDED_volk_32f_s32f_calc_spectral_noise_floor_32f_a_H
24 #define INCLUDED_volk_32f_s32f_calc_spectral_noise_floor_32f_a_H
31 #include <xmmintrin.h>
42 static inline void volk_32f_s32f_calc_spectral_noise_floor_32f_a_sse(
float* noiseFloorAmplitude,
const float* realDataPoints,
const float spectralExclusionValue,
const unsigned int num_points){
43 unsigned int number = 0;
44 const unsigned int quarterPoints = num_points / 4;
46 const float* dataPointsPtr = realDataPoints;
50 __m128 avgPointsVal = _mm_setzero_ps();
52 for(; number < quarterPoints; number++){
54 dataPointsVal = _mm_load_ps(dataPointsPtr);
58 avgPointsVal = _mm_add_ps(avgPointsVal, dataPointsVal);
61 _mm_store_ps(avgPointsVector, avgPointsVal);
64 sumMean += avgPointsVector[0];
65 sumMean += avgPointsVector[1];
66 sumMean += avgPointsVector[2];
67 sumMean += avgPointsVector[3];
69 number = quarterPoints * 4;
70 for(;number < num_points; number++){
71 sumMean += realDataPoints[number];
77 const float meanAmplitude = (sumMean / ((float)num_points)) + spectralExclusionValue;
79 dataPointsPtr = realDataPoints;
80 __m128 vMeanAmplitudeVector = _mm_set_ps1(meanAmplitude);
81 __m128 vOnesVector = _mm_set_ps1(1.0);
82 __m128 vValidBinCount = _mm_setzero_ps();
83 avgPointsVal = _mm_setzero_ps();
87 for(; number < quarterPoints; number++){
89 dataPointsVal = _mm_load_ps(dataPointsPtr);
94 compareMask = _mm_cmple_ps(dataPointsVal, vMeanAmplitudeVector);
97 avgPointsVal = _mm_add_ps(avgPointsVal, _mm_and_ps(compareMask, dataPointsVal));
100 vValidBinCount = _mm_add_ps(vValidBinCount, _mm_and_ps(compareMask, vOnesVector));
104 _mm_store_ps(avgPointsVector, avgPointsVal);
107 sumMean += avgPointsVector[0];
108 sumMean += avgPointsVector[1];
109 sumMean += avgPointsVector[2];
110 sumMean += avgPointsVector[3];
114 _mm_store_ps(validBinCountVector, vValidBinCount);
116 float validBinCount = 0;
117 validBinCount += validBinCountVector[0];
118 validBinCount += validBinCountVector[1];
119 validBinCount += validBinCountVector[2];
120 validBinCount += validBinCountVector[3];
122 number = quarterPoints * 4;
123 for(;number < num_points; number++){
124 if(realDataPoints[number] <= meanAmplitude){
125 sumMean += realDataPoints[number];
126 validBinCount += 1.0;
130 float localNoiseFloorAmplitude = 0;
131 if(validBinCount > 0.0){
132 localNoiseFloorAmplitude = sumMean / validBinCount;
135 localNoiseFloorAmplitude = meanAmplitude;
138 *noiseFloorAmplitude = localNoiseFloorAmplitude;
142 #ifdef LV_HAVE_GENERIC
153 static inline void volk_32f_s32f_calc_spectral_noise_floor_32f_generic(
float* noiseFloorAmplitude,
const float* realDataPoints,
const float spectralExclusionValue,
const unsigned int num_points){
157 for(number = 0; number < num_points; number++){
159 sumMean += realDataPoints[number];
165 const float meanAmplitude = (sumMean / num_points) + spectralExclusionValue;
169 unsigned int newNumDataPoints = num_points;
170 for(number = 0; number < num_points; number++){
171 if (realDataPoints[number] <= meanAmplitude)
172 sumMean += realDataPoints[number];
177 float localNoiseFloorAmplitude = 0.0;
178 if (newNumDataPoints == 0)
179 localNoiseFloorAmplitude = meanAmplitude;
181 localNoiseFloorAmplitude = sumMean / ((float)newNumDataPoints);
183 *noiseFloorAmplitude = localNoiseFloorAmplitude;
#define __VOLK_ATTR_ALIGNED(x)
Definition: volk_common.h:27