示例#1
0
        //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);
        }
示例#2
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);
     }
 }
示例#4
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);
    }