Пример #1
0
        private void OnSampleAnalysed(IHilbertSpectrum spectrum, double[] channelData, int channel)
        {
            if (_vm != null && channel == _vm.Channel && spectrum != null)
            {
                double        minFreq      = spectrum.MinFrequency;
                double        maxFreq      = spectrum.MaxFrequency;
                double        step         = maxFreq / 1000;
                double        avgSpectrum  = 0.0;
                List <double> spectrumData = new List <double>();
                List <double> spectrumFreq = new List <double>();

                for (int i = 0; i < 1000; ++i)
                {
                    double freq  = step * i;
                    double value = spectrum.ComputeMarginalAt(freq);
                    spectrumData.Add(value);
                    spectrumFreq.Add(freq);
                    avgSpectrum += value;
                }
                avgSpectrum /= 1000;

                _vm.UpdateContent(maxFreq, minFreq, channelData, spectrumData, spectrumFreq, avgSpectrum, Dispatcher);
            }
        }
        public async Task Initialize(int channelIndex)
        {
            BciData[] sampleData = DataManager.Current.LastSample;

            var channelData = new double[sampleData.Length];

            for (int i = 0; i < sampleData.Length; ++i)
            {
                channelData[i] = sampleData[i].ChannelData[channelIndex] * DataManager.ScaleFactor;
            }

            double[] xValues = new double[channelData.Length];
            for (int i = 0; i < channelData.Length; ++i)
            {
                xValues[i] = i;
            }

            Status = "Decomposing...";
            IImfDecomposition decomp = await Emd.EnsembleDecomposeAsync(xValues, channelData,
                                                                        1000, DataManager.Current.EnsembleCount);

            Status = "Analysing...";
            IHilbertSpectrum hs = await Hsa.GetHilbertSpectrumAsync(decomp, 1.0);

            Status = null;

            _xStep = hs.MaxFrequency / XLength;

            var marginalData = new ChartValues <double>();

            for (double w = 0; w <= hs.MaxFrequency; w += _xStep)
            {
                marginalData.Add(hs.ComputeMarginalAt(w));
            }

            double marginalMin = marginalData[0], marginalMax = marginalData[0], marginalMean = 0.0;

            foreach (double val in marginalData)
            {
                marginalMean += val;
                if (val < marginalMin)
                {
                    marginalMin = val;
                }
                else if (val > marginalMax)
                {
                    marginalMax = val;
                }
            }
            marginalMean /= marginalData.Count;

            Info = $"Channel = {channelIndex+1}\nMin value = {marginalMin}\nMax value = {marginalMax}\nAverage value = {marginalMean}";

            var mapper = new CartesianMapper <double>()
                         .X((value, index) => hs.MinFrequency + index * _xStep)
                         .Y((value, index) => value);

            _marginalSpectrum = new SeriesCollection(mapper)
            {
                new LineSeries {
                    Title           = "Marginal Hilbert Spectrum",
                    Values          = marginalData,
                    PointGeometry   = DefaultGeometries.None,
                    StrokeThickness = 0.5,
                    Stroke          = new SolidColorBrush(Colors.Red)
                }
            };
            OnPropertyChanged(nameof(MarginalSpectrum));
        }