using Pcie8586Probe.Models; namespace Pcie8586Probe.Acquisition; public static class SampleBlockAssembler { public static SampleBlock Concat(IEnumerable 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); } }