//this method calculates the degree of membership for a particular value public override double CalculateDOM(double val) { //test for the case where the triangle's left or right offsets are zero //(to prevent divide by zero errors below) if (RightOffset.Equals(0.0) && PeakPoint.Equals(val) || LeftOffset.Equals(0.0) && PeakPoint.Equals(val)) { return(1.0); } //find DOM if left of center if ((val <= PeakPoint) && (val >= (PeakPoint - LeftOffset))) { double grad = 1.0 / LeftOffset; return(grad * (val - (PeakPoint - LeftOffset))); } //find DOM if right of center if (val > PeakPoint && (val < (PeakPoint + RightOffset))) { double grad = 1.0 / -RightOffset; return(grad * (val - PeakPoint) + 1.0); } //out of range of this FLV, return zero return(0.0); }
protected IDataPoints InitSpectrum(ISpectrum spectrum) { BucketSpectrumDataPoints data = new BucketSpectrumDataPoints( (parameter as DPSpectrumCIDParameter).GetBucketSize(), (parameter as DPSpectrumCIDParameter).GetMinRange()); int charge = (spectrum as ISpectrumMSn).GetParentCharge(); for (int i = 1; i <= charge; i++) { foreach (IPeak peak in spectrum.GetPeaks()) { PeakPoint pt = new PeakPoint(peak.GetIntensity(), peak.GetMZ(), i, peak.GetMZ().ToString()); data.Add(pt); } } return(data); }
public override double CalculateDOM(double val) { //check for case where the offset may be zero if (RightOffset == 0 && val.Equals(PeakPoint) || LeftOffset == 0.0 && (PeakPoint.Equals(val))) { return(1.0); } //find DOM if left of center if ((val <= PeakPoint) && (val > (PeakPoint - LeftOffset))) { double grad = 1.0 / LeftOffset; return(grad * (val - (PeakPoint - LeftOffset))); } //find DOM if right of center if (val > PeakPoint && (val <= PeakPoint + RightOffset)) { return(1.0); } //out of range of this FLV, return zero else { return(0.0); } }
public static double?EstimateBasicFrequency(int sampleRate, float[] samples, int PowerAverageValue) //ReadOnlySpan<float> { // SDF // 1. zero pad var sdf = new Complex[samples.Length * 2]; for (var i = 0; i < samples.Length; i++) { sdf[i] = samples[i]; } // 2. FFT FourierTransform2.FFT(sdf, FourierTransform.Direction.Forward); // 3. パワースペクトル bool isPower = false; double total = 0f; for (var i = 0; i < sdf.Length; i++) { var x = sdf[i]; sdf[i] = x.Real * x.Real + x.Imaginary * x.Imaginary; total += sdf[i].Magnitude; } //デシベル変換(パワー平均値を求める) dB = (int)(20 * Math.Log10(total / sampleRate)); //UnityEngine.Assertions.Assert.IsTrue(dB > 100, dB.ToString() + " dB"); if (dB > PowerAverageValue) { isPower = true; } //デシベルを下回ったら if (!isPower) { return(null); } // 4. inverse FFT FourierTransform2.FFT(sdf, FourierTransform.Direction.Backward); // NSDF var nsdf = new double[samples.Length]; var m = 0.0; for (var i = 0; i < samples.Length; i++) { var x = (double)samples[i]; m += x * x; var inv = samples.Length - i - 1; x = samples[inv]; m += x * x; nsdf[inv] = 2.0 * sdf[inv].Real / m; } // ピーク検出 var maxCorrelation = 0.0; var peaks = new List <PeakPoint>(); for (var i = 1; i < samples.Length; i++) { if (nsdf[i] > 0 && nsdf[i - 1] <= 0) { var currentMax = new PeakPoint(i, nsdf[i]); i++; for (; i < samples.Length; i++) { if (nsdf[i] > currentMax.Correlation) { currentMax.Delay = i; currentMax.Correlation = nsdf[i]; } else if (nsdf[i] < 0) { // 0 未満になったので一山終了 break; } } peaks.Add(currentMax); if (currentMax.Correlation > maxCorrelation) { maxCorrelation = currentMax.Correlation; } } } if (peaks.Count == 0) { return(null); // 推定失敗 } var threshold = maxCorrelation * 0.8; var mainPeak = peaks.Find(x => x.Correlation >= threshold); var delay = mainPeak.Delay == nsdf.Length - 1 ? mainPeak.Delay : GetTopX( mainPeak.Delay - 1, nsdf[mainPeak.Delay - 1], mainPeak.Delay, mainPeak.Correlation, mainPeak.Delay + 1, nsdf[mainPeak.Delay + 1] ); Accord.Diagnostics.Debug.Assert(delay >= mainPeak.Delay - 1 && delay <= mainPeak.Delay + 1); return(sampleRate / delay); }