59 #ifndef INCLUDED_volk_32f_s32f_calc_spectral_noise_floor_32f_a_H
60 #define INCLUDED_volk_32f_s32f_calc_spectral_noise_floor_32f_a_H
67 #include <xmmintrin.h>
70 volk_32f_s32f_calc_spectral_noise_floor_32f_a_sse(
float* noiseFloorAmplitude,
71 const float* realDataPoints,
72 const float spectralExclusionValue,
73 const unsigned int num_points)
75 unsigned int number = 0;
76 const unsigned int quarterPoints = num_points / 4;
78 const float* dataPointsPtr = realDataPoints;
82 __m128 avgPointsVal = _mm_setzero_ps();
84 for(; number < quarterPoints; number++){
86 dataPointsVal = _mm_load_ps(dataPointsPtr);
90 avgPointsVal = _mm_add_ps(avgPointsVal, dataPointsVal);
93 _mm_store_ps(avgPointsVector, avgPointsVal);
96 sumMean += avgPointsVector[0];
97 sumMean += avgPointsVector[1];
98 sumMean += avgPointsVector[2];
99 sumMean += avgPointsVector[3];
101 number = quarterPoints * 4;
102 for(;number < num_points; number++){
103 sumMean += realDataPoints[number];
109 const float meanAmplitude = (sumMean / ((float)num_points)) + spectralExclusionValue;
111 dataPointsPtr = realDataPoints;
112 __m128 vMeanAmplitudeVector = _mm_set_ps1(meanAmplitude);
113 __m128 vOnesVector = _mm_set_ps1(1.0);
114 __m128 vValidBinCount = _mm_setzero_ps();
115 avgPointsVal = _mm_setzero_ps();
119 for(; number < quarterPoints; number++){
121 dataPointsVal = _mm_load_ps(dataPointsPtr);
126 compareMask = _mm_cmple_ps(dataPointsVal, vMeanAmplitudeVector);
129 avgPointsVal = _mm_add_ps(avgPointsVal, _mm_and_ps(compareMask, dataPointsVal));
132 vValidBinCount = _mm_add_ps(vValidBinCount, _mm_and_ps(compareMask, vOnesVector));
136 _mm_store_ps(avgPointsVector, avgPointsVal);
139 sumMean += avgPointsVector[0];
140 sumMean += avgPointsVector[1];
141 sumMean += avgPointsVector[2];
142 sumMean += avgPointsVector[3];
146 _mm_store_ps(validBinCountVector, vValidBinCount);
148 float validBinCount = 0;
149 validBinCount += validBinCountVector[0];
150 validBinCount += validBinCountVector[1];
151 validBinCount += validBinCountVector[2];
152 validBinCount += validBinCountVector[3];
154 number = quarterPoints * 4;
155 for(;number < num_points; number++){
156 if(realDataPoints[number] <= meanAmplitude){
157 sumMean += realDataPoints[number];
158 validBinCount += 1.0;
162 float localNoiseFloorAmplitude = 0;
163 if(validBinCount > 0.0){
164 localNoiseFloorAmplitude = sumMean / validBinCount;
167 localNoiseFloorAmplitude = meanAmplitude;
170 *noiseFloorAmplitude = localNoiseFloorAmplitude;
175 #ifdef LV_HAVE_GENERIC
178 volk_32f_s32f_calc_spectral_noise_floor_32f_generic(
float* noiseFloorAmplitude,
179 const float* realDataPoints,
180 const float spectralExclusionValue,
181 const unsigned int num_points)
186 for(number = 0; number < num_points; number++){
188 sumMean += realDataPoints[number];
194 const float meanAmplitude = (sumMean / num_points) + spectralExclusionValue;
198 unsigned int newNumDataPoints = num_points;
199 for(number = 0; number < num_points; number++){
200 if (realDataPoints[number] <= meanAmplitude)
201 sumMean += realDataPoints[number];
206 float localNoiseFloorAmplitude = 0.0;
207 if (newNumDataPoints == 0)
208 localNoiseFloorAmplitude = meanAmplitude;
210 localNoiseFloorAmplitude = sumMean / ((float)newNumDataPoints);
212 *noiseFloorAmplitude = localNoiseFloorAmplitude;
#define __VOLK_ATTR_ALIGNED(x)
Definition: volk_common.h:27