Beispiel #1
0
        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");
                }
            }
        }
Beispiel #3
0
        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");
                }
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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));
        }
Beispiel #12
0
        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));
        }
Beispiel #16
0
        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));
        }
Beispiel #18
0
        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));
        }
Beispiel #19
0
        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;
                });
        }
Beispiel #21
0
        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);
            });
        }
Beispiel #22
0
        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);
            });
        }
Beispiel #23
0
        /// <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);
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        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
        }
Beispiel #27
0
        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;
            }
        }
Beispiel #30
0
        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));
        }
Beispiel #32
0
        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;
                });
        }