public static AudioToSonogramResult AnalyseOneRecording( FileInfo sourceRecording, Dictionary <string, string> configDict, TimeSpan localEventStart, TimeSpan localEventEnd, int minHz, int maxHz, DirectoryInfo outDirectory) { // set a threshold for determining energy distribution in call // NOTE: value of this threshold depends on whether working with decibel, energy or amplitude values const double threshold = 9.0; int resampleRate = AppConfigHelper.DefaultTargetSampleRate; if (configDict.ContainsKey(AnalysisKeys.ResampleRate)) { resampleRate = int.Parse(configDict[AnalysisKeys.ResampleRate]); } configDict[ConfigKeys.Recording.Key_RecordingCallName] = sourceRecording.FullName; configDict[ConfigKeys.Recording.Key_RecordingFileName] = sourceRecording.Name; // 1: GET RECORDING and make temporary copy // put temp audio FileSegment in same directory as the required output image. var tempAudioSegment = TempFileHelper.NewTempFile(outDirectory, "wav"); // delete the temp audio file if it already exists. if (File.Exists(tempAudioSegment.FullName)) { File.Delete(tempAudioSegment.FullName); } // This line creates a temporary version of the source file downsampled as per entry in the config file MasterAudioUtility.SegmentToWav(sourceRecording, tempAudioSegment, new AudioUtilityRequest() { TargetSampleRate = resampleRate }); // 2: Generate sonogram image files AudioToSonogramResult result = GenerateSpectrogramImages(tempAudioSegment, configDict, outDirectory); // 3: GET the SNR statistics TimeSpan eventDuration = localEventEnd - localEventStart; result.SnrStatistics = SNR.Calculate_SNR_ShortRecording(tempAudioSegment, configDict, localEventStart, eventDuration, minHz, maxHz, threshold); // 4: Delete the temp file File.Delete(tempAudioSegment.FullName); return(result); }