Esempio n. 1
0
        public static void CompareAnswers(LinkedList <FrequencyFileName> dftAnswer, LinkedList <FrequencyFileName> fftAnswer, string outputPath)
        {
            var res = new LinkedList <CSVAnswerErrorRecord>();

            foreach (var filename in dftAnswer.Select(x => x.FileName))
            {
                var dft         = dftAnswer.Single(x => x.FileName == filename);
                var fft         = fftAnswer.Single(x => x.FileName == filename);
                var errorRecord = new CSVAnswerErrorRecord();

                errorRecord.FileName     = filename;
                errorRecord.DFTFrequency = dft.Frequency;
                errorRecord.FFTFrequency = fft.Frequency;

                if (Math.Max(dft.Frequency, fft.Frequency) == 0)
                {
                    errorRecord.Error = 0;
                }
                else
                {
                    errorRecord.Error = (Math.Abs(dft.Frequency - fft.Frequency) / Math.Max(dft.Frequency, fft.Frequency)) * 100;
                }

                res.AddLast(errorRecord);
            }

            CSVUtils.WriteCSVFile <CSVAnswerErrorRecord>(outputPath, res.OrderBy(x => x.Error));
        }
        static LinkedList <FrequencyMagnitude> DFT(string filePath, string ouputDirectoryPath)
        {
            var inputSamplesList = CSVUtils.ReadCSVFile <CSVWaveRecord>(filePath);

            if (ZeroPadDFT)
            {
                Utils.PadWithZeros(inputSamplesList);
            }
            var frequencyResolution = Utils.CalculateFrequencyResolution(inputSamplesList);
            var inputSamplesArray   = inputSamplesList.Select(x => new Complex((double)x.Volts, 0)).ToArray();

            var dftValues = FourierTransforms.DiscreteFourierTransform(inputSamplesArray);

            inputSamplesArray = null;
            var size          = dftValues.Length / 2;
            var leftHalfArray = new Complex[size];

            Array.Copy(dftValues, leftHalfArray, size);
            dftValues = null;

            var intermediateFile = Path.Combine(ouputDirectoryPath,
                                                Path.GetFileName(filePath).Replace("Wave", "DFT"));

            Utils.printOutput(leftHalfArray, frequencyResolution, intermediateFile);

            return(Utils.GetFrequencyDomain(leftHalfArray, frequencyResolution));
        }
        void ParallelProcessWaveForms(string inputDirectoryPath, string filenamePattern, string outputDirectoryPath, string answerPath, Func <string, string, LinkedList <FrequencyMagnitude> > algorithm)
        {
            var cumulativeStopWatch = new System.Diagnostics.Stopwatch();

            cumulativeStopWatch.Start();

            var lockObject     = new object();
            var result         = new LinkedList <FrequencyFileName>();
            var files          = Directory.GetFiles(inputDirectoryPath, filenamePattern);
            var filesRemaining = files.Length;

            Parallel.ForEach(files, (filePath) =>
            {
                Console.WriteLine("Processing File: " + filePath);
                var sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                //------------------------------------------------

                var frequencyDomain = algorithm(filePath, outputDirectoryPath);

                //------------------------------------------------
                var highestMagnitude = frequencyDomain.Aggregate(
                    (max, current) => (max == null || max.Magnitude < current.Magnitude) ? current : max);

                var fileName = Path.GetFileName(filePath);

                var ff = new FrequencyFileName()
                {
                    FileName  = Path.GetFileName(filePath),
                    Frequency = highestMagnitude.Frequency
                };

                lock (lockObject)
                {
                    result.AddLast(ff);

                    sw.Stop();
                    Console.WriteLine(string.Format("Processed File: {0} , Duration: {1}", fileName, sw.Elapsed));

                    filesRemaining--;
                    Console.WriteLine("Files Remaining: " + filesRemaining);
                    Console.WriteLine("Cumulative Duration: " + cumulativeStopWatch.Elapsed);
                }
            });

            cumulativeStopWatch.Stop();
            Console.WriteLine("Total Duration: " + cumulativeStopWatch.Elapsed);

            CSVUtils.WriteCSVFile <FrequencyFileName>(answerPath, result.OrderBy(x => x.Frequency));
        }
        public void Test_FFT_VS_DFT()
        {
            var csvFilePath = Path.Combine(
                TestContext.CurrentContext.TestDirectory,
                @"TestData\Wave000.csv");

            var inputSamplesList = CSVUtils.ReadCSVFile <CSVWaveRecord>(csvFilePath);
            var dftInputArray    = inputSamplesList.Select(x => new Complex((double)x.Volts, 0)).ToArray();

            Utils.PadWithZeros(inputSamplesList);
            var fftInputArray = inputSamplesList.Select(x => new Complex((double)x.Volts, 0)).ToArray();

            FourierTransforms.DiscreteFourierTransform(dftInputArray);
            FourierTransforms.FastFourierTransform(fftInputArray, 0, fftInputArray.Length);
        }
        public void Test_WaveFormIntervals()
        {
            var csvFilePath = Path.Combine(
                TestContext.CurrentContext.TestDirectory,
                @"TestData\Wave000.csv");

            var inputSamplesList = CSVUtils.ReadCSVFile <CSVWaveRecord>(csvFilePath);
            var seconds          = inputSamplesList.Select(x => x.Seconds).ToArray();

            var diffList = new LinkedList <decimal>();

            for (int i = 1; i < seconds.Length; i++)
            {
                var diff = seconds[i] - seconds[i - 1];
                diffList.AddLast(diff);
            }



            Assert.IsTrue(diffList.All(x => x >= 6E-8m && x <= 6.1E-8m));
        }