| 285 | } |
| 286 | |
| 287 | float SpectrumAnalyst::GetProcessedValue(float freq0, float freq1) const |
| 288 | { |
| 289 | float bin0, bin1, binwidth; |
| 290 | |
| 291 | if (mAlg == Spectrum) { |
| 292 | bin0 = freq0 * mWindowSize / mRate; |
| 293 | bin1 = freq1 * mWindowSize / mRate; |
| 294 | } else { |
| 295 | bin0 = freq0 * mRate; |
| 296 | bin1 = freq1 * mRate; |
| 297 | } |
| 298 | binwidth = bin1 - bin0; |
| 299 | |
| 300 | float value = float(0.0); |
| 301 | |
| 302 | if (binwidth < 1.0) { |
| 303 | float binmid = (bin0 + bin1) / 2.0; |
| 304 | int ibin = (int)(binmid) - 1; |
| 305 | if (ibin < 1) |
| 306 | ibin = 1; |
| 307 | if (ibin >= GetProcessedSize() - 3) |
| 308 | ibin = std::max(0, GetProcessedSize() - 4); |
| 309 | |
| 310 | value = CubicInterpolate(mProcessed[ibin], |
| 311 | mProcessed[ibin + 1], |
| 312 | mProcessed[ibin + 2], |
| 313 | mProcessed[ibin + 3], binmid - ibin); |
| 314 | |
| 315 | } else { |
| 316 | if (bin0 < 0) |
| 317 | bin0 = 0; |
| 318 | if (bin1 >= GetProcessedSize()) |
| 319 | bin1 = GetProcessedSize() - 1; |
| 320 | |
| 321 | if ((int)(bin1) > (int)(bin0)) |
| 322 | value += mProcessed[(int)(bin0)] * ((int)(bin0) + 1 - bin0); |
| 323 | bin0 = 1 + (int)(bin0); |
| 324 | while (bin0 < (int)(bin1)) { |
| 325 | value += mProcessed[(int)(bin0)]; |
| 326 | bin0 += 1.0; |
| 327 | } |
| 328 | value += mProcessed[(int)(bin1)] * (bin1 - (int)(bin1)); |
| 329 | |
| 330 | value /= binwidth; |
| 331 | } |
| 332 | |
| 333 | return value; |
| 334 | } |
| 335 | |
| 336 | float SpectrumAnalyst::FindPeak(float xPos, float *pY) const |
| 337 | { |