我有一个字节列表,表示从音频接口读入的原始样本.根据使用情况和H/W,每个样本可以是1到4个字节长的任何地方,并且"流"中的信道总数可以或多或少是任意的.每个样本的通道数和位数在运行时都是已知的.
我举一个例子来说明我的意思.流中有四个通道,每个样本是两个字节.
List(A1, A2, B1, B2, C1, C2, D1, D2, A3, A4, B3, B4, C3, C4, D3, D4)
这A1是通道A的第一个样本的第一个A2字节,是同一个样本的第二个字节,依此类推.
我需要做的是将每个频道的样本提取到他们自己的列表中,如下所示:
List(List(A1, A2, A3, A4), List(B1, B2, B3, B4), List(C1, C2, C3, C4), List(D1, D2, D3, D4))
我将如何在惯用的Scala中执行此操作?我刚刚开始学习Scala几个小时前,我提出的唯一非必要的解决方案显然不是最理想的:
def uninterleave(samples: Array[Byte], numChannels: Int, bytesPerSample: Int) = {
val dropAmount = numChannels * bytesPerSample
def extractChannel(n: Int) = {
def extrInner(in: Seq[Byte], acc: Seq[Byte]): Seq[Byte] = {
if(in == List()) acc
else extrInner(in.drop(dropAmount), in.take(bytesPerSample) ++ acc) …Run Code Online (Sandbox Code Playgroud)