public void Start()
        {
            _queueStopped = false;
            Task.Run(async() => {
                bool queueEmpty      = false;
                int queueLastLength  = 0;
                int queueLengthSlope = 0;

                while (!(queueEmpty && _queueStopped))
                {
                    List <BciData> sample;
                    queueEmpty = !_queue.TryDequeue(out sample);

                    if (!queueEmpty)
                    {
                        Debug.WriteLine("Processing queue...");
                        // Update error and d_error
                        queueLengthSlope = _queue.Count - queueLastLength;
                        queueLastLength  = _queue.Count;
                        AdjustParameters(queueLastLength, queueLengthSlope);

                        // Analyse data and fire events
                        double[] xValues = new double[sample.Count];
                        for (int i = 0; i < sample.Count; ++i)
                        {
                            xValues[i] = i;
                        }

                        for (int channel = 0; channel < 8; ++channel)
                        {
                            double[] yValues = new double[sample.Count];
                            for (int i = 0; i < sample.Count; ++i)
                            {
                                yValues[i] = sample[i].ChannelData[channel] * ScaleFactor;
                            }

                            IImfDecomposition decomp = await Emd.EnsembleDecomposeAsync(xValues, yValues, 1000, _ensembleCount);
                            //var decomp = await Emd.DecomposeAsync(xValues, yValues);

                            IHilbertSpectrum spectrum = (decomp.ImfFunctions.Count == 0) ?
                                                        null : await Hsa.GetHilbertSpectrumAsync(decomp, 1.0);

                            SampleAnalysed?.Invoke(spectrum, yValues, channel);
                        }
                    }
                    else
                    {
                        await Task.Delay(100);
                    }
                }
            });
        }
        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));
        }
Пример #3
0
        private static List <double> PreProcess(List <double[]> signalsList, double Q, int m, double r, int N, int iterations, int locality)
        {
            double[] f3    = new double[signalsList.Count];
            bool     first = true;


            for (int i = 0; i < f3.Length; i++)
            {
                if (first)
                {
                    //f3[i] = BetaBandpass(signalsList[i][0], true);
                    f3[i] = signalsList[i][0];
                    first = false;
                }
                else
                {
                    //f3[i] = BetaBandpass(signalsList[i][0], false);
                    f3[i] = signalsList[i][0];
                }
            }

            string internalDirectory = _dataAccessFacade.GetGeneralSettings().GetModalDirectory("Emotion");
            var    file_F3           = File.AppendText(Path.Combine(internalDirectory, "F3.json"));

            file_F3.WriteLine(f3.ToJsonString());
            file_F3.Flush();
            file_F3.Close();


            //f3 = FilterRLC.LCHP(f3, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 5, Q);
            //f3 = FilterRLC.LCLP(f3, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 50, Q);
            for (int i = 0; i < f3.Length; i++)
            {
                if (double.IsInfinity(f3[i]) || double.IsNaN(f3[i]))
                {
                    Console.WriteLine(i + " f3 es " + f3[i]);
                    f3[i] = f3[i - 1] * (1 + (_xrand.Next(-1, 1) / 10));
                }
            }
            var file_F3Filtered = File.AppendText(Path.Combine(internalDirectory, "F3Filtered.json"));

            file_F3Filtered.WriteLine(f3.ToJsonString());
            file_F3Filtered.Flush();
            file_F3Filtered.Close();


            double[] c4 = new double[signalsList.Count];
            first = true;
            for (int i = 0; i < c4.Length; i++)
            {
                if (first)
                {
                    //c4[i] = BetaBandpass(signalsList[i][1], true);
                    c4[i] = signalsList[i][1];
                    first = false;
                }
                else
                {
                    //c4[i] = BetaBandpass(signalsList[i][1], false);
                    c4[i] = signalsList[i][1];
                }
            }
            var file_C4 = File.AppendText(Path.Combine(internalDirectory, "C4.json"));

            file_C4.WriteLine(c4.ToJsonString());
            file_C4.Flush();
            file_C4.Close();
            //c4 = FilterRLC.LCHP(c4, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 5, Q);
            //c4 = FilterRLC.LCLP(c4, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 50, Q);
            for (int i = 0; i < c4.Length; i++)
            {
                if (double.IsInfinity(c4[i]) || double.IsNaN(c4[i]))
                {
                    Console.WriteLine(i + " c4 es " + c4[i]);
                    c4[i] = c4[i - 1] * (1 + (_xrand.Next(-1, 1) / 10));
                }
            }
            var file_C4Filtered = File.AppendText(Path.Combine(internalDirectory, "C4Filtered.json"));

            file_C4Filtered.WriteLine(c4.ToJsonString());
            file_C4Filtered.Flush();
            file_C4Filtered.Close();

            var emdF3  = new Emd();
            var imfsF3 = emdF3.GetImfs(f3, 4, iterations, locality);

            Console.WriteLine("obtenido imfs F3");

            var emdC4  = new Emd();
            var imfsC4 = emdC4.GetImfs(c4, 4, iterations, locality);

            Console.WriteLine("obtenido imfs C4");

            var file_imfsF3 = File.AppendText(Path.Combine(internalDirectory, "imfsF3.json"));

            file_imfsF3.WriteLine(imfsF3.ToJsonString());
            file_imfsF3.Flush();
            file_imfsF3.Close();

            var file_imfsC4 = File.AppendText(Path.Combine(internalDirectory, "imfsC4.json"));

            file_imfsC4.WriteLine(imfsC4.ToJsonString());
            file_imfsC4.Flush();
            file_imfsC4.Close();


            //return MH(imfsF3, imfsC4);
            return(CalcEntropy(imfsF3, imfsC4, N, m, r));
        }
Пример #4
0
        private List <double> PreProcess(List <double[]> signalsList, double Q, int m, double r, int N, int iterations, int locality)
        {
            double[] f3    = new double[signalsList.Count];
            bool     first = true;


            for (int i = 0; i < f3.Length; i++)
            {
                if (first)
                {
                    f3[i] = BetaBandpass(signalsList[i][0], true);
                    //f3[i] = signalsList[i][0];
                    first = false;
                }
                else
                {
                    f3[i] = BetaBandpass(signalsList[i][0], false);
                    //f3[i] = signalsList[i][0];
                }
            }

            //f3 = FilterRLC.LCHP(f3, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 5, Q);
            //f3 = FilterRLC.LCLP(f3, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 50, Q);
            for (int i = 0; i < f3.Length; i++)
            {
                if (double.IsInfinity(f3[i]) || double.IsNaN(f3[i]))
                {
                    Console.WriteLine("F3 es NaN o Infinityyyyyy");
                    f3[i] = f3[i - 1] * (1 + (_xrand.Next(-1, 1) / 10));
                }
            }


            double[] c4 = new double[signalsList.Count];
            first = true;
            for (int i = 0; i < c4.Length; i++)
            {
                if (first)
                {
                    c4[i] = BetaBandpass(signalsList[i][1], true);
                    //c4[i] = signalsList[i][1];
                    first = false;
                }
                else
                {
                    c4[i] = BetaBandpass(signalsList[i][1], false);
                    //c4[i] = signalsList[i][1];
                }
            }
            //c4 = FilterRLC.LCHP(c4, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 5, Q);
            //c4 = FilterRLC.LCLP(c4, EEGEmoProc2ChSettings.Instance.SamplingHz.Value, 50, Q);
            for (int i = 0; i < c4.Length; i++)
            {
                if (double.IsInfinity(c4[i]) || double.IsNaN(c4[i]))
                {
                    Console.WriteLine("C4 es NaN o Infinityyyyyy");
                    c4[i] = c4[i - 1] * (1 + (_xrand.Next(-1, 1) / 10));
                }
            }
            var emdF3  = new Emd();
            var imfsF3 = emdF3.GetImfs(f3, 4, iterations, locality);

            var emdC4  = new Emd();
            var imfsC4 = emdC4.GetImfs(c4, 4, iterations, locality);

            //return MH(imfsF3, imfsC4);
            return(CalcEntropy(imfsF3, imfsC4, N, m, r));
        }