提高 for 循环在抽取缓冲区时的性能

2024-01-20

我正在使用信号处理库从硬件设备收集 16384 个双精度值。我收到的 16384 个值是低通滤波器的输出。我想将样本减少 10 倍。换句话说,我想在每 10 分中保留 1 分。所以一般来说它的工作原理如下:

  1. 当低通滤波器完成时,我从我的库中得到一个缓冲区。

  2. 然后我收集了 10 个这样的缓冲区。

  3. 当所有 10 个缓冲区都收集到一个具有 10*16384 个双精度数的缓冲区时,我会循环从缓冲区中收集每 10 个双精度数。结果是一个缓冲区有 16384 个双精度数。这将被发送出去以进行其余的数据处理。

这是代码:

double[] rawData = new double[163840];
int bufferCount = 0;

private void genericReal2_ProcessData(object Sender, Mitov.SignalLab.ProcessRealNotifyArgs Args)
{
    var realbuffer = Args.InBuffer; //get the buffer of processed doubles

    var myData = realbuffer.ToArray(); //must be converted to an array since the data type is not quite an array of doubles.

    Array.Copy(myData, 0, rawData, bufferCount * 16384, 16384);

    bufferCount++;

    if (bufferCount == 10)
    {
        bufferCount = 0;

        int j = 0;

        for (int i = 0; i < 163840; i += 10) //this loop takes 20ms
        {
            realbuffer[j] = rawData[i];                   
            j++;
        }

        genericReal2.SendData(realbuffer); //send data off for further processing
    }
}

for 循环运行大约需要 20 毫秒,而其他循环大约需要 20 微秒。
那么,有什么方法可以在不使用 for 循环的情况下提高整体性能吗?

更新************************** 我已经确定循环中的所有处理时间都是通过将 realbuffer 分配给 rawData 来完成的。所以我将其更改如下:

    private void genericReal2_ProcessData(object Sender, Mitov.SignalLab.ProcessRealNotifyArgs Args)
    {
        double[] finalBuffer = new double[16384];

        var realbuffer = Args.InBuffer; //get the buffer of processed doubles

        var myData = realbuffer.ToArray(); //must be converted to an array since the data type is not quite an array of doubles.

        Array.Copy(myData, 0, rawData, bufferCount * 16384, 16384);

        bufferCount++;

        if (bufferCount == 10)
        {
            bufferCount = 0;

            int j = 0;

            for (int i = 0; i < 163840; i += 10)
            {
                finalBuffer[j] = rawData[i];
                j++;
            }

             var pointer= realbuffer.Read();
             //I can get a pointer to the realbuffer.
             //It stores 8 bytes for every double value
             how can I copy 16384 8 byte values from finalbuffer to realbuffer?


            genericReal2.SendData(realbuffer); //send data off for further processing
        }

这已经解决了。我使用的库有一个函数,它将把 double[] 中的所有值分配给它的内部实际缓冲区

 realbuffer.Equals(finalBuffer);

这需要 50us... 感谢您的所有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高 for 循环在抽取缓冲区时的性能 的相关文章