public static List <double[]> ReadFrameData(DirectoryInfo dataDir, string fileStem, TimeSpan startTime, TimeSpan maxDuration, SpectrogramZoomingConfig zoomingConfig, TimeSpan indexGenerationSegmentDuration)
        {
            TimeSpan endTime     = startTime + maxDuration;
            int      startMinute = (int)Math.Floor(startTime.TotalMinutes);
            int      endMinute   = (int)Math.Ceiling(endTime.TotalMinutes);

            int expectedDataDurationInSeconds = (int)indexGenerationSegmentDuration.TotalSeconds;
            int expectedFrameCount            = (int)Math.Round(expectedDataDurationInSeconds / zoomingConfig.SpectralFrameDuration);

            string name            = fileStem + "_" + startMinute + "min.csv";
            string csvPath         = Path.Combine(dataDir.FullName, name);
            bool   skipHeader      = true;
            bool   skipFirstColumn = true;

            List <double[]> frameData = CsvTools.ReadCSVFileOfDoubles(csvPath, skipHeader, skipFirstColumn);

            ZoomTiledSpectrograms.PadEndOfListOfFrames(frameData, expectedFrameCount);
            for (int i = startMinute + 1; i < endMinute; i++)
            {
                name    = fileStem + "_" + i + "min.csv";
                csvPath = Path.Combine(dataDir.FullName, name);

                List <double[]> data = CsvTools.ReadCSVFileOfDoubles(csvPath, skipHeader, skipFirstColumn);
                ZoomTiledSpectrograms.PadEndOfListOfFrames(data, expectedFrameCount);

                frameData.AddRange(data);
            }

            return(frameData);
        }