SSPC-Tester/Driver/PCIE8586/Pcie8586Probe/Acquisition/SampleBlockAssembler.cs

56 lines
1.9 KiB
C#

using Pcie8586Probe.Models;
namespace Pcie8586Probe.Acquisition;
public static class SampleBlockAssembler
{
public static SampleBlock Concat(IEnumerable<SampleBlock> blocks)
{
var list = blocks.ToList();
if (list.Count == 0)
{
throw new ArgumentException("At least one block is required.", nameof(blocks));
}
var first = list[0];
var channelCount = first.ChannelCount;
var totalSamples = list.Sum(static block => block.SamplesPerChannel);
var channels = new double[channelCount][];
for (var channel = 0; channel < channelCount; channel++)
{
channels[channel] = new double[totalSamples];
var offset = 0;
foreach (var block in list)
{
if (block.ChannelCount != channelCount)
{
throw new InvalidOperationException("All sample blocks must have the same channel count.");
}
Array.Copy(block.Channels[channel], 0, channels[channel], offset, block.SamplesPerChannel);
offset += block.SamplesPerChannel;
}
}
return new SampleBlock(channels, first.SampleRateHz, first.StartSampleIndex, first.Timestamp);
}
public static SampleBlock Slice(SampleBlock block, int start, int count)
{
if (start < 0 || count < 0 || start + count > block.SamplesPerChannel)
{
throw new ArgumentOutOfRangeException(nameof(start));
}
var channels = new double[block.ChannelCount][];
for (var channel = 0; channel < block.ChannelCount; channel++)
{
channels[channel] = new double[count];
Array.Copy(block.Channels[channel], start, channels[channel], 0, count);
}
return new SampleBlock(channels, block.SampleRateHz, block.StartSampleIndex + start, block.Timestamp);
}
}