我有一份显示来自音频接口的原始样本的盒子清单。 根据使用案例和H/W,每个样本的长度从1到4个不等,“上游”的渠道总数可能多少是任意的。 每一样本的渠道和借方数量在操作时间都知道。
我举了一个例子,说明我的含义。 溪流有4个渠道,每个样本有2个。
List(A1、A2、B1、B2、C1、C2、D1、D2、A3、A4、B3、B4、C3、C4、D3、D4)
A2
是同一样本的第二星,等等。
我需要做的是将每一频道的样本输入自己的名单,例如:
List (List (A1, A2, A3, A4), List (B1, B2, B3, B4), List (C1, C2, C3, C4), List (D1, D2, D3, D4)
我会怎样做这件事呢? 我刚刚在几个小时前开始学习,我提出的唯一的非强制性解决办法显然不乐观:
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)
}
extrInner(samples.drop(n * bytesPerSample), Nil)
}
for(i <- 0 until numChannels) yield extractChannel(i)
}