为每个文件创建不同采样率的一个时间参考
本文关键字:一个 时间 参考 采样率 文件创建 | 更新日期: 2023-09-27 18:21:08
我的程序读取多个文件,这些文件包含以不同速率采样的时间/值对。我试图使用具有最高采样率的文件作为所有采样率的时间刻度,并从最高采样率文件中输出一个具有唯一时间值的主文件。
每个文件包含时间/值对,如:
1,58
1.5,90
2154
2.5,34
这是我到目前为止的代码:
public void ReadAndWrite(string[] fileNames)
{
var stopwatch = Stopwatch.StartNew();
List<StreamReader> readers = fileNames.Select(f => new StreamReader(f)).ToList();
try
{
using (StreamWriter writer = new StreamWriter(tbxOutputFile.Text))
{
string line = null;
// For each measurement in max measurements
for (int measNum = 0; measNum < numOfRows; measNum++)
{
// For each file's reader
for (int i = 0; i < readers.Count; i++)
{
// If line contains something, then add it to line
if ((line = readers[i].ReadLine()) != null)
{
// Process line and then write it to file
line = ProcessLine(line);
writer.Write(line);
}
else
{
writer.Write("");
}
// If it's not the last column, add delimiter
if (i < readers.Count - 1)
writer.Write(",");
}
writer.WriteLine();
// Update labels
int val = ((measNum + 1) * 100) / numOfRows;
string newText = Convert.ToString("Progress: " + val + "% " + " " + "Measurement #: " + (measNum + 1)
+ " out of " + numOfRows); // running on worker thread
this.Invoke((MethodInvoker)delegate
{
// runs on UI thread
lblStatus.Text = newText;
progressBar1.Value = val;
});
}
}
}
catch (Exception)
{
throw;
}
finally
{
foreach (var reader in readers)
{
reader.Close();
}
}
MessageBox.Show("File successfully created! " + ''n' + "Elapsed time: " +
(stopwatch.ElapsedMilliseconds/1000) + " seconds", "Processing Complete");
}
我想出了下面的伪代码(currentTime是来自每个文件的时间,uniqueTime是来自每次从最高采样文件读取的数组):
// if time value from individual file is same as uniqueTime
if currentTime == uniqueTime
{
valueToWrite = curr_value // write the current value
}
else // currentTime is not same as uniqueTime
{
valueToWrite = prev_value // write the previous value
}
timeToWrite = uniqueTime // always write the uniqueTime
执行此伪代码的最佳方式是什么,以便为所有不同的采样率创建唯一的时间参考?很抱歉,如果我的问题令人困惑,如果需要,我可以详细说明。
要明确这一点,您不希望在值发生的特定时间显示值,但希望在最高采样源的每个时间点为每个源显示一个值
这应该很简单。在伪代码中:
foreach (ValuePair val in highSampleRateValues) {
var aggregatedTimePointData;
aggregatedTimePointData.Add(val.Time, val.Value);
foreach (ValuePair val2 in lowSampleRateValues) {
var value = DetermineLatestEntryBackwardFrom(val.Time);
aggregatedTimePointData.Add(value);
}
}
通过这种方式,较高密度采样信号的采样率可以作为时钟,但由于来自其他源的值非常接近,但并不完全在记录的时间点上,因此会出现不准确的情况。如果你想减少这些不准确的地方,选择更高的采样率并做同样的事情。您可以随心所欲地接近实际时间点。