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)); }
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)); }
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)); }