通过平均

时间:2018-07-17 00:05:49

标签: c# arrays linq compression ienumerable

我有一个很大的采样波形,我想记录它的压缩版本以通过以较低速率重新采样(平均)来进行诊断。较低的汇率将始终是原始汇率的偶数除数。 例如:通过平均8个样本块将32K波形压缩为4K波形。

有没有一种简单的方法可以使用Linq / IEnumerable

1 个答案:

答案 0 :(得分:1)

不是很纯正的Linq,但这可以做到:

int divisor = 2;
int index = 0;
var cutSamples = samples
    .GroupBy(s => index++ / divisor)
    .Select(g => g.Average());

在性能方面,Linq不是您的朋友,因此速度会更快:

public static double[] CutSamples(double[] samples, int divisor)
{
    var reducedSamples = new double[samples.Length / divisor];
    int reducedIndex = 0;
    for (int i = 0; i < samples.Length; i += divisor)
    {
        double sum = 0;
        int count = 0;
        for (int j = 0; j < divisor && (i + j) < samples.Length; j++)
        {
            sum += samples[i + j];
            count++;
        }

        reducedSamples[reducedIndex++] = sum / count;
    }

    return reducedSamples;
}