public void DFTTestMethod3() { DiscreteFourierTransform DFT = new DiscreteFourierTransform(); // test case 2 List <float> Samples = new List <float> { 1, 3, 5, 7, 9, 11, 13, 15 }; DFT.InputTimeDomainSignal = new DSPAlgorithms.DataStructures.Signal(Samples, false); DFT.InputSamplingFrequency = 4; var FrequenciesAmplitudes = new List <float> { 64, 20.9050074380220f, 11.3137084989848f, 8.65913760233915f, 8, 8.65913760233915f, 11.3137084989848f, 20.9050074380220f }; var FrequenciesPhaseShifts = new List <float> { 0, 1.96349540849362f, 2.35619449019235f, 2.74889357189107f, -3.14159265358979f, -2.74889357189107f, -2.35619449019235f, -1.96349540849362f }; var Frequencies = new List <float> { 0, 1, 2, 3, 4, 5, 6, 7 }; DFT.Run(); Assert.IsTrue(UnitTestUtitlities.SignalsSamplesAreEqual(FrequenciesAmplitudes, DFT.OutputFreqDomainSignal.FrequenciesAmplitudes) && UnitTestUtitlities.SignalsPhaseShiftsAreEqual(FrequenciesPhaseShifts, DFT.OutputFreqDomainSignal.FrequenciesPhaseShifts)); }
public void NaiveTransformsRealSineCorrectly() { var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 16); // real-odd transforms to imaginary odd var dft = new DiscreteFourierTransform(); var spectrum = dft.NaiveForward(samples, FourierOptions.Matlab); // all real components must be zero foreach (var c in spectrum) { Assert.AreEqual(0, c.Real, 1e-12, "real"); } // all imaginary components except second and last musth be zero for (var i = 0; i < spectrum.Length; i++) { if (i == 1) { Assert.AreEqual(-8, spectrum[i].Imaginary, 1e-12, "imag second"); } else if (i == spectrum.Length - 1) { Assert.AreEqual(8, spectrum[i].Imaginary, 1e-12, "imag last"); } else { Assert.AreEqual(0, spectrum[i].Imaginary, 1e-12, "imag"); } } }
public void FourierNaiveIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x80, 1e-12, s => dft.NaiveForward(s, options), s => dft.NaiveInverse(s, options)); }
public void Radix2ThrowsWhenNotPowerOfTwo() { var samples = SignalGenerator.Random((u, v) => new Complex(u, v), GetUniform(1), 0x7F); var dft = new DiscreteFourierTransform(); Assert.Throws(typeof(ArgumentException), () => dft.Radix2Forward(samples, FourierOptions.Default)); Assert.Throws(typeof(ArgumentException), () => dft.Radix2Inverse(samples, FourierOptions.Default)); Assert.Throws(typeof(ArgumentException), () => DiscreteFourierTransform.Radix2(samples, -1)); Assert.Throws(typeof(ArgumentException), () => DiscreteFourierTransform.Radix2Parallel(samples, -1)); }
public BandDetector() { this.source = new AudioFileDataSource(320, null); RaisedCosineWindower raisedCosineWindower = new RaisedCosineWindower(0.97000002861022949, 25.625f, 10f); DiscreteFourierTransform discreteFourierTransform = new DiscreteFourierTransform(512, false); MelFrequencyFilterBank melFrequencyFilterBank = new MelFrequencyFilterBank(130.0, 6800.0, 40); ArrayList arrayList = new ArrayList(); arrayList.add(this.source); arrayList.add(raisedCosineWindower); arrayList.add(discreteFourierTransform); arrayList.add(melFrequencyFilterBank); this.frontend = new FrontEnd(arrayList); }
public BandDetector() { // standard frontend _source = new AudioFileDataSource(320, null); var windower = new RaisedCosineWindower(0.97f, 25.625f, 10.0f); var fft = new DiscreteFourierTransform(512, false); var filterbank = new MelFrequencyFilterBank(130.0, 6800.0, Bands); var list = new List <IDataProcessor> { _source, windower, fft, filterbank }; _frontend = new FrontEnd(list); }
public void FFT_TestMethod2() { DiscreteFourierTransform DFT = new DiscreteFourierTransform(); // test case 1 .. var sig1 = UnitTestUtitlities.LoadSignal("TestingSignals/Signal2_FFT.ds"); var expectedOutput = UnitTestUtitlities.LoadSignal("TestingSignals/Signal2_FFT_Results.ds"); DFT.InputTimeDomainSignal = sig1; DFT.InputSamplingFrequency = 360; DFT.Run(); Assert.IsTrue(UnitTestUtitlities.SignalsSamplesAreEqual(expectedOutput.FrequenciesAmplitudes, DFT.OutputFreqDomainSignal.FrequenciesAmplitudes) && UnitTestUtitlities.SignalsPhaseShiftsAreEqual(expectedOutput.FrequenciesPhaseShifts, DFT.OutputFreqDomainSignal.FrequenciesPhaseShifts)); }
public void FourierRadix2IsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), GetUniform(1), 0x8000); var work = new Complex[samples.Length]; samples.CopyTo(work, 0); dft.Radix2Forward(work, options); Assert.IsFalse(work.ListAlmostEqual(samples, 6)); dft.Radix2Inverse(work, options); AssertHelpers.ListAlmostEqual(samples, work, 12); }
private List <double[]> featureExtraction(List <double[]> sinyal) { var jumlahKanal = sinyal.Count(); var jumlahSample = sinyal.First().Length / 2; var dft = new List <double[]>(); for (int i = 0; i < jumlahKanal; i++) { dft.Add(new double[jumlahSample]); } Parallel.For(0, jumlahKanal, i => { dft[i] = new DiscreteFourierTransform().discreteFourierTransform(sinyal[i]).Take(jumlahSample).ToArray(); }); return(dft); }
public void FourierBluesteinMatchesNaiveOnRandomNonPowerOfTwo(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), _uniform, 0x7F); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void DiscreteFourierTransformTest() { DiscreteFourierTransform df = new DiscreteFourierTransform(); int i = 1; FourierTestPair[] testToDo = new FourierTestPair[] { new FourierTestPair( new double[,] { { 1.0, 1.0 }, { 1.0, 1.0 } }, new ComplexImage(new double[,] { { 0.0, 0.0 }, { 0.0, 4.0 } } )) // 2x2 ,new FourierTestPair( new double[,] { { 2.0, 2.0 }, { 1.0, 1.0 } }, new ComplexImage(new double[,] { { 0.0, 2.0 }, { 0.0, 6.0 } } )) //2x2 ,new FourierTestPair( new double[,] { { 1.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 } }, new ComplexImage(new Complex[,] { { new Complex(1.0, 0.0), new Complex(1.0, 1.7321), new Complex(1.0, - 1.7321) }, { new Complex(1.0, 1.7321), new Complex(-2.0, 3.4641), new Complex(4.0, 0) }, { new Complex(1.0, -1.7321), new Complex(4.0, 0.0), new Complex(-2.0, - 3.4641) } } )) //3x3 ,new FourierTestPair( new double[,] { { 2.0, 2.0, 2.0 }, { 1.0, 1.0, 1.0 }, { 0.0, 0.0, 0.0 } }, new ComplexImage(new Complex[,] { { new Complex(1.0, 0.0), new Complex(1.0, 1.7321), new Complex(1.0, - 1.7321) }, { new Complex(2.5, 0.8660), new Complex(1.0, 5.1962), new Complex(4.0, - 3.4641) }, { new Complex(2.5, -0.8660), new Complex(4.0, 3.4641), new Complex(1.0, - 5.1962) } } )) //3x3 ,new FourierTestPair( new double[,] { { 3.0, 3.0, 3.0, 3.0 }, { 2.0, 2.0, 2.0, 2.0 }, { 1.0, 1.0, 1.0, 1.0 }, { 0.0, 0.0, 0.0, 0.0 } }, new ComplexImage(new Complex[,] { { new Complex( 0.0, 0.0), new Complex(0.0, 0.0), new Complex(8.0, 0.0) , new Complex(0.0, 0.0)}, { new Complex( 0.0, 0.0), new Complex(0.0, 0.0), new Complex(8.0, 8.0) , new Complex(0.0, 0.0)}, { new Complex( 0.0, 0.0), new Complex(0.0, 0.0), new Complex(24.0, 0.0) , new Complex(0.0, 0.0)}, { new Complex( 0.0, 0.0), new Complex(0.0, 0.0), new Complex(8.0, -8.0) , new Complex(0.0, 0.0)}} )) //4x4 }; /* * TEMPLATE: * new FourierTestPair( new double[,] { { 1.0, 1.0 }, { 1.0, 1.0 } }, new ComplexImage(new double[,] { { 4.0, 0.0 }, { 0.0, 0.0 } } )) */ foreach (FourierTestPair test in testToDo) { TransformTestTestData(df, i, test.Item1, test.Item2); i += 1; } }
public void FourierBluesteinMatchesNaiveOnRealSineNonPowerOfTwo(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 14); VerifyMatchesNaiveComplex( samples, 12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void FourierBluesteinMatchesNaiveOnRandomPowerOfTwo([Values(FourierOptions.Default, FourierOptions.Matlab, FourierOptions.NumericalRecipes)] FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), _uniform, 0x80); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void FourierRadix2MatchesNaiveOnRealSine(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 16); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.Radix2Forward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.Radix2Inverse(s, options)); }
public void FourierRadix2MatchesNaiveOnRandom(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), _uniform, 0x80); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.Radix2Forward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.Radix2Inverse(s, options)); }
public void FourierBluesteinIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x7FFF, 1e-12, s => { dft.BluesteinForward(s, options); return s; }, s => { dft.BluesteinInverse(s, options); return s; }); }
public void FourierRadix2IsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x8000, 1e-12, s => { dft.Radix2Forward(s, options); return(s); }, s => { dft.Radix2Inverse(s, options); return(s); }); }
public void FourierBluesteinIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x7FFF, 1e-12, s => { dft.BluesteinForward(s, options); return(s); }, s => { dft.BluesteinInverse(s, options); return(s); }); }
/// <summary> /// Initiate the Series /// </summary> /// <param name="Control">Control Options for the FourierLevSet</param> protected FourierLevSetBase(FourierLevSetControl Control) { this.control = Control; this.FourierP = Control.FourierP; this.current_samplP = Control.samplP; this.numFp = FourierP.Length; this.DomainSize = Control.DomainSize; this.h_min = Control.h_min; this.mode = Control.mode; this.FourierEvolve = Control.FourierEvolve; // set up DFT invDFT_coeff = new Complex[numFp]; for (int sp = 0; sp < numFp; sp++) { invDFT_coeff[sp] = (Complex)current_samplP[sp]; } DFT = new DiscreteFourierTransform(); DFT_coeff = DFT.NaiveForward(invDFT_coeff, FourierOptions.Matlab); }
private static List <double[]> featureExtraction(List <double[]> sinyal) { Console.WriteLine("DFT"); var watch = new Stopwatch(); watch.Start(); var jumlahKanal = sinyal.Count(); var jumlahSample = sinyal.First().Length / 2; var dft = new List <double[]>(); for (int i = 0; i < jumlahKanal; i++) { dft.Add(new double[jumlahSample]); } Parallel.For(0, jumlahKanal, i => { dft[i] = new DiscreteFourierTransform().discreteFourierTransform(sinyal[i]).Take(jumlahSample).ToArray(); }); watch.Stop(); Console.WriteLine("Selesai DFT " + watch.ElapsedMilliseconds + " ms"); return(dft); }
public void TransformTest() { var r = new Random(); var t1 = new DiscreteFourierTransform(); var t2 = new FastFourierTransform(); var points = new List <Point>(); var points2 = new List <Point>(); var x = 0; points.Add(new Point(x++, 1)); points.Add(new Point(x++, 2)); points.Add(new Point(x++, 3)); points.Add(new Point(x, 1)); x = 0; points2.Add(new Point(x, 1)); points2.Add(new Point(x, 1)); points2.Add(new Point(x, 1)); points2.Add(new Point(x, 1)); points2.Add(new Point(x, 0)); points2.Add(new Point(x, 0)); points2.Add(new Point(x, 0)); points2.Add(new Point(x, 0)); var first = t1.Transform(points.ToArray()).ToList(); var second = t2.Transform(points.ToArray()).ToList(); var f2 = t1.Transform(points2.ToArray()).ToList(); var s2 = t2.Transform(points2.ToArray()).ToList(); for (int i = 0; i < first.Count; i++) { Assert.AreEqual(first[i], second[i]); } }
private void btnDFT_Click(object sender, EventArgs e) { ////signal + noise //double fs = 256; //sampling rate //double fw = 5; //signal frequency //double fn = 50; //noise frequency //double n = 5; //number of periods to show //double A = 10; //signal amplitude //double N = 1; //noise amplitude //int size = (int)(n * fs / fw); //sample size //var t = Enumerable.Range(1, size).Select(p => p * 1 / fs).ToArray(); chart1.Series[2].Points.Clear(); var yf3 = new DiscreteFourierTransform().discreteFourierTransform(yf2).Take(y.Length / 2).ToArray(); for (int i = 0; i < yf3.Length; i++) { //chart1.Series[0].Points.AddY(y[i]); chart1.Series[2].Points.AddY(yf3[i]); } //double[] yf3 = bandpassnarrow.ProcessSamples(y); //Bandpass Narrow }
public void Radix2ThrowsWhenNotPowerOfTwo() { var samples = SignalGenerator.Random((u, v) => new Complex(u, v), GetUniform(1), 0x7F); var dft = new DiscreteFourierTransform(); Assert.Throws( typeof (ArgumentException), () => dft.Radix2Forward(samples, FourierOptions.Default)); Assert.Throws( typeof (ArgumentException), () => dft.Radix2Inverse(samples, FourierOptions.Default)); Assert.Throws( typeof (ArgumentException), () => DiscreteFourierTransform.Radix2(samples, -1)); Assert.Throws( typeof (ArgumentException), () => DiscreteFourierTransform.Radix2Parallel(samples, -1)); }
public void FourierBluesteinMatchesNaiveOnRealSineNonPowerOfTwo([Values(FourierOptions.Default, FourierOptions.Matlab, FourierOptions.NumericalRecipes)] FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 14); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
private void bgProses_DoWork(object sender, DoWorkEventArgs e) { this.Invoke((MethodInvoker) delegate { tlpMain.Enabled = false; btnOpenDatasets.Enabled = false; }); _SamplingRate = (int)numSamplingRate.Value; _ChannelsChoose = tbChannels.Text.Split(',').Select(Int32.Parse).ToArray(); _TriggerTimeStart = (int)numTriggerStart.Value; _TriggerTimeStop = (int)numTriggerStop.Value; _EpocSizeTraining = (_TriggerTimeStop - _TriggerTimeStart) * _SamplingRate; _Artifact = new List <List <bool> >(); _ClassLabel = new List <List <int> >(); _Trigger = new List <List <int> >(); _Data = new List <List <double[]> >(); for (int i = 0; i < _dataPath.Count; i++) { ReadArtifactSelection(_artifactPath[i]); updateAktivitas("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Artifact Load Done"); } for (int i = 0; i < _dataPath.Count(); i++) { ReadClassLabels(_classLabelPath[i]); } for (int i = 0; i < _dataPath.Count; i++) { ReadTrigger(_triggerPath[i]); updateAktivitas("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Trigger Load Done"); } for (int i = 0; i < _dataPath.Count; i++) { ReadData(_dataPath[i]); updateAktivitas("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Data EEG Load Done"); } int countFile = _Data.Count(); _Subject = new double[countFile][][][];//subject //perStimulus //times //Channels Parallel.For(0, countFile, i => { var perData = new double[_Trigger[i].Count][][]; Parallel.For(0, _Trigger[i].Count(), j => { var startFrom = _Trigger[i][j] + (_SamplingRate * _TriggerTimeStart); var endTo = startFrom + (_SamplingRate * (_TriggerTimeStop - _TriggerTimeStart)); var newArrayTemp = new double[endTo - startFrom][]; int l = 0; for (int k = startFrom; k < endTo; k++) { newArrayTemp[l] = _Data[i][k]; l++; } var pivotArray = new double[newArrayTemp[0].Length][]; Parallel.For(0, pivotArray.Length, k => { var pivotTimes = new double[newArrayTemp.Length]; Parallel.For(0, pivotTimes.Length, m => { pivotTimes[m] = newArrayTemp[m][k]; }); pivotArray[k] = pivotTimes; }); perData[j] = pivotArray; }); _Subject[i] = perData; }); var ApplyingButterworth = new double[countFile][][][]; Parallel.For(0, ApplyingButterworth.Length, i => { var subjectRow = new double[_Subject[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[_Subject[i][j].Length][]; Parallel.For(0, channels.Length, k => { var bandpass = new DesignButterworth(Filter.BandPass, 5, 8, 30, _SamplingRate); bandpass.Input = _Subject[i][j][k]; bandpass.iirInitialization(); bandpass.compute(); channels[k] = bandpass.Output; }); subjectRow[j] = channels; }); updateAktivitas("Subject-" + i + " Butterworth Done"); ApplyingButterworth[i] = subjectRow; }); var ApplyingDFT = new double[countFile][][][]; Parallel.For(0, ApplyingDFT.Length, i => { var subjectRow = new double[ApplyingButterworth[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[ApplyingButterworth[i][j].Length][]; Parallel.For(0, channels.Length, k => { var jumlahSample = ApplyingButterworth[i][j][k].Length / 2; channels[k] = new DiscreteFourierTransform().discreteFourierTransform(ApplyingButterworth[i][j][k]).Take(jumlahSample).ToArray(); }); subjectRow[j] = channels; }); updateAktivitas("Subject-" + i + " DFT Done"); ApplyingDFT[i] = subjectRow; }); var ExtractFeature = new double[countFile][][]; Parallel.For(0, ExtractFeature.Length, i => { var subjectRow = new double[ApplyingDFT[i].Length][]; Parallel.For(0, subjectRow.Length, j => { subjectRow[j] = dftToOneRowFeature(ApplyingDFT[i][j]); }); updateAktivitas("Subject-" + i + " Extraction Feature Done"); ExtractFeature[i] = subjectRow; }); Parallel.For(0, ExtractFeature.Length, i => { for (int j = 0; j < ExtractFeature[i].Length; j++) { if (!_Artifact[i][j]) { saveFeature(ExtractFeature[i][j], Path.GetFileNameWithoutExtension(_dataPath[i]), _ClassLabel[i][j]); } } updateAktivitas("Subject-" + i + " Save Feature Done"); }); this.Invoke((MethodInvoker) delegate { tlpMain.Enabled = true; btnOpenDatasets.Enabled = true; }); if (bgProses.CancellationPending) { e.Cancel = true; return; } }
static void Main(string[] args) { opendatasets(); Console.WriteLine("Masukkan Samplingrate : "); _SamplingRate = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Channels (Contoh Input : 0,1,2,..,N (Lihat Dokumentasi Datasets)) : "); _ChannelsChoose = Array.ConvertAll(Console.ReadLine().Split(','), int.Parse); Console.WriteLine("Masukkan Times Triggers Start : "); _TriggerTimeStart = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Masukkan Times Triggers Stop : "); _TriggerTimeStop = Convert.ToInt32(Console.ReadLine()); _EpocSizeTraining = (_TriggerTimeStop - _TriggerTimeStart) * _SamplingRate; _Artifact = new List <List <bool> >(); _ClassLabel = new List <List <int> >(); _Trigger = new List <List <int> >(); _Data = new List <List <double[]> >(); for (int i = 0; i < _dataPath.Count; i++) { ReadArtifactSelection(_artifactPath[i]); Console.WriteLine("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Artifact Load Done"); } for (int i = 0; i < _dataPath.Count(); i++) { ReadClassLabels(_classLabelPath[i]); } for (int i = 0; i < _dataPath.Count; i++) { ReadTrigger(_triggerPath[i]); Console.WriteLine("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Trigger Load Done"); } for (int i = 0; i < _dataPath.Count; i++) { ReadData(_dataPath[i]); Console.WriteLine("Datasets " + Path.GetFileNameWithoutExtension(_dataPath[i]) + " List Data EEG Load Done"); } int countFile = _Data.Count(); _Subject = new double[countFile][][][];//subject //perStimulus //times //Channels Parallel.For(0, countFile, i => { var perData = new double[_Trigger[i].Count][][]; Parallel.For(0, _Trigger[i].Count(), j => { var startFrom = _Trigger[i][j] + (_SamplingRate * _TriggerTimeStart); var endTo = startFrom + (_SamplingRate * (_TriggerTimeStop - _TriggerTimeStart)); var newArrayTemp = new double[endTo - startFrom][]; int l = 0; for (int k = startFrom; k < endTo; k++) { newArrayTemp[l] = _Data[i][k]; l++; } var pivotArray = new double[newArrayTemp[0].Length][]; Parallel.For(0, pivotArray.Length, k => { var pivotTimes = new double[newArrayTemp.Length]; Parallel.For(0, pivotTimes.Length, m => { pivotTimes[m] = newArrayTemp[m][k]; }); pivotArray[k] = pivotTimes; }); perData[j] = pivotArray; }); _Subject[i] = perData; }); var ApplyingButterworth = new double[countFile][][][]; Parallel.For(0, ApplyingButterworth.Length, i => { var subjectRow = new double[_Subject[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[_Subject[i][j].Length][]; Parallel.For(0, channels.Length, k => { var bandpass = new DesignButterworth(Filter.BandPass, 5, 8, 30, _SamplingRate); bandpass.Input = _Subject[i][j][k]; bandpass.iirInitialization(); bandpass.compute(); channels[k] = bandpass.Output; }); subjectRow[j] = channels; }); Console.WriteLine("Subject-" + i + " Butterworth Done"); ApplyingButterworth[i] = subjectRow; }); var ApplyingDFT = new double[countFile][][][]; Parallel.For(0, ApplyingDFT.Length, i => { var subjectRow = new double[ApplyingButterworth[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[ApplyingButterworth[i][j].Length][]; Parallel.For(0, channels.Length, k => { var jumlahSample = ApplyingButterworth[i][j][k].Length / 2; channels[k] = new DiscreteFourierTransform().discreteFourierTransform(ApplyingButterworth[i][j][k]).Take(jumlahSample).ToArray(); }); subjectRow[j] = channels; }); Console.WriteLine("Subject-" + i + " DFT Done"); ApplyingDFT[i] = subjectRow; }); var ExtractFeature = new double[countFile][][]; Parallel.For(0, ExtractFeature.Length, i => { var subjectRow = new double[ApplyingDFT[i].Length][]; Parallel.For(0, subjectRow.Length, j => { subjectRow[j] = dftToOneRowFeature(ApplyingDFT[i][j]); }); Console.WriteLine("Subject-" + i + " Extraction Feature Done"); ExtractFeature[i] = subjectRow; }); Parallel.For(0, ExtractFeature.Length, i => { for (int j = 0; j < ExtractFeature[i].Length; j++) { if (!_Artifact[i][j]) { saveFeature(ExtractFeature[i][j], Path.GetFileNameWithoutExtension(_dataPath[i]), _ClassLabel[i][j]); } } Console.WriteLine("Subject-" + i + " Save Feature Done"); }); }
public void FourierRadix2MatchesNaiveOnRandom(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), GetUniform(1), 0x80); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.Radix2Forward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.Radix2Inverse(s, options)); }
static void Main(string[] args) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); _Artifact = new List <List <bool> >(); _ClassLabel = new List <List <int> >(); _Trigger = new List <List <int> >(); foreach (string file in Directory.EnumerateFiles("datasets", "*.HDR_ArtifactSelection")) { var contents = File.ReadLines(file); var newArtifact = new List <bool>(); foreach (var row in contents) { newArtifact.Add(Convert.ToBoolean(Convert.ToInt16(row))); } _Artifact.Add(newArtifact); } foreach (string file in Directory.EnumerateFiles("datasets", "*.HDR_Classlabel")) { var contents = File.ReadLines(file); var newLabel = new List <int>(); foreach (var row in contents) { if (row == "NaN") { newLabel.Add(5); } else { newLabel.Add(Convert.ToInt16(row)); } } _ClassLabel.Add(newLabel); } foreach (string file in Directory.EnumerateFiles("datasets", "*.HDR_TRIG")) { var contents = File.ReadLines(file); var newTrigger = new List <int>(); foreach (var row in contents) { newTrigger.Add(Convert.ToInt32(row)); } _Trigger.Add(newTrigger); } _Data = new List <List <double[]> >(); foreach (string file in Directory.EnumerateFiles("datasets", "*.data")) { var contents = File.ReadLines(file); var newData = new List <double[]>(); foreach (var row in contents) { var timesAllChannels = Array.ConvertAll(row.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries), Double.Parse); var times = new double[] { timesAllChannels[26], timesAllChannels[5], timesAllChannels[9], timesAllChannels[36] }; newData.Add(times); } _Data.Add(newData); } int countFile = _Data.Count(); _Subject = new double[countFile][][][];//subject //perStimulus //times //Channels Parallel.For(0, countFile, i => { var perData = new double[_Trigger[i].Count][][]; Parallel.For(0, _Trigger[i].Count(), j => { var startFrom = _Trigger[i][j] + (_SamplingRate * (_FixationCross + _BlankScreen)); var endTo = startFrom + (_SamplingRate * _StimulusShown); var newArrayTemp = new double[endTo - startFrom][]; int l = 0; for (int k = startFrom; k < endTo; k++) { newArrayTemp[l] = _Data[i][k]; l++; } var pivotArray = new double[newArrayTemp[0].Length][]; Parallel.For(0, pivotArray.Length, k => { var pivotTimes = new double[newArrayTemp.Length]; Parallel.For(0, pivotTimes.Length, m => { pivotTimes[m] = newArrayTemp[m][k]; }); pivotArray[k] = pivotTimes; }); perData[j] = pivotArray; }); _Subject[i] = perData; }); var ApplyingButterworth = new double[countFile][][][]; Parallel.For(0, ApplyingButterworth.Length, i => { var subjectRow = new double[_Subject[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[_Subject[i][j].Length][]; Parallel.For(0, channels.Length, k => { var bandpass = new DesignButterworth(Filter.BandPass, 5, 8, 30, _SamplingRate); bandpass.Input = _Subject[i][j][k]; bandpass.iirInitialization(); bandpass.compute(); channels[k] = bandpass.Output; }); subjectRow[j] = channels; }); Console.WriteLine("Subject-" + i + " Butterworth Done"); ApplyingButterworth[i] = subjectRow; }); var ApplyingDFT = new double[countFile][][][]; Parallel.For(0, ApplyingDFT.Length, i => { var subjectRow = new double[ApplyingButterworth[i].Length][][]; Parallel.For(0, subjectRow.Length, j => { var channels = new double[ApplyingButterworth[i][j].Length][]; Parallel.For(0, channels.Length, k => { var jumlahSample = ApplyingButterworth[i][j][k].Length / 2; channels[k] = new DiscreteFourierTransform().discreteFourierTransform(ApplyingButterworth[i][j][k]).Take(jumlahSample).ToArray(); }); subjectRow[j] = channels; }); Console.WriteLine("Subject-" + i + " DFT Done"); ApplyingDFT[i] = subjectRow; }); var ExtractFeature = new double[countFile][][]; Parallel.For(0, ExtractFeature.Length, i => { var subjectRow = new double[ApplyingDFT[i].Length][]; Parallel.For(0, subjectRow.Length, j => { subjectRow[j] = dftToOneRowFeature(ApplyingDFT[i][j]); }); Console.WriteLine("Subject-" + i + " Extraction Feature Done"); ExtractFeature[i] = subjectRow; }); Parallel.For(0, ExtractFeature.Length, i => { for (int j = 0; j < ExtractFeature[i].Length; j++) { if (!_Artifact[i][j]) { saveFeature(ExtractFeature[i][j], i, _ClassLabel[i][j] - 1); } } Console.WriteLine("Subject-" + i + " Save Feature Done"); }); Console.WriteLine(stopwatch.ElapsedMilliseconds); Console.ReadKey(); stopwatch.Stop(); }
public void FourierNaiveIsReversible([Values(FourierOptions.Default, FourierOptions.Matlab)] FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x80, 1e-12, s => dft.NaiveForward(s, options), s => dft.NaiveInverse(s, options)); }
public void FourierBluesteinMatchesNaiveOnRealSineNonPowerOfTwo(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = Sample.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 14); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void FourierRadix2IsReversible([Values(FourierOptions.Default, FourierOptions.Matlab)] FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x8000, 1e-12, s => { dft.Radix2Forward(s, options); return s; }, s => { dft.Radix2Inverse(s, options); return s; }); }