protected virtual void UpdateFrequencyMapping(int bandIndex) { BandData _CurrentBand = _BandFrecuencies[bandIndex]; _CurrentBand._maximumFrequencyIndex = Math.Min(_spectrumProvider.GetFftBandIndex(_CurrentBand._maximumFrequency) + 1, _maxFftIndex); _CurrentBand._minimumFrequencyIndex = Math.Min(_spectrumProvider.GetFftBandIndex(_CurrentBand._minimumFrequency), _maxFftIndex); int actualResolution = SpectrumResolution; int indexCount = _CurrentBand._maximumFrequencyIndex - _CurrentBand._minimumFrequencyIndex; double linearIndexBucketSize = Math.Round(indexCount / (double)actualResolution, 3); _spectrumIndexMax = _spectrumIndexMax.CheckBuffer(actualResolution, true); _spectrumLogScaleIndexMax = _spectrumLogScaleIndexMax.CheckBuffer(actualResolution, true); //?????? Isnt this one? //double maxLog = Math.Log(actualResolution, actualResolution); double maxLog = 1.0; for (int i = 1; i < actualResolution; i++) { int logIndex = (int)((maxLog - Math.Log((actualResolution + 1) - i, (actualResolution + 1))) * indexCount) + _CurrentBand._minimumFrequencyIndex; _spectrumIndexMax[i - 1] = _CurrentBand._minimumFrequencyIndex + (int)(i * linearIndexBucketSize); _spectrumLogScaleIndexMax[i - 1] = logIndex; } if (actualResolution > 0) { _spectrumIndexMax[_spectrumIndexMax.Length - 1] = _spectrumLogScaleIndexMax[_spectrumLogScaleIndexMax.Length - 1] = _CurrentBand._maximumFrequencyIndex; } _BandFrecuencies[bandIndex] = _CurrentBand; }
protected virtual SpectrumPointData[] CalculateSpectrumPoints(double maxValue, float[] fftBuffer, int bandIndex) { BandData _CurrentBand = _BandFrecuencies[bandIndex]; var dataPoints = new List <SpectrumPointData>(); double value0 = 0, value = 0; double lastValue = 0; double actualMaxValue = maxValue; int spectrumPointIndex = 0; for (int i = _CurrentBand._minimumFrequencyIndex; i <= _CurrentBand._maximumFrequencyIndex; i++) { switch (ScalingStrategy) { case ScalingStrategy.Decibel: value0 = (((20 * Math.Log10(fftBuffer[i])) - MinDbValue) / DbScale) * actualMaxValue; break; case ScalingStrategy.Linear: value0 = (fftBuffer[i] * ScaleFactorLinear) * actualMaxValue; break; case ScalingStrategy.Sqrt: value0 = ((Math.Sqrt(fftBuffer[i])) * ScaleFactorSqr) * actualMaxValue; break; } bool recalc = true; value = Math.Max(0, Math.Max(value0, value)); while (spectrumPointIndex <= _spectrumIndexMax.Length - 1 && i == (IsXLogScale ? _spectrumLogScaleIndexMax[spectrumPointIndex] : _spectrumIndexMax[spectrumPointIndex])) { if (!recalc) { value = lastValue; } if (value > maxValue) { value = maxValue; } if (_useAverage && spectrumPointIndex > 0) { value = (lastValue + value) / 2.0; } dataPoints.Add(new SpectrumPointData { SpectrumPointIndex = spectrumPointIndex, Value = value }); lastValue = value; value = 0.0; spectrumPointIndex++; recalc = false; } //value = 0; } return(dataPoints.ToArray()); }