207 unsigned int start_bin;
208 unsigned int stop_bin;
211 bin_size = bw/1024.0f;
212 start_bin = (
unsigned int)(freq_from / bin_size);
213 stop_bin = (
unsigned int)(freq_to / bin_size);
214 if (start_bin > 511 || stop_bin > 511){
229 fftRR->startBin = start_bin;
230 fftRR->stopBin = stop_bin;
231 fftRR->startFrequency = freq_from;
232 fftRR->stopFrequency = freq_to;
242 fftRR->estimatedFrequency=0;
243 fftRR->peakFrequency=0;
245 fftRR->avgValueFast=0;
246 fftRR->avgValueSlow=0;
247 fftRR->transientValue=0;
252 float rval =
read(start_bin,stop_bin,fftRR);
256 fftRR->peakFrequency = (fftRR->peakBin * bin_size) - (bin_size/2.0);
257 if (fftRR->peakFrequency < 0) fftRR->peakFrequency = 0.01;
259 if ((fftRR->peakBin > 1) && (fftRR->peakBin < 510)){
261 float lobeFrequency = 1;
262 if ((output[fftRR->peakBin+1]-output[fftRR->peakBin-1]) > 0.1 && (output[fftRR->peakBin] > 0)){
264 ratio = (output[fftRR->peakBin+1] - output[fftRR->peakBin-1] + output[fftRR->peakBin+1]) / (1.0 * output[fftRR->peakBin]);
265 lobeFrequency = ((fftRR->peakBin+1) * bin_size) - bin_size/2;
266 }
else if (output[fftRR->peakBin-1] > 0.1 && (output[fftRR->peakBin] > 0)){
268 ratio = (output[fftRR->peakBin-1]-output[fftRR->peakBin+1] + output[fftRR->peakBin-1]) / (1.0 * output[fftRR->peakBin]);
269 lobeFrequency = ((fftRR->peakBin-1) * bin_size) - bin_size/2;
271 fftRR->estimatedFrequency = (fftRR->peakFrequency * (1-ratio)) + (lobeFrequency * ratio);
273 if (fftRR->estimatedFrequency > fftRR->stopFrequency)fftRR->estimatedFrequency = fftRR->stopFrequency;
274 if (fftRR->estimatedFrequency < fftRR->startFrequency)fftRR->estimatedFrequency = fftRR->startFrequency;
278 fftRR->avgValueFast = (fftRR->avgValueFast * ratio) + (fftRR->peakValue * (1.0f -ratio));
281 fftRR->avgValueSlow = (fftRR->avgValueSlow * ratio) + (fftRR->avgValueFast * (1.0f -ratio));
282 if(fftRR->peakValue > fftRR->avgValueFast) fftRR->avgValueFast = (fftRR->avgValueFast/7.0 )+(fftRR->peakValue/3.0);
283 if (fftRR->avgValueFast > 0){
284 fftRR->transientValue = (fftRR->transientValue + (fftRR->avgValueFast - fftRR->avgValueSlow)/(0.00001 + fftRR->avgValueFast))* 0.5;
285 }
else fftRR->transientValue = 0;
286 fftRR->transientValue *= 0.95;
287 fftRR->avgValueFast *= 0.998;
288 fftRR->avgValueSlow *= 0.998;
float read(unsigned int binNumber)