private void cbTransform_SelectedIndexChanged(object sender, EventArgs e) { switch (cbTransform.Text) { case "Fourier": { transformX = new Func <Double[], Double[], Double[]>((y, args) => Transformations.FurieXTransform(y)); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.FurieFunction(y)); addParameters(panelTransformParams, new string[] { }); break; } case "ForwardFurie": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ForwardFurie(y).Select(x => x.Imaginary + x.Real).ToArray()); addParameters(panelTransformParams, new string[] { }); break; } case "ReverseFurie": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ReverseFurie(y).Select(x => x.Imaginary + x.Real).ToArray()); addParameters(panelTransformParams, new string[] { }); break; } case "CombFilter": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => { double [] res = Transformations.CombFilter(y, args[0], (int)args[1]); return(res); }); addParameters(panelTransformParams, new string[] { "g", "M" }); break; } case "Spikes(F(x),M,Sigma)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.SpikesFunction(y, args[0], args[1])); addParameters(panelTransformParams, new string[] { "M", "sigma" }); break; } case "Shift(F(x),shift)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ShiftFunction(y, args[0])); addParameters(panelTransformParams, new string[] { "shift" }); break; } case "RandomSpikes(x,spikes)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.RandomSpikes(y, (int)args[0], args[1])); double tmp = 0; addParameters(panelTransformParams, new string[] { "spikes", "sigma" }); break; } case "ConvolutionWithHeartBeat(x,f0,alpha,hLeft,hRight,hStep)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ConvolutionWithHeartBeat(y, args[0], args[1], args[2], args[3], args[4], Double.Parse(tbStep.Text))); double tmp = 0; addParameters(panelTransformParams, new string[] { "f0", "alpha", "hLeft", "hRight", "hStep" }); break; } case "ConvolutionWithPlot": { transformX = new Func <Double[], Double[], Double[]>((y, args) => { Series series = chart.Series.FindByName(args[0].ToString()); int m = series.Points.Select(item => item.YValues[0]).ToArray().Length; return(y.ToArray()); }); transformY = new Func <Double[], Double[], Double[]>((y, args) => { Series series = chart.Series.FindByName(args[0].ToString()); double[] h = series.Points.Select(item => item.YValues[0]).ToArray(); double[] res = Transformations.ConvolutionWithPlot(h, y); return(Transformations.Normalize(res)); }); addParameters(panelTransformParams, new string[] { "Plot number" }); break; } case "Shroeder": { transformX = new Func <Double[], Double[], Double[]>((y, args) => { return(y.ToArray()); }); transformY = new Func <Double[], Double[], Double[]>((y, args) => { double g = 0.9; double[] cg = new double[4]; int[] cd = new int[4]; double ag = 0.9; int[] ad = new int[2]; double k = 0.2; Random r = new Random(); for (int i = 0; i < cg.Length; i++) { cg[i] = 0.7; } for (int i = 0; i < cd.Length; i++) { cd[i] = (int)(0.05 * r.Next(0, y.Length) + 1); } for (int i = 0; i < ad.Length; i++) { ad[i] = (int)(0.05 * r.Next(0, y.Length) + 1); } return(Transformations.ShroederFilter(y, cg, cd, ag, ad, k)); }); addParameters(panelTransformParams, new string[] {}); break; } case "ConvolutionWithLpf(x,fcut,m,dt)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y.Take(y.Length).ToArray()); transformY = new Func <Double[], Double[], Double[]>((y, args) => { int m = (int)args[1]; return(Transformations.ConwolutionWithLpf(y, args[0], m, dT) .Skip(m).Take(y.Length).ToArray()); }); double tmp = 0; addParameters(panelTransformParams, new string[] { "fcut", "m" }); break; } case "ConvolutionWithHpf(x,fcut,m,dt)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y.Take(y.Length).ToArray()); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ConwolutionWithHpf(y, args[0], args[1], dT).Skip((int)args[1]).Take(y.Length).ToArray()); double tmp = 0; addParameters(panelTransformParams, new string[] { "fcut", "m" }); break; } case "ConvolutionWithBpf(x,fcut1,fcut2,m,dt)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y.Take(y.Length).ToArray()); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ConwolutionWithBpf(y, args[0], args[1], args[2], dT) .Skip((int)args[2]) .Take(y.Length) .ToArray()); double tmp = 0; addParameters(panelTransformParams, new string[] { "fcut1", "fcut2", "m" }); break; } case "ConvolutionWithBsf(x,fcut1,fcut2,m,dt)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y.Take(y.Length).ToArray()); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.ConwolutionWithBsf(y, args[0], args[1], args[2], dT) .Skip((int)args[2]) .Take(y.Length) .ToArray()); double tmp = 0; addParameters(panelTransformParams, new string[] { "fcut1", "fcut2", "m" }); break; } case "AddRandom": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => { for (int i = 0; i < args[1]; i++) { y = Transformations.AddRandom(y, args[0]); } return(y); }); double tmp = 0; addParameters(panelTransformParams, new string[] { "A", "M" }); break; } case "AntiRandom": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); double left = Double.Parse(tbLeft.Text); double right = Double.Parse(tbRight.Text); double step = Double.Parse(tbStep.Text); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.AntiRandomFunction(left, right, step, y, args[0], args[1], args[2])); addParameters(panelTransformParams, new string[] { "A", "F", "CanalsCount" }); break; } case "AntiShift": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.AntiShifFunction(y)); addParameters(panelTransformParams, new string[] { }); break; } case "AntiSpike": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.AntiSpikeFunction(y)); addParameters(panelTransformParams, new string[] { }); break; } case "AntiTrend": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => { double [] newY = Transformations.AvgSlidingWindow(y, (int)args[0]); return(y); }); double tmp = 0; addParameters(panelTransformParams, new string[] { "width" }); break; } case "LPW": { transformX = new Func <Double[], Double[], Double[]>((y, args) => Transformations.LpfX((int)args[1])); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.Lpf(args[0], (int)args[1], args[2])); addParameters(panelTransformParams, new string[] { "fcut", "m", "dt" }); MessageBox.Show("Преобразование фурье умножьте на 2*m+1"); break; } case "HPF": { transformX = new Func <Double[], Double[], Double[]>((y, args) => Transformations.LpfX((int)args[1])); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.Hpf(args[0], (int)args[1], args[2])); addParameters(panelTransformParams, new string[] { "fcut", "m", "dt" }); MessageBox.Show("Преобразование фурье умножьте на 2*m+1"); break; } case "BPF": { transformX = new Func <Double[], Double[], Double[]>((y, args) => Transformations.LpfX((int)args[2])); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.Bpf(args[0], args[1], (int)args[2], args[3])); addParameters(panelTransformParams, new string[] { "fcut1", "fcut2", "m", "dt" }); MessageBox.Show("Преобразование фурье умножьте на 2*m+1"); break; } case "BSF": { transformX = new Func <Double[], Double[], Double[]>((y, args) => Transformations.LpfX((int)args[2])); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.Bsf(args[0], args[1], (int)args[2], args[3])); addParameters(panelTransformParams, new string[] { "fcut1", "fcut2", "m", "dt" }); MessageBox.Show("Преобразование фурье умножьте на 2*m+1"); break; } case "CombFilter(x,g,M)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.CombFilter(y, args[0], (int)args[1])); addParameters(panelTransformParams, new string[] { "g", "M" }); break; } case "UniversalCombFilter(BL,FB,FF,M)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.UniversalCombFilter(y, args[0], args[1], args[2], (int)args[3])); addParameters(panelTransformParams, new string[] { "BL", "FB", "FF", "M" }); break; } case "Multiply": { transformX = new Func <Double[], Double[], Double[]>((y, args) => y); transformY = new Func <Double[], Double[], Double[]>((y, args) => Transformations.Multiply(y, args[0])); addParameters(panelTransformParams, new string[] { "2*m+1" }); break; } case "Cut(left_cut, right_cut)": { transformX = new Func <Double[], Double[], Double[]>((y, args) => { int start = 0; int end = y.Length; double leftBorder = args[0]; double rightBorder = args[1]; Series series = chart.Series.FindByName(cbArea.Text); for (int i = 0; i < y.Length; i++) { if (y[i] > leftBorder) { start = i; break; } } for (int i = y.Length - 1; i > 0; i--) { if (y[i] < rightBorder) { end = i; break; } } startCut = start; endCut = end; return(Transformations.CutX(y, start, end)); }); transformY = new Func <Double[], Double[], Double[]>((y, args) => { return(Transformations.CutY(y, startCut, endCut)); }); addParameters(panelTransformParams, new string[] { "left_cut", "right_cut" }); break; } default: { break; } } }