56 lines
1.9 KiB
C#
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);
|
||
|
|
}
|
||
|
|
}
|