我正在使用信号处理库从硬件设备收集 16384 个双精度值。我收到的 16384 个值是低通滤波器的输出。我想将样本减少 10 倍。换句话说,我想在每 10 分中保留 1 分。所以一般来说它的工作原理如下:
当低通滤波器完成时,我从我的库中得到一个缓冲区。
然后我收集了 10 个这样的缓冲区。
当所有 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
}