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