Example #1
0
        public AccumulatedSpectrum Mul(ref RgbSpectrum rgb, SpectrumType t)
        {
            if (storeInRgb)
            {
                this.rgbAcc *= rgb;
            }
            else
            {
                this.spAcc *= new SampledSpectrum(ref rgb, t);
            }
            return this;

        }
Example #2
0
        public SampledSpectrum Open(string fileName, SpectrumType st)
        {
            using (TextReader tr = new StringReader(fileName))
            {

                List<float> lambda = new List<float>(), sample = new List<float>();
                while (true)
                {
                    var line = tr.ReadLine();
                    if (line == null)
                        break;
                    if (line.Contains("#"))
                        continue;
                    var data = line.Split(' ');
                    lambda.Add(float.Parse(data[0], NumberStyles.Any, CultureInfo.InvariantCulture));
                    sample.Add(float.Parse(data[1], NumberStyles.Any, CultureInfo.InvariantCulture));
                }
                return SampledSpectrum.FromSampled(lambda.ToArray(), sample.ToArray(), st);
            }
        }
Example #3
0
 public EventVisual(int spectrumPoint, SpectrumType type)
 {
     point = spectrumPoint;
     switch (type)
     {
         case SpectrumType.DECIBAL:
             color = Color.White;
             baseOffset = 0;
             break;
         case SpectrumType.LINEAR:
             color = Color.Blue;
             baseOffset = 280;
             break;
         case SpectrumType.SQUARE:
             color = Color.Pink;
             baseOffset = 560;
             break;
     }
     color.A = 155;
 }
Example #4
0
        /// <summary>
        /// TranslateExtension turns a file extension into a SpectrumType
        /// </summary>
        /// <param name="fileExt">The Extension or Filter to translate</param>
        /// <returns>The SpectrumType of the file</returns>
        private static SpectrumType TranslateExtFilter(String fileExt, String fileFilter)
        {
            //Declare a variable to return
            SpectrumType rtn = SpectrumType.Invalid;

            //Make the Strings uppercase
            String ucExt    = fileExt.ToUpper();
            String ucFilter = fileFilter.ToUpper();

            //Choose the SpectrumType based on the Strings
            if (ucExt == SpectrumExtension.Raw3DExt.ToUpper() || ucFilter == SpectrumExtension.Raw3DFilter.ToUpper())
            {
                rtn = SpectrumType.R3D;
            }
            else if (ucExt == SpectrumExtension.TxtExt.ToUpper() || ucFilter == SpectrumExtension.TxtFilter.ToUpper())
            {
                rtn = SpectrumType.TXT;
            }

            //Return the result
            return(rtn);
        }
Example #5
0
 public MfccExtractorHtk(int samplingRate,
                         int featureCount,
                         double frameDuration      = 0.0256 /*sec*/,
                         double hopDuration        = 0.010 /*sec*/,
                         int filterbankSize        = 24,
                         double lowFreq            = 0,
                         double highFreq           = 0,
                         int fftSize               = 0,
                         int lifterSize            = 0,
                         double preEmphasis        = 0,
                         bool includeEnergy        = false,
                         SpectrumType spectrumType = SpectrumType.Power,
                         WindowTypes window        = WindowTypes.Hamming)
     : base(samplingRate,
            featureCount,
            frameDuration,
            hopDuration,
            filterbankSize,
            lowFreq,
            highFreq,
            fftSize,
            MakeFilterbank(filterbankSize,
                           samplingRate,
                           fftSize,
                           frameDuration,
                           lowFreq,
                           highFreq),
            lifterSize,
            preEmphasis,
            includeEnergy,
            "2N",
            NonLinearityType.LogE,
            spectrumType,
            window,
            1.0f)
 {
 }
Example #6
0
 public static RegularSPD RegularSpdFromSampled(double[] data, SpectrumType t)
 {
     var vals = data.ToList().Where((c, i) => i % 2 != 0).Select(l => (float)l).ToArray();
     var lambdas = data.ToList().Where((c, i) => i % 2 == 0).Select(l => (float)l).ToArray();
     return new RegularSPD(vals, lambdas.Min(), lambdas.Max(), lambdas.Length);
 }
Example #7
0
 public static SampledSpectrum Convert(ref RgbSpectrum s, SpectrumType t)
 {
     return new SampledSpectrum(ref s, t);
 }
        //private MemoryMappedFile mmf;
        //private MemoryMappedViewAccessor mmv;

        public SpectrumWrapper(SpectrumType spectrum, double[] masses, double[] intensities)
        {
            Spectrum    = spectrum;
            Masses      = masses;
            Intensities = intensities;
        }
        /// <summary>
        /// 频谱单位转换函数
        /// </summary>
        /// <param name="spectrum">输入频谱,单位转换后返回的序列也保存在里面</param>
        /// <param name="spectrumType">输入频谱类型,功率谱或者幅度谱</param>
        /// <param name="df">频谱间隔</param>
        /// <param name="unitSetting">单位转换设置</param>
        /// <param name="equivalentNoiseBw">计算频谱时,加窗所用窗函数的等效噪声带宽</param>
        /// <returns></returns>
        private static void UnitConversion(double[] spectrum, double df, SpectrumType spectrumType,
                                           UnitConvSetting unitSetting, double equivalentNoiseBw)
        {
            double scale = 1.0;
            int    freq0Idx = 0, N = spectrum.Length;

            //VMLNative.vdSqr(N, spectrum, spectrum);

            if (unitSetting.PeakScaling == PeakScaling.Peak) //峰峰值要乘以2
            {
                switch (spectrumType)
                {
                case SpectrumType.Amplitude:     // Sqrt2
                    scale *= Sqrt2;
                    break;

                case SpectrumType.Power:     // 2
                    scale *= 2;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(spectrumType), spectrumType, null);
                }
                CBLASNative.cblas_dscal(N, scale, spectrum, 1);
                spectrum[0] /= scale; //零频不用
            }

            //根据设置的转换单位进行转换
            switch (unitSetting.Unit)
            {
            case SpectrumUnits.V:
            {
                if (SpectrumType.Power == spectrumType)
                {
                    VMLNative.vdSqrt(N, spectrum, spectrum);
                }
                break;
            }

            case SpectrumUnits.dBV:
            {
                if (SpectrumType.Power == spectrumType)
                {
                    VMLNative.vdSqrt(N, spectrum, spectrum);
                }
                //lg
                VMLNative.vdLog10(N, spectrum, spectrum);
                scale = 20;
                //20*lg
                CBLASNative.cblas_dscal(N, scale, spectrum, 1);
                break;
            }

            case SpectrumUnits.dBmV:
            {
                if (SpectrumType.Power == spectrumType)
                {
                    VMLNative.vdSqrt(N, spectrum, spectrum);
                }
                CBLASNative.cblas_dscal(N, 1e3, spectrum, 1);        //V To mV
                VMLNative.vdLog10(N, spectrum, spectrum);            //To Lg
                scale = 20;

                CBLASNative.cblas_dscal(N, scale, spectrum, 1);         //To 20*Lg
                break;
            }

            case SpectrumUnits.dBuV:
            {
                if (SpectrumType.Power == spectrumType)
                {
                    VMLNative.vdSqrt(N, spectrum, spectrum);
                }
                CBLASNative.cblas_dscal(N, 1e6, spectrum, 1);    //V To uV
                VMLNative.vdLog10(N, spectrum, spectrum);        //To Lg
                scale = 20;
                CBLASNative.cblas_dscal(N, scale, spectrum, 1);  //To 20*Lg
                break;
            }

            case SpectrumUnits.V2:
            {
                if (SpectrumType.Amplitude == spectrumType)
                {
                    VMLNative.vdSqr(N, spectrum, spectrum);
                }
                break;
            }

            case SpectrumUnits.W:
            case SpectrumUnits.dBW:
            case SpectrumUnits.dBm:
            {
                if (SpectrumType.Amplitude == spectrumType)
                {
                    VMLNative.vdSqr(N, spectrum, spectrum);
                }
                scale = 1.0 / unitSetting.Impedance;                 //1/R
                CBLASNative.cblas_dscal(N, scale, spectrum, 1);      //W = V^2/R

                if (unitSetting.Unit == SpectrumUnits.dBW)           //dBW = 20lgW
                {
                    //lg
                    VMLNative.vdLog10(N, spectrum, spectrum);
                    scale = 20;
                    //20*lg
                    CBLASNative.cblas_dscal(N, scale, spectrum, 1);
                }
                else if (unitSetting.Unit == SpectrumUnits.dBm)         // dBm = 10lg(W/1mW)
                {
                    CBLASNative.cblas_dscal(N, 1e3, spectrum, 1);       // W/1mW
                                                                        //lg
                    VMLNative.vdLog10(N, spectrum, spectrum);
                    scale = 10;
                    //10*lg
                    CBLASNative.cblas_dscal(N, scale, spectrum, 1);
                }
                break;
            }

            default:
            {
                break;
            }
            }
            if (!unitSetting.PSD)
            {
                return;
            }
            //谱密度计算
            scale = 1.0 / (equivalentNoiseBw * df);
            CBLASNative.cblas_dscal(N, scale, spectrum, 1);
        }
Example #10
0
 public Radiance Mul(RgbSpectrum f, SpectrumType type)
 {
     spectra = spectra * new SampledSpectrum(ref f, type);
     return this;
 }
Example #11
0
 public PSSpectrum(ref RgbSpectrum c, SpectrumType type)
 {
     //fixed spectra = new float*[nSamples];
     FromRgb(ref c, type);
 }
Example #12
0
 /// <summary>
 /// Generates the version block
 /// </summary>
 /// <param name="specType">type of spectrum beign splashed</param>
 /// <returns>the version block as a string</returns>
 private string getFirstBlock(SpectrumType specType)
 {
     Debug.WriteLine(string.Format("version block: {0}", PREFIX + (int)specType + VERSION));
     return (PREFIX + (int)specType + VERSION);
 }
Example #13
0
 /// <summary>
 /// Generates the version block
 /// </summary>
 /// <param name="specType">type of spectrum beign splashed</param>
 /// <returns>the version block as a string</returns>
 private string getFirstBlock(SpectrumType specType)
 {
     Debug.WriteLine(string.Format("version block: {0}", PREFIX + (int)specType + VERSION));
     return(PREFIX + (int)specType + VERSION);
 }
Example #14
0
        public void Plot(Spectrum spectrum, Action <object, OxyMouseDownEventArgs> onSeriesClicked, SpectrumType spectrumType)
        {
            LineSeries sourceSeries;
            LineSeries optimizedSeries = BuildLineSeries(spectrum.Optimized, onSeriesClicked);
            var        peakSeriesName  = string.Empty;

            if (spectrumType == SpectrumType.Analyzed)
            {
                PlotFrame.Title = spectrum.Name;
                sourceSeries    = BuildLineSeries(spectrum.Source, null);
                PlotFrame.Series.Add(sourceSeries);
                peakSeriesName = "Peaks";
            }
            else if (spectrumType == SpectrumType.Imported)
            {
                peakSeriesName = "Imported Peaks";
            }

            ScatterSeries peaksSeries = BuildScatterSeries(spectrum.Peaks, peakSeriesName);

            PlotFrame.Series.Add(optimizedSeries);
            PlotFrame.Series.Add(peaksSeries);

            RecountPlotAxes(spectrum.Optimized.Data); // TODO: REcount by all transition types, not only source.

            foreach (var item in spectrum.Peaks.Data)
            {
                this.Selection = Plotter.StageType.Automatic;
                this.MarkPeak(item.X, item.Y, peakSeriesName);
                this.Selection = Plotter.StageType.CanBeManual;
            }

            PlotFrame.InvalidatePlot(true);
        }
Example #15
0
        //public static PSSpectrum FromRgb(ref RgbSpectrum rgbSp, SpectrumType type = SpectrumType.Reflectance)
        //{
        //    var rgb = rgbSp.ToArray();

        //    return FromRGB(rgb, type);
        //}

        public static PSSpectrum FromRGB_old(float[] rgb, SpectrumType type = SpectrumType.Reflectance)
        {
            var r = new PSSpectrum(0f);
            if (type == SpectrumType.Reflectance)
            {
                // Convert reflectance spectrum to RGB
                if ((rgb[0] <= rgb[1]) && (rgb[0] <= rgb[2]))
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[0]_ as minimum
                    r += rgb[0] * rgbRefl2SpectWhite;
                    if (rgb[1] <= rgb[2])
                    {
                        r += (rgb[1] - rgb[0]) * rgbRefl2SpectCyan;
                        r += (rgb[2] - rgb[1]) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        r += (rgb[2] - rgb[0]) * rgbRefl2SpectCyan;
                        r += (rgb[1] - rgb[2]) * rgbRefl2SpectGreen;
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[1]_ as minimum
                    r += rgb[1] * rgbRefl2SpectWhite;
                    if (rgb[0] <= rgb[2])
                    {
                        r += (rgb[0] - rgb[1]) * rgbRefl2SpectMagenta;
                        r += (rgb[2] - rgb[0]) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        r += (rgb[2] - rgb[1]) * rgbRefl2SpectMagenta;
                        r += (rgb[0] - rgb[2]) * rgbRefl2SpectRed;
                    }
                }
                else
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[2]_ as minimum
                    r += rgb[2] * rgbRefl2SpectWhite;
                    if (rgb[0] <= rgb[1])
                    {
                        r += (rgb[0] - rgb[2]) * rgbRefl2SpectYellow;
                        r += (rgb[1] - rgb[0]) * rgbRefl2SpectGreen;
                    }
                    else
                    {
                        r += (rgb[1] - rgb[2]) * rgbRefl2SpectYellow;
                        r += (rgb[0] - rgb[1]) * rgbRefl2SpectRed;
                    }
                }
                r *= .94f;
            }
            else
            {
                // Convert illuminant spectrum to RGB
                if (rgb[0] <= rgb[1] && rgb[0] <= rgb[2])
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[0]_ as minimum
                    r += rgb[0] * rgbIllum2SpectWhite;
                    if (rgb[1] <= rgb[2])
                    {
                        r += (rgb[1] - rgb[0]) * rgbIllum2SpectCyan;
                        r += (rgb[2] - rgb[1]) * rgbIllum2SpectBlue;
                    }
                    else
                    {
                        r += (rgb[2] - rgb[0]) * rgbIllum2SpectCyan;
                        r += (rgb[1] - rgb[2]) * rgbIllum2SpectGreen;
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[1]_ as minimum
                    r += rgb[1] * rgbIllum2SpectWhite;
                    if (rgb[0] <= rgb[2])
                    {
                        r += (rgb[0] - rgb[1]) * rgbIllum2SpectMagenta;
                        r += (rgb[2] - rgb[0]) * rgbIllum2SpectBlue;
                    }
                    else
                    {
                        r += (rgb[2] - rgb[1]) * rgbIllum2SpectMagenta;
                        r += (rgb[0] - rgb[2]) * rgbIllum2SpectRed;
                    }
                }
                else
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[2]_ as minimum
                    r += rgb[2] * rgbIllum2SpectWhite;
                    if (rgb[0] <= rgb[1])
                    {
                        r += (rgb[0] - rgb[2]) * rgbIllum2SpectYellow;
                        r += (rgb[1] - rgb[0]) * rgbIllum2SpectGreen;
                    }
                    else
                    {
                        r += (rgb[1] - rgb[2]) * rgbIllum2SpectYellow;
                        r += (rgb[0] - rgb[1]) * rgbIllum2SpectRed;
                    }
                }
                r *= .86445f;
            }
            return r.Clamp();
        }
Example #16
0
 public static PSSpectrum FromSampled(float[] lambda, float[] values, SpectrumType type = SpectrumType.Reflectance)
 {
     var n = lambda.Length;
     if (!SpectrumSamplesSorted(lambda, values, lambda.Length))
     {
         SortSpectrumSamples(ref lambda, ref values);
         return FromSampled(lambda, values, type);
     }
     var r = new PSSpectrum(0f);
     for (int i = 0; i < nSpectralSamples; ++i)
     {
         // Compute average value of given SPD over $i$th sample's range
         float lambda0 = MathLab.Lerp((float)(i) / (float)(nSpectralSamples), sampledLambdaStart, sampledLambdaEnd);
         float lambda1 = MathLab.Lerp((float)(i + 1f) / (float)(nSpectralSamples), sampledLambdaStart, sampledLambdaEnd);
         r.spectra[i] = AverageSpectrumSamples(lambda, values, n, lambda0, lambda1);
     }
     return r;
 }
Example #17
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="samplingRate"></param>
        /// <param name="featureCount"></param>
        /// <param name="frameDuration"></param>
        /// <param name="hopDuration"></param>
        /// <param name="filterbankSize"></param>
        /// <param name="lowFreq"></param>
        /// <param name="highFreq"></param>
        /// <param name="fftSize"></param>
        /// <param name="filterbank"></param>
        /// <param name="lifterSize"></param>
        /// <param name="preEmphasis"></param>
        /// <param name="includeEnergy"></param>
        /// <param name="dctType">"1", "1N", "2", "2N", "3", "3N", "4", "4N"</param>
        /// <param name="nonLinearity"></param>
        /// <param name="spectrumType"></param>
        /// <param name="window"></param>
        /// <param name="logFloor"></param>
        public MfccExtractor(int samplingRate,
                             int featureCount,
                             double frameDuration          = 0.0256 /*sec*/,
                             double hopDuration            = 0.010 /*sec*/,
                             int filterbankSize            = 24,
                             double lowFreq                = 0,
                             double highFreq               = 0,
                             int fftSize                   = 0,
                             float[][] filterbank          = null,
                             int lifterSize                = 0,
                             double preEmphasis            = 0,
                             bool includeEnergy            = false,
                             string dctType                = "2N",
                             NonLinearityType nonLinearity = NonLinearityType.Log10,
                             SpectrumType spectrumType     = SpectrumType.Power,
                             WindowTypes window            = WindowTypes.Hamming,
                             float logFloor                = float.Epsilon)

            : base(samplingRate, frameDuration, hopDuration, preEmphasis)
        {
            FeatureCount = featureCount;

            _lowFreq  = lowFreq;
            _highFreq = highFreq;

            if (filterbank == null)
            {
                _blockSize = fftSize > FrameSize ? fftSize : MathUtils.NextPowerOfTwo(FrameSize);

                var melBands = FilterBanks.MelBands(filterbankSize, _blockSize, SamplingRate, _lowFreq, _highFreq);
                FilterBank = FilterBanks.Triangular(_blockSize, SamplingRate, melBands, mapper: Scale.HerzToMel);   // HTK/Kaldi-style
            }
            else
            {
                FilterBank     = filterbank;
                filterbankSize = filterbank.Length;
                _blockSize     = 2 * (filterbank[0].Length - 1);

                Guard.AgainstExceedance(FrameSize, _blockSize, "frame size", "FFT size");
            }

            _fft = new RealFft(_blockSize);

            _window        = window;
            _windowSamples = Window.OfType(_window, FrameSize);

            _lifterSize   = lifterSize;
            _lifterCoeffs = _lifterSize > 0 ? Window.Liftering(FeatureCount, _lifterSize) : null;

            _includeEnergy = includeEnergy;

            // setup DCT: ============================================================================

            _dctType = dctType;
            switch (dctType[0])
            {
            case '1':
                _dct = new Dct1(filterbankSize);
                break;

            case '2':
                _dct = new Dct2(filterbankSize);
                break;

            case '3':
                _dct = new Dct3(filterbankSize);
                break;

            case '4':
                _dct = new Dct4(filterbankSize);
                break;

            default:
                throw new ArgumentException("Only DCT-1, 2, 3 and 4 are supported!");
            }

            if (dctType.Length > 1 && char.ToUpper(dctType[1]) == 'N')
            {
                _applyDct = mfccs => _dct.DirectNorm(_melSpectrum, mfccs);
            }
            else
            {
                _applyDct = mfccs => _dct.Direct(_melSpectrum, mfccs);
            }

            // setup spectrum post-processing: =======================================================

            _logFloor         = logFloor;
            _nonLinearityType = nonLinearity;
            switch (nonLinearity)
            {
            case NonLinearityType.Log10:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog10(FilterBank, _spectrum, _melSpectrum, _logFloor);
                break;

            case NonLinearityType.LogE:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog(FilterBank, _spectrum, _melSpectrum, _logFloor);
                break;

            case NonLinearityType.ToDecibel:
                _postProcessSpectrum = () => FilterBanks.ApplyAndToDecibel(FilterBank, _spectrum, _melSpectrum, _logFloor);
                break;

            case NonLinearityType.CubicRoot:
                _postProcessSpectrum = () => FilterBanks.ApplyAndPow(FilterBank, _spectrum, _melSpectrum, 0.33);
                break;

            default:
                _postProcessSpectrum = () => FilterBanks.Apply(FilterBank, _spectrum, _melSpectrum);
                break;
            }

            _spectrumType = spectrumType;
            switch (_spectrumType)
            {
            case SpectrumType.Magnitude:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, false);
                break;

            case SpectrumType.Power:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, false);
                break;

            case SpectrumType.MagnitudeNormalized:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, true);
                break;

            case SpectrumType.PowerNormalized:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, true);
                break;
            }

            // reserve memory for reusable blocks

            _spectrum    = new float[_blockSize / 2 + 1];
            _melSpectrum = new float[filterbankSize];
        }
Example #18
0
 public AudioEventArgs(int spectrumPoint, SpectrumType spectrumType, double actualValue)
 {
     this.SpectrumPoint = spectrumPoint;
     this.DataType = spectrumType;
     this.ActualValue = actualValue;
 }
Example #19
0
 public static RegularSPD CreateRegularSpd(float r, float g, float b, SpectrumType t)
 {
     float[] l, v;
     FromRgb(new RgbSpectrum(r,g,b), t).ToSpectra(out l, out v);
     return new RegularSPD(v, SampledSpectrum.sampledLambdaStart, SampledSpectrum.sampledLambdaEnd, SampledSpectrum.nSpectralSamples);
 }
Example #20
0
        /// <summary>
        /// Constructs extractor from configuration <paramref name="options"/>.
        /// </summary>
        public MfccExtractor(MfccOptions options) : base(options)
        {
            FeatureCount = options.FeatureCount;

            var filterbankSize = options.FilterBankSize;

            if (options.FilterBank is null)
            {
                _blockSize = options.FftSize > FrameSize ? options.FftSize : MathUtils.NextPowerOfTwo(FrameSize);

                var melBands = FilterBanks.MelBands(filterbankSize, SamplingRate, options.LowFrequency, options.HighFrequency);
                FilterBank = FilterBanks.Triangular(_blockSize, SamplingRate, melBands, mapper: Scale.HerzToMel);   // HTK/Kaldi-style
            }
            else
            {
                FilterBank     = options.FilterBank;
                filterbankSize = FilterBank.Length;
                _blockSize     = 2 * (FilterBank[0].Length - 1);

                Guard.AgainstExceedance(FrameSize, _blockSize, "frame size", "FFT size");
            }

            _fft = new RealFft(_blockSize);

            _lifterSize   = options.LifterSize;
            _lifterCoeffs = _lifterSize > 0 ? Window.Liftering(FeatureCount, _lifterSize) : null;

            _includeEnergy  = options.IncludeEnergy;
            _logEnergyFloor = options.LogEnergyFloor;

            // setup DCT: ============================================================================

            _dctType = options.DctType;
            switch (_dctType[0])
            {
            case '1': _dct = new Dct1(filterbankSize); break;

            case '3': _dct = new Dct3(filterbankSize); break;

            case '4': _dct = new Dct4(filterbankSize); break;

            default:  _dct = new Dct2(filterbankSize); break;
            }

            if (_dctType.EndsWith("N", StringComparison.OrdinalIgnoreCase))
            {
                _applyDct = mfccs => _dct.DirectNorm(_melSpectrum, mfccs);
            }
            else
            {
                _applyDct = mfccs => _dct.Direct(_melSpectrum, mfccs);
            }

            // setup spectrum post-processing: =======================================================

            _logFloor         = options.LogFloor;
            _nonLinearityType = options.NonLinearity;
            switch (_nonLinearityType)
            {
            case NonLinearityType.Log10:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog10(FilterBank, _spectrum, _melSpectrum, _logFloor); break;

            case NonLinearityType.LogE:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog(FilterBank, _spectrum, _melSpectrum, _logFloor); break;

            case NonLinearityType.ToDecibel:
                _postProcessSpectrum = () => FilterBanks.ApplyAndToDecibel(FilterBank, _spectrum, _melSpectrum, _logFloor); break;

            case NonLinearityType.CubicRoot:
                _postProcessSpectrum = () => FilterBanks.ApplyAndPow(FilterBank, _spectrum, _melSpectrum, 0.33); break;

            default:
                _postProcessSpectrum = () => FilterBanks.Apply(FilterBank, _spectrum, _melSpectrum); break;
            }

            _spectrumType = options.SpectrumType;
            switch (_spectrumType)
            {
            case SpectrumType.Magnitude:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, false); break;

            case SpectrumType.MagnitudeNormalized:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, true); break;

            case SpectrumType.PowerNormalized:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, true); break;

            default:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, false); break;
            }

            // reserve memory for reusable blocks

            _spectrum    = new float[_blockSize / 2 + 1];
            _melSpectrum = new float[filterbankSize];
        }
Example #21
0
 public static RegularSPD CreateRegularSpd(ref RgbSpectrumInfo col, SpectrumType t)
 {
     float[] l, v;
     FromRgb(ref col, t).ToSpectra(out l, out v);
     return new RegularSPD(v, SampledSpectrum.sampledLambdaStart, SampledSpectrum.sampledLambdaEnd, SampledSpectrum.nSpectralSamples);
 }
Example #22
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="samplingRate"></param>
        /// <param name="featureCount"></param>
        /// <param name="filterbank"></param>
        /// <param name="frameDuration"></param>
        /// <param name="hopDuration"></param>
        /// <param name="preEmphasis"></param>
        /// <param name="nonLinearity"></param>
        /// <param name="spectrumType"></param>
        /// <param name="window"></param>
        /// <param name="logFloor"></param>
        public FilterbankExtractor(int samplingRate,
                                   float[][] filterbank,
                                   double frameDuration          = 0.0256 /*sec*/,
                                   double hopDuration            = 0.010 /*sec*/,
                                   double preEmphasis            = 0,
                                   NonLinearityType nonLinearity = NonLinearityType.None,
                                   SpectrumType spectrumType     = SpectrumType.Power,
                                   WindowTypes window            = WindowTypes.Hamming,
                                   float logFloor = float.Epsilon)

            : base(samplingRate, frameDuration, hopDuration, preEmphasis)
        {
            FilterBank   = filterbank;
            FeatureCount = filterbank.Length;

            _blockSize = 2 * (filterbank[0].Length - 1);

            Guard.AgainstExceedance(FrameSize, _blockSize, "frame size", "FFT size");

            _fft = new RealFft(_blockSize);

            _window        = window;
            _windowSamples = Window.OfType(_window, FrameSize);

            // setup spectrum post-processing: =======================================================

            _logFloor         = logFloor;
            _nonLinearityType = nonLinearity;
            switch (nonLinearity)
            {
            case NonLinearityType.Log10:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog10(FilterBank, _spectrum, _bandSpectrum, _logFloor);
                break;

            case NonLinearityType.LogE:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog(FilterBank, _spectrum, _bandSpectrum, _logFloor);
                break;

            case NonLinearityType.ToDecibel:
                _postProcessSpectrum = () => FilterBanks.ApplyAndToDecibel(FilterBank, _spectrum, _bandSpectrum, _logFloor);
                break;

            case NonLinearityType.CubicRoot:
                _postProcessSpectrum = () => FilterBanks.ApplyAndPow(FilterBank, _spectrum, _bandSpectrum, 0.33);
                break;

            default:
                _postProcessSpectrum = () => FilterBanks.Apply(FilterBank, _spectrum, _bandSpectrum);
                break;
            }

            _spectrumType = spectrumType;
            switch (_spectrumType)
            {
            case SpectrumType.Magnitude:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, false);
                break;

            case SpectrumType.Power:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, false);
                break;

            case SpectrumType.MagnitudeNormalized:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, true);
                break;

            case SpectrumType.PowerNormalized:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, true);
                break;
            }

            // reserve memory for reusable blocks

            _spectrum     = new float[_blockSize / 2 + 1];
            _bandSpectrum = new float[filterbank.Length];
        }
Example #23
0
        public static SampledSpectrum AVXFromRgb(float[] rgb, SpectrumType type = SpectrumType.Reflectance)
        {
            var r = new SampledSpectrum(0f);
            if (type == SpectrumType.Reflectance)
            {
                // Convert reflectance spectrum to RGB
                if (rgb[0] <= rgb[1] && rgb[0] <= rgb[2])
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb[0]_ as minimum
                    //r += rgb[0] * rgbRefl2SpectWhite;
                    AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectWhite, rgb[0], ref r);

                    //SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb[0]);
                    if (rgb[1] <= rgb[2])
                    {
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb[1] - rgb[0]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectBlue, (rgb[2] - rgb[1]), ref r);
                        //r += (rgb[1] - rgb[0]) * rgbRefl2SpectCyan;
                        //r += (rgb[2] - rgb[1]) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[0]) * rgbRefl2SpectCyan;
                        //r += (rgb[1] - rgb[2]) * rgbRefl2SpectGreen;

                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb[2] - rgb[0]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectGreen, (rgb[1] - rgb[2]), ref r);
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb[1]_ as minimum
                    //r += rgb[1] * rgbRefl2SpectWhite;
                    AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectWhite, rgb[1], ref r);

                    if (rgb[0] <= rgb[2])
                    {
                        //r += (rgb[0] - rgb[1]) * rgbRefl2SpectMagenta;
                        //r += (rgb[2] - rgb[0]) * rgbRefl2SpectBlue;

                        AVX.MAdd(ref  SampledSpectrum.rgbRefl2SpectMagenta, (rgb[0] - rgb[1]), ref r);
                        AVX.MAdd(ref  SampledSpectrum.rgbRefl2SpectBlue, (rgb[2] - rgb[0]), ref r);
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[1]) * rgbRefl2SpectMagenta;
                        //r += (rgb[0] - rgb[2]) * rgbRefl2SpectRed;
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectMagenta, (rgb[2] - rgb[1]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectRed, (rgb[0] - rgb[2]), ref r);
                    }
                }
                else
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb[2]_ as minimum
                    //r += rgb[2] * rgbRefl2SpectWhite;
                    AVX.MAdd(ref  SampledSpectrum.rgbRefl2SpectWhite, rgb[2], ref r);

                    if (rgb[0] <= rgb[1])
                    {
                        //r += (rgb[0] - rgb[2]) * rgbRefl2SpectYellow;
                        //r += (rgb[1] - rgb[0]) * rgbRefl2SpectGreen;
                        AVX.MAdd(ref  SampledSpectrum.rgbRefl2SpectYellow, (rgb[0] - rgb[2]), ref r);
                        AVX.MAdd(ref  SampledSpectrum.rgbRefl2SpectGreen, (rgb[1] - rgb[0]), ref r);
                    }
                    else
                    {
                        //r += (rgb[1] - rgb[2]) * rgbRefl2SpectYellow;
                        //r += (rgb[0] - rgb[1]) * rgbRefl2SpectRed;

                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectYellow, (rgb[1] - rgb[2]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbRefl2SpectRed, (rgb[0] - rgb[1]), ref r);
                    }
                }
                AVX.Mul(ref r, .94f, ref r);

                //r *= .94f;
            }
            else
            {
                // Convert illuminant spectrum to RGB
                if (rgb[0] <= rgb[1] && rgb[0] <= rgb[2])
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb[0]_ as minimum
                    //r += rgb[0] * rgbIllum2SpectWhite;
                    AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectWhite, rgb[0], ref r);
                    if (rgb[1] <= rgb[2])
                    {
                        //r += (rgb[1] - rgb[0]) * rgbIllum2SpectCyan;
                        //r += (rgb[2] - rgb[1]) * rgbIllum2SpectBlue;
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb[1] - rgb[0]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb[2] - rgb[1]), ref r);

                    }
                    else
                    {
                        // r += (rgb[2] - rgb[0]) * rgbIllum2SpectCyan;
                        //r += (rgb[1] - rgb[2]) * rgbIllum2SpectGreen;

                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb[2] - rgb[0]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb[1] - rgb[2]), ref r);
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb[1]_ as minimum
                    //r += rgb[1] * rgbIllum2SpectWhite;
                    AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectWhite, rgb[1], ref r);

                    if (rgb[0] <= rgb[2])
                    {
                        //r += (rgb[0] - rgb[1]) * rgbIllum2SpectMagenta;
                        //r += (rgb[2] - rgb[0]) * rgbIllum2SpectBlue;

                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb[0] - rgb[1]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb[2] - rgb[0]), ref r);
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[1]) * rgbIllum2SpectMagenta;
                        //r += (rgb[0] - rgb[2]) * rgbIllum2SpectRed;

                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb[2] - rgb[1]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectRed, (rgb[0] - rgb[2]), ref r);
                    }
                }
                else
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb[2]_ as minimum
                    //r += rgb[2] * rgbIllum2SpectWhite;
                    AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectWhite, rgb[2], ref r);

                    if (rgb[0] <= rgb[1])
                    {
                        //r += (rgb[0] - rgb[2]) * rgbIllum2SpectYellow;
                        //r += (rgb[1] - rgb[0]) * rgbIllum2SpectGreen;

                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb[0] - rgb[2]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb[1] - rgb[0]), ref r);
                    }
                    else
                    {
                        //r += (rgb[1] - rgb[2]) * rgbIllum2SpectYellow;
                        //r += (rgb[0] - rgb[1]) * rgbIllum2SpectRed;

                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb[1] - rgb[2]), ref r);
                        AVX.MAdd(ref SampledSpectrum.rgbIllum2SpectRed, (rgb[0] - rgb[1]), ref r);
                    }
                }
                AVX.Mul(ref r, .86445f, ref r);
                //r *= .86445f;
            }
            //AVX.Clamp(ref r, ref r);
            //r.ClampSelf();
            return r;
        }
Example #24
0
        /// <summary>
        /// Construct a spectrum element for the given scan
        /// </summary>
        /// <param name="scanNumber">the scan number</param>
        /// <returns>The SpectrumType object</returns>
        private SpectrumType ConstructSpectrum(int scanNumber)
        {
            // Get each scan from the RAW file
            var scan = Scan.FromFile(_rawFile, scanNumber);

            // Get the scan filter for this scan number
            var scanFilter = _rawFile.GetFilterForScanNumber(scanNumber);

            // Get the scan event for this scan number
            var scanEvent = _rawFile.GetScanEventForScanNumber(scanNumber);
            var spectrum  = new SpectrumType
            {
                id = ConstructSpectrumTitle(scanNumber),
                defaultArrayLength = 0
            };

            // Add the ionization type if necessary
            if (!_ionizationTypes.ContainsKey(scanFilter.IonizationMode))
            {
                _ionizationTypes.Add(scanFilter.IonizationMode,
                                     OntologyMapping.IonizationTypes[scanFilter.IonizationMode]);
            }

            // Add the mass analyzer if necessary
            if (!_massAnalyzers.ContainsKey(scanFilter.MassAnalyzer) &&
                OntologyMapping.MassAnalyzerTypes.ContainsKey(scanFilter.MassAnalyzer))
            {
                _massAnalyzers.Add(scanFilter.MassAnalyzer, "IC" + (_massAnalyzers.Count + 1));
            }

            // Keep the CV params in a list and convert to array afterwards
            var spectrumCvParams = new List <CVParamType>
            {
                new CVParamType
                {
                    name      = "ms level",
                    accession = "MS:1000511",
                    value     = ((int)scanFilter.MSOrder).ToString(CultureInfo.InvariantCulture),
                    cvRef     = "MS"
                }
            };

            // Trailer extra data list
            var    trailerData      = _rawFile.GetTrailerExtraInformation(scanNumber);
            int?   charge           = null;
            double?monoisotopicMass = null;

            for (var i = 0; i < trailerData.Length; i++)
            {
                if (trailerData.Labels[i] == "Charge State:")
                {
                    if (Convert.ToInt32(trailerData.Values[i]) > 0)
                    {
                        charge = Convert.ToInt32(trailerData.Values[i]);
                    }
                }

                if (trailerData.Labels[i] == "Monoisotopic M/Z:")
                {
                    monoisotopicMass = double.Parse(trailerData.Values[i]);
                }
            }

            // Construct and set the scan list element of the spectrum
            var scanListType = ConstructScanList(scanNumber, scan, scanFilter, scanEvent, monoisotopicMass);

            spectrum.scanList = scanListType;

            switch (scanFilter.MSOrder)
            {
            case MSOrderType.Ms:
                spectrumCvParams.Add(new CVParamType
                {
                    accession = "MS:1000579",
                    cvRef     = "MS",
                    name      = "MS1 spectrum",
                    value     = ""
                });

                // Keep track of scan number for precursor reference
                _precursorScanNumber = scanNumber;

                break;

            case MSOrderType.Ms2:
                spectrumCvParams.Add(new CVParamType
                {
                    accession = "MS:1000580",
                    cvRef     = "MS",
                    name      = "MSn spectrum",
                    value     = ""
                });

                // Construct and set the precursor list element of the spectrum
                var precursorListType = ConstructPrecursorList(scanEvent, charge);
                spectrum.precursorList = precursorListType;
                break;

            case MSOrderType.Ng:
                break;

            case MSOrderType.Nl:
                break;

            case MSOrderType.Par:
                break;

            case MSOrderType.Any:
                break;

            case MSOrderType.Ms3:
                break;

            case MSOrderType.Ms4:
                break;

            case MSOrderType.Ms5:
                break;

            case MSOrderType.Ms6:
                break;

            case MSOrderType.Ms7:
                break;

            case MSOrderType.Ms8:
                break;

            case MSOrderType.Ms9:
                break;

            case MSOrderType.Ms10:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            // Scan polarity
            var polarityType = scanFilter.Polarity;

            switch (polarityType)
            {
            case PolarityType.Positive:
                spectrumCvParams.Add(new CVParamType
                {
                    accession = "MS:1000130",
                    cvRef     = "MS",
                    name      = "positive scan",
                    value     = ""
                });
                break;

            case PolarityType.Negative:
                spectrumCvParams.Add(new CVParamType
                {
                    accession = "MS:1000129",
                    cvRef     = "MS",
                    name      = "negative scan",
                    value     = ""
                });
                break;

            case PolarityType.Any:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            // Total ion current
            spectrumCvParams.Add(new CVParamType
            {
                name      = "total ion current",
                accession = "MS:1000285",
                value     = scan.ScanStatistics.TIC.ToString(CultureInfo.InvariantCulture),
                cvRef     = "MS"
            });

            double?basePeakMass      = null;
            double?basePeakIntensity = null;
            double?lowestObservedMz  = null;
            double?highestObservedMz = null;

            double[] masses      = null;
            double[] intensities = null;
            if (scan.HasCentroidStream)
            {
                var centroidStream = _rawFile.GetCentroidStream(scanNumber, false);
                if (scan.CentroidScan.Length > 0)
                {
                    basePeakMass      = centroidStream.BasePeakMass;
                    basePeakIntensity = centroidStream.BasePeakIntensity;
                    lowestObservedMz  = centroidStream.Masses[0];
                    highestObservedMz = centroidStream.Masses[centroidStream.Masses.Length - 1];
                    masses            = centroidStream.Masses;
                    intensities       = centroidStream.Intensities;

                    // Note that although the scan data type is profile,
                    // centroid data might be available
                    spectrumCvParams.Add(new CVParamType
                    {
                        accession = "MS:1000127",
                        cvRef     = "MS",
                        name      = "centroid spectrum",
                        value     = ""
                    });
                }
            }
            else
            {
                // Get the scan statistics from the RAW file for this scan number
                var scanStatistics = _rawFile.GetScanStatsForScanNumber(scanNumber);

                basePeakMass      = scanStatistics.BasePeakMass;
                basePeakIntensity = scanStatistics.BasePeakIntensity;

                // Get the segmented (low res and profile) scan data
                var segmentedScan = _rawFile.GetSegmentedScanFromScanNumber(scanNumber, scanStatistics);
                if (segmentedScan.Positions.Length > 0)
                {
                    lowestObservedMz  = segmentedScan.Positions[0];
                    highestObservedMz = segmentedScan.Positions[segmentedScan.Positions.Length - 1];
                    masses            = segmentedScan.Positions;
                    intensities       = segmentedScan.Intensities;

                    spectrumCvParams.Add(new CVParamType
                    {
                        accession = "MS:1000128",
                        cvRef     = "MS",
                        name      = "profile spectrum",
                        value     = ""
                    });
                }
            }

            // Base peak m/z
            if (basePeakMass != null)
            {
                spectrumCvParams.Add(new CVParamType
                {
                    name          = "base peak m/z",
                    accession     = "MS:1000504",
                    value         = basePeakMass.ToString(),
                    unitCvRef     = "MS",
                    unitName      = "m/z",
                    unitAccession = "MS:1000040",
                    cvRef         = "MS"
                });
            }

            // Base peak intensity
            if (basePeakMass != null)
            {
                spectrumCvParams.Add(new CVParamType
                {
                    name          = "base peak intensity",
                    accession     = "MS:1000505",
                    value         = basePeakIntensity.ToString(),
                    unitCvRef     = "MS",
                    unitName      = "number of detector counts",
                    unitAccession = "MS:1000131",
                    cvRef         = "MS"
                });
            }

            // Lowest observed mz
            if (lowestObservedMz != null)
            {
                spectrumCvParams.Add(new CVParamType
                {
                    name          = "lowest observed m/z",
                    accession     = "MS:1000528",
                    value         = lowestObservedMz.ToString(),
                    unitCvRef     = "MS",
                    unitAccession = "MS:1000040",
                    unitName      = "m/z",
                    cvRef         = "MS"
                });
            }

            // Highest observed mz
            if (highestObservedMz != null)
            {
                spectrumCvParams.Add(new CVParamType
                {
                    name          = "highest observed m/z",
                    accession     = "MS:1000527",
                    value         = highestObservedMz.ToString(),
                    unitAccession = "MS:1000040",
                    unitName      = "m/z",
                    unitCvRef     = "MS",
                    cvRef         = "MS"
                });
            }

            // Add the CV params to the spectrum
            spectrum.cvParam = spectrumCvParams.ToArray();

            // Binary data array list
            var binaryData = new List <BinaryDataArrayType>();

            // M/Z Data
            if (!masses.IsNullOrEmpty())
            {
                // Set the spectrum default array length
                spectrum.defaultArrayLength = masses.Length;

                var massesBinaryData =
                    new BinaryDataArrayType
                {
                    binary = GetZLib64BitArray(masses)
                };
                massesBinaryData.encodedLength =
                    (4 * Math.Ceiling((double)massesBinaryData
                                      .binary.Length / 3)).ToString(CultureInfo.InvariantCulture);
                massesBinaryData.cvParam =
                    new CVParamType[3];
                massesBinaryData.cvParam[0] =
                    new CVParamType
                {
                    accession     = "MS:1000514",
                    name          = "m/z array",
                    cvRef         = "MS",
                    unitName      = "m/z",
                    value         = "",
                    unitCvRef     = "MS",
                    unitAccession = "MS:1000040"
                };
                massesBinaryData.cvParam[1] =
                    new CVParamType
                {
                    accession = "MS:1000523",
                    name      = "64-bit float",
                    cvRef     = "MS",
                    value     = ""
                };
                massesBinaryData.cvParam[2] =
                    new CVParamType
                {
                    accession = "MS:1000574",
                    name      = "zlib compression",
                    cvRef     = "MS",
                    value     = ""
                };

                binaryData.Add(massesBinaryData);
            }

            // Intensity Data
            if (!intensities.IsNullOrEmpty())
            {
                // Set the spectrum default array length if necessary
                if (spectrum.defaultArrayLength == 0)
                {
                    spectrum.defaultArrayLength = masses.Length;
                }

                var intensitiesBinaryData =
                    new BinaryDataArrayType
                {
                    binary = GetZLib64BitArray(intensities)
                };
                intensitiesBinaryData.encodedLength =
                    (4 * Math.Ceiling((double)intensitiesBinaryData
                                      .binary.Length / 3)).ToString(CultureInfo.InvariantCulture);
                intensitiesBinaryData.cvParam =
                    new CVParamType[3];
                intensitiesBinaryData.cvParam[0] =
                    new CVParamType
                {
                    accession     = "MS:1000515",
                    name          = "intensity array",
                    cvRef         = "MS",
                    unitCvRef     = "MS",
                    unitAccession = "MS:1000131",
                    unitName      = "number of counts",
                    value         = ""
                };
                intensitiesBinaryData.cvParam[1] =
                    new CVParamType
                {
                    accession = "MS:1000523",
                    name      = "64-bit float",
                    cvRef     = "MS",
                    value     = ""
                };
                intensitiesBinaryData.cvParam[2] =
                    new CVParamType
                {
                    accession = "MS:1000574",
                    name      = "zlib compression",
                    cvRef     = "MS",
                    value     = ""
                };

                binaryData.Add(intensitiesBinaryData);
            }

            if (!binaryData.IsNullOrEmpty())
            {
                spectrum.binaryDataArrayList = new BinaryDataArrayListType
                {
                    count           = binaryData.Count.ToString(),
                    binaryDataArray = binaryData.ToArray()
                };
            }

            return(spectrum);
        }
Example #25
0
 public static SampledSpectrum FromRgb(RgbSpectrumInfo rgb, SpectrumType type = SpectrumType.Reflectance)
 {
     return FromRgb(ref rgb, type);
 }
Example #26
0
 public static SampledSpectrum FromSampled(double[] data, SpectrumType t)
 {
     var vals = data.ToList().Where((c, i) => i % 2 != 0).Select(l => (float)l).ToArray();
     var lambdas = data.ToList().Where((c, i) => i % 2 == 0).Select(l => (float)l).ToArray();
     var s = SampledSpectrum.FromSampled(lambdas, vals, t);
     return s;
 }
Example #27
0
        public static SampledSpectrum FromRgb(ref RgbSpectrumInfo rgb, SpectrumType type = SpectrumType.Reflectance)
        {
            var r = new SampledSpectrum(0f);
            if (type == SpectrumType.Reflectance)
            {
                // Convert reflectance spectrum to RGB
                if (rgb.c1 <= rgb.c2 && rgb.c1 <= rgb.c3)
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c1_ as minimum
                    //r += rgb.c1 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c1, ref r);

                    //SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c1);
                    if (rgb.c2 <= rgb.c3)
                    {
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb.c2 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectBlue, (rgb.c3 - rgb.c2), ref r);
                        //r += (rgb.c2 - rgb.c1) * rgbRefl2SpectCyan;
                        //r += (rgb.c3 - rgb.c2) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c1) * rgbRefl2SpectCyan;
                        //r += (rgb.c2 - rgb.c3) * rgbRefl2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb.c3 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectGreen, (rgb.c2 - rgb.c3), ref r);
                    }
                }
                else if (rgb.c2 <= rgb.c1 && rgb.c2 <= rgb.c3)
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c2_ as minimum
                    //r += rgb.c2 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c2, ref r);

                    if (rgb.c1 <= rgb.c3)
                    {
                        //r += (rgb.c1 - rgb.c2) * rgbRefl2SpectMagenta;
                        //r += (rgb.c3 - rgb.c1) * rgbRefl2SpectBlue;

                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectMagenta, (rgb.c1 - rgb.c2), ref r);
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectBlue, (rgb.c3 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c2) * rgbRefl2SpectMagenta;
                        //r += (rgb.c1 - rgb.c3) * rgbRefl2SpectRed;
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectMagenta, (rgb.c3 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectRed, (rgb.c1 - rgb.c3), ref r);
                    }
                }
                else
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c3_ as minimum
                    //r += rgb.c3 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectWhite, rgb.c3, ref r);

                    if (rgb.c1 <= rgb.c2)
                    {
                        //r += (rgb.c1 - rgb.c3) * rgbRefl2SpectYellow;
                        //r += (rgb.c2 - rgb.c1) * rgbRefl2SpectGreen;
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectYellow, (rgb.c1 - rgb.c3), ref r);
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectGreen, (rgb.c2 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c2 - rgb.c3) * rgbRefl2SpectYellow;
                        //r += (rgb.c1 - rgb.c2) * rgbRefl2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectYellow, (rgb.c2 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectRed, (rgb.c1 - rgb.c2), ref r);
                    }
                }
                SSE.MulSSE(ref r, .94f, ref r);

                //r *= .94f;
            }
            else
            {
                // Convert illuminant spectrum to RGB
                if (rgb.c1 <= rgb.c2 && rgb.c1 <= rgb.c3)
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c1_ as minimum
                    //r += rgb.c1 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c1, ref r);
                    if (rgb.c2 <= rgb.c3)
                    {
                        //r += (rgb.c2 - rgb.c1) * rgbIllum2SpectCyan;
                        //r += (rgb.c3 - rgb.c2) * rgbIllum2SpectBlue;
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb.c2 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb.c3 - rgb.c2), ref r);

                    }
                    else
                    {
                        // r += (rgb.c3 - rgb.c1) * rgbIllum2SpectCyan;
                        //r += (rgb.c2 - rgb.c3) * rgbIllum2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb.c3 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb.c2 - rgb.c3), ref r);
                    }
                }
                else if (rgb.c2 <= rgb.c1 && rgb.c2 <= rgb.c3)
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c2_ as minimum
                    //r += rgb.c2 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c2, ref r);

                    if (rgb.c1 <= rgb.c3)
                    {
                        //r += (rgb.c1 - rgb.c2) * rgbIllum2SpectMagenta;
                        //r += (rgb.c3 - rgb.c1) * rgbIllum2SpectBlue;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb.c1 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb.c3 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c2) * rgbIllum2SpectMagenta;
                        //r += (rgb.c1 - rgb.c3) * rgbIllum2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb.c3 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectRed, (rgb.c1 - rgb.c3), ref r);
                    }
                }
                else
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c3_ as minimum
                    //r += rgb.c3 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c3, ref r);

                    if (rgb.c1 <= rgb.c2)
                    {
                        //r += (rgb.c1 - rgb.c3) * rgbIllum2SpectYellow;
                        //r += (rgb.c2 - rgb.c1) * rgbIllum2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb.c1 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb.c2 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c2 - rgb.c3) * rgbIllum2SpectYellow;
                        //r += (rgb.c1 - rgb.c2) * rgbIllum2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb.c2 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectRed, (rgb.c1 - rgb.c2), ref r);
                    }
                }
                SSE.MulSSE(ref r, .86445f, ref r);
                //r *= .86445f;
            }
            //SSE.ClampSSE(ref r, ref r);
            //r.ClampSelf();
            return r;
        }
Example #28
0
 public static IrregularSPD IrregularFromSampled(double[] data, SpectrumType t)
 {
     var vals = data.ToList().Where((c, i) => i % 2 != 0).Select(l => (float)l).ToArray();
     var lambdas = data.ToList().Where((c, i) => i % 2 == 0).Select(l => (float)l).ToArray();
     return new IrregularSPD(lambdas, vals, lambdas.Length);
 }
Example #29
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="options">Filterbank options</param>
        public FilterbankExtractor(FilterbankOptions options) : base(options)
        {
            var filterbankSize = options.FilterBankSize;

            if (options.FilterBank == null)
            {
                _blockSize = options.FftSize > FrameSize ? options.FftSize : MathUtils.NextPowerOfTwo(FrameSize);

                var melBands = FilterBanks.MelBands(filterbankSize, SamplingRate, options.LowFrequency, options.HighFrequency, false);
                FilterBank = FilterBanks.Rectangular(_blockSize, SamplingRate, melBands, mapper: Scale.HerzToMel);
            }
            else
            {
                FilterBank     = options.FilterBank;
                filterbankSize = FilterBank.Length;
                _blockSize     = 2 * (FilterBank[0].Length - 1);

                Guard.AgainstExceedance(FrameSize, _blockSize, "frame size", "FFT size");
            }

            FeatureCount = filterbankSize;

            _fft = new RealFft(_blockSize);

            // setup spectrum post-processing: =======================================================

            _logFloor         = options.LogFloor;
            _nonLinearityType = options.NonLinearity;
            switch (_nonLinearityType)
            {
            case NonLinearityType.Log10:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog10(FilterBank, _spectrum, _bandSpectrum, _logFloor); break;

            case NonLinearityType.LogE:
                _postProcessSpectrum = () => FilterBanks.ApplyAndLog(FilterBank, _spectrum, _bandSpectrum, _logFloor); break;

            case NonLinearityType.ToDecibel:
                _postProcessSpectrum = () => FilterBanks.ApplyAndToDecibel(FilterBank, _spectrum, _bandSpectrum, _logFloor); break;

            case NonLinearityType.CubicRoot:
                _postProcessSpectrum = () => FilterBanks.ApplyAndPow(FilterBank, _spectrum, _bandSpectrum, 0.33); break;

            default:
                _postProcessSpectrum = () => FilterBanks.Apply(FilterBank, _spectrum, _bandSpectrum); break;
            }

            _spectrumType = options.SpectrumType;
            switch (_spectrumType)
            {
            case SpectrumType.Magnitude:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, false); break;

            case SpectrumType.MagnitudeNormalized:
                _getSpectrum = block => _fft.MagnitudeSpectrum(block, _spectrum, true); break;

            case SpectrumType.PowerNormalized:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, true); break;

            default:
                _getSpectrum = block => _fft.PowerSpectrum(block, _spectrum, false); break;
            }

            // reserve memory for reusable blocks

            _spectrum     = new float[_blockSize / 2 + 1];
            _bandSpectrum = new float[filterbankSize];
        }
Example #30
0
 public void FromRgb(ref RgbSpectrum rgbSp, SpectrumType type = SpectrumType.Reflectance)
 {
     var rgb = rgbSp.ToArray();
     var c = FromRGB(rgb, type);
     for (int i = 0; i < nSamples; i++)
     {
         this[i] = c[i];
     }
 }
Example #31
0
        public void ReadFromStream(System.IO.StreamReader sr)
        {
            string kStr   = "";
            string findId = "";

            while (sr.EndOfStream == false)
            {
                try
                {
                    kStr   = sr.ReadLine();
                    findId = GetID(kStr);
                    if (findId == "N101")
                    {
                        CutOffFrequencies = double.Parse(GetValues(kStr, ' ')[5]);
                    }
                    else if (findId == "N102")
                    {
                        X = double.Parse(GetValues(kStr, ' ')[1]);
                        Y = double.Parse(GetValues(kStr, ' ')[2]);
                        Z = double.Parse(GetValues(kStr, ' ')[3]);
                    }
                    else if (findId == "N103")
                    {
                        if (GetValues(kStr, ' ')[1] == "ACCELERATION")
                        {
                            Type = SpectrumType.Acceleration;
                        }
                        else if (GetValues(kStr, ' ')[1] == "DISPLACEMENT")
                        {
                            Type = SpectrumType.Displacement;
                        }
                    }
                    else if (findId == "N104")
                    {
                        SpectrumPoints = int.Parse(GetValues(kStr, ' ')[1]);
                        ScaleFactor    = double.Parse(GetValues(kStr, ' ')[2]);
                    }
                    else if (findId == "N105")
                    {
                        double prd, acc, disp;
                        if (Type == SpectrumType.Acceleration)
                        {
                            prd = acc = 0.0;
                            prd = double.Parse(GetValues(kStr, ' ')[1]);
                            acc = double.Parse(GetValues(kStr, ' ')[2]);
                            Periods.Add(prd);
                            Acceleration.Add(acc);
                        }
                        else if (Type == SpectrumType.Displacement)
                        {
                            prd  = disp = 0.0;
                            prd  = double.Parse(GetValues(kStr, ' ')[1]);
                            disp = double.Parse(GetValues(kStr, ' ')[2]);
                            Periods.Add(prd);
                            Displacement.Add(disp);
                        }
                    }
                }
                catch (Exception ex) { }
            }
        }
Example #32
0
        public static PSSpectrum FromRGB(float[] rgb, SpectrumType type = SpectrumType.Reflectance)
        {
            var r = new PSSpectrum(0f);
            if (type == SpectrumType.Reflectance)
            {
                // Convert reflectance spectrum to RGB
                if (rgb[0] <= rgb[1] && rgb[0] <= rgb[2])
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[0]_ as minimum
                    //r += rgb[0] * rgbRefl2SpectWhite;
                    r.MAdd(ref rgbRefl2SpectWhite, rgb[0]);
                    if (rgb[1] <= rgb[2])
                    {
                        r.MAdd(ref rgbRefl2SpectCyan, (rgb[1] - rgb[0]));
                        r.MAdd(ref rgbRefl2SpectBlue, (rgb[2] - rgb[1]));
                        //r += (rgb[1] - rgb[0]) * rgbRefl2SpectCyan;
                        //r += (rgb[2] - rgb[1]) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[0]) * rgbRefl2SpectCyan;
                        //r += (rgb[1] - rgb[2]) * rgbRefl2SpectGreen;

                        r.MAdd(ref rgbRefl2SpectCyan, (rgb[2] - rgb[0]));
                        r.MAdd(ref rgbRefl2SpectGreen, (rgb[1] - rgb[2]));
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[1]_ as minimum
                    //r += rgb[1] * rgbRefl2SpectWhite;
                    r.MAdd(ref rgbRefl2SpectWhite, rgb[1]);

                    if (rgb[0] <= rgb[2])
                    {
                        //r += (rgb[0] - rgb[1]) * rgbRefl2SpectMagenta;
                        //r += (rgb[2] - rgb[0]) * rgbRefl2SpectBlue;

                        r.MAdd(ref rgbRefl2SpectMagenta, (rgb[0] - rgb[1]));
                        r.MAdd(ref rgbRefl2SpectBlue, (rgb[2] - rgb[0]));
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[1]) * rgbRefl2SpectMagenta;
                        //r += (rgb[0] - rgb[2]) * rgbRefl2SpectRed;
                        r.MAdd(ref rgbRefl2SpectMagenta, (rgb[2] - rgb[1]));
                        r.MAdd(ref rgbRefl2SpectRed, (rgb[0] - rgb[2]));
                    }
                }
                else
                {
                    // Compute reflectance _PSSpectrum_ with _rgb[2]_ as minimum
                    //r += rgb[2] * rgbRefl2SpectWhite;
                    r.MAdd(ref rgbRefl2SpectWhite, rgb[2]);

                    if (rgb[0] <= rgb[1])
                    {
                        //r += (rgb[0] - rgb[2]) * rgbRefl2SpectYellow;
                        //r += (rgb[1] - rgb[0]) * rgbRefl2SpectGreen;
                        r.MAdd(ref rgbRefl2SpectYellow, (rgb[0] - rgb[2]));
                        r.MAdd(ref rgbRefl2SpectGreen, (rgb[1] - rgb[0]));
                    }
                    else
                    {
                        //r += (rgb[1] - rgb[2]) * rgbRefl2SpectYellow;
                        //r += (rgb[0] - rgb[1]) * rgbRefl2SpectRed;

                        r.MAdd(ref rgbRefl2SpectYellow, (rgb[1] - rgb[2]));
                        r.MAdd(ref rgbRefl2SpectRed, (rgb[0] - rgb[1]));
                    }
                }
                r *= .94f;
            }
            else
            {
                // Convert illuminant spectrum to RGB
                if (rgb[0] <= rgb[1] && rgb[0] <= rgb[2])
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[0]_ as minimum
                    //r += rgb[0] * rgbIllum2SpectWhite;
                    r.MAdd(ref rgbIllum2SpectWhite, rgb[0]);
                    if (rgb[1] <= rgb[2])
                    {
                        //r += (rgb[1] - rgb[0]) * rgbIllum2SpectCyan;
                        //r += (rgb[2] - rgb[1]) * rgbIllum2SpectBlue;
                        r.MAdd(ref rgbIllum2SpectCyan, (rgb[1] - rgb[0]));
                        r.MAdd(ref rgbIllum2SpectBlue, (rgb[2] - rgb[1]));

                    }
                    else
                    {
                        // r += (rgb[2] - rgb[0]) * rgbIllum2SpectCyan;
                        //r += (rgb[1] - rgb[2]) * rgbIllum2SpectGreen;

                        r.MAdd(ref rgbIllum2SpectCyan, (rgb[2] - rgb[0]));
                        r.MAdd(ref rgbIllum2SpectGreen, (rgb[1] - rgb[2]));
                    }
                }
                else if (rgb[1] <= rgb[0] && rgb[1] <= rgb[2])
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[1]_ as minimum
                    //r += rgb[1] * rgbIllum2SpectWhite;
                    r.MAdd(ref rgbIllum2SpectWhite, rgb[1]);

                    if (rgb[0] <= rgb[2])
                    {
                        //r += (rgb[0] - rgb[1]) * rgbIllum2SpectMagenta;
                        //r += (rgb[2] - rgb[0]) * rgbIllum2SpectBlue;

                        r.MAdd(ref rgbIllum2SpectMagenta, (rgb[0] - rgb[1]));
                        r.MAdd(ref rgbIllum2SpectBlue, (rgb[2] - rgb[0]));
                    }
                    else
                    {
                        //r += (rgb[2] - rgb[1]) * rgbIllum2SpectMagenta;
                        //r += (rgb[0] - rgb[2]) * rgbIllum2SpectRed;

                        r.MAdd(ref rgbIllum2SpectMagenta, (rgb[2] - rgb[1]));
                        r.MAdd(ref rgbIllum2SpectRed, (rgb[0] - rgb[2]));
                    }
                }
                else
                {
                    // Compute illuminant _PSSpectrum_ with _rgb[2]_ as minimum
                    //r += rgb[2] * rgbIllum2SpectWhite;
                    r.MAdd(ref rgbIllum2SpectWhite, rgb[2]);

                    if (rgb[0] <= rgb[1])
                    {
                        //r += (rgb[0] - rgb[2]) * rgbIllum2SpectYellow;
                        //r += (rgb[1] - rgb[0]) * rgbIllum2SpectGreen;

                        r.MAdd(ref rgbIllum2SpectYellow, (rgb[0] - rgb[2]));
                        r.MAdd(ref rgbIllum2SpectGreen, (rgb[1] - rgb[0]));
                    }
                    else
                    {
                        //r += (rgb[1] - rgb[2]) * rgbIllum2SpectYellow;
                        //r += (rgb[0] - rgb[1]) * rgbIllum2SpectRed;

                        r.MAdd(ref rgbIllum2SpectYellow, (rgb[1] - rgb[2]));
                        r.MAdd(ref rgbIllum2SpectRed, (rgb[0] - rgb[1]));
                    }
                }
                r *= .86445f;
            }
            r.ClampSelf();
            return r;
        }
Example #33
0
 public Radiance(ref RgbSpectrum s, SpectrumType t)
 {
     spectra = new SampledSpectrum(ref s, t);
 }
Example #34
0
 public static PSSpectrum FromXYZ(float[] xyz, SpectrumType type = SpectrumType.Reflectance)
 {
     float[] rgb = null;
     XYZToRGB(xyz, out rgb);
     return FromRGB(rgb, type);
 }
Example #35
0
 public Radiance Add(ref RgbSpectrum f, SpectrumType type)
 {
     spectra = spectra + new SampledSpectrum(ref f, type);
     return this;
 }
Example #36
0
 public PSSpectrum(RgbSpectrum c, SpectrumType type)
 {
     //spectra = new float[nSamples];
     FromRgb(ref c, type);
 }
Example #37
0
        private bool ParseN42File()
        {
            if (radInstrumentData == null || deviceData == null)
            {
                return(false);
            }

            try
            {
                RadInstrumentInformationType instrumentInfo = radInstrumentData.RadInstrumentInformation;
                if (instrumentInfo == null)
                {
                    return(false);
                }

                // Get DeviceType
                deviceData.DeviceType = instrumentInfo.RadInstrumentModelName;

                // Get SerialNumber
                deviceData.SerialNumber = instrumentInfo.RadInstrumentIdentifier.Split('-').LastOrDefault();

                // Find AnalysisResults and DerivedData
                AnalysisResultsType analysisResults = null;
                DerivedDataType     derivedData     = null;
                ItemsChoiceType2[]  itemsChoices2   = radInstrumentData.ItemsElementName;
                for (int i = itemsChoices2.Length - 1; i >= 0; i -= 1)
                {
                    if (analysisResults == null)
                    {
                        if (itemsChoices2[i] == ItemsChoiceType2.AnalysisResults)
                        {
                            analysisResults = radInstrumentData.Items[i] as AnalysisResultsType;
                            // Check if correct Id
                            if (analysisResults.id.StartsWith("Identification") == true)
                            {
                                continue;
                            }
                            analysisResults = null;
                        }
                    }
                    if (derivedData == null)
                    {
                        if (itemsChoices2[i] == ItemsChoiceType2.DerivedData)
                        {
                            derivedData = radInstrumentData.Items[i] as DerivedDataType;
                            // Check if correct Id
                            if (derivedData.id.StartsWith("ForegroundMeasureSum") == true)
                            {
                                continue;
                            }
                            derivedData = null;
                        }
                    }
                    if (analysisResults != null && derivedData != null)
                    {
                        break;
                    }
                }

                // Get StartDateTime
                if (analysisResults == null || analysisResults.AnalysisStartDateTimeSpecified == false)
                {
                    return(false);
                }
                deviceData.StartDateTime = analysisResults.AnalysisStartDateTime;

                // Get Identified Nuclides
                if (analysisResults.NuclideAnalysisResults == null)
                {
                    return(true);
                }
                NuclideType[] nuclides = analysisResults.NuclideAnalysisResults.Nuclide;
                if (nuclides == null)
                {
                    return(true);
                }
                for (int i = 0; i < nuclides.Length; i += 1)
                {
                    double            confidence   = -1;
                    ItemsChoiceType[] itemsChoices = nuclides[i].ItemsElementName;
                    for (int c = 0; c < itemsChoices.Length; c += 1)
                    {
                        if (itemsChoices[c] == ItemsChoiceType.NuclideIDConfidenceValue)
                        {
                            confidence = (double)nuclides[i].Items[c];
                            break;
                        }
                    }
                    deviceData.Nuclides[i] = new NuclideID(
                        nuclides[i].NuclideName, confidence);
                }

                // Get MeasureTime
                if (derivedData == null)
                {
                    return(false);
                }
                // Format is PTsss.fffS
                string value = derivedData.RealTimeDuration.Remove(0, 2);
                value = value.Remove(value.Length - 1, 1);
                deviceData.MeasureTime = new TimeSpan(0, 0, (int)Math.Round(double.Parse(value)));

                // Get Count Rate
                SpectrumType spectrumType = derivedData.Spectrum.Where(s => s.id == "ForegroundSumGamma").FirstOrDefault();
                if (spectrumType == null)
                {
                    return(false);
                }
                // Sum spectrum and divide by MeasureTime
                int sum = spectrumType.ChannelData.Text.Split(Globals.Delim_Space, StringSplitOptions.RemoveEmptyEntries).Sum(c => int.Parse(c));
                deviceData.CountRate = sum / deviceData.MeasureTime.TotalSeconds;
            }
            catch (Exception ex)
            {
                fileErrors.Add(new KeyValuePair <string, string>(Path.GetFileName(deviceData.FileName), ex.Message));
                ErrorsOccurred = true;
                return(false);
            }
            return(true);
        }