我正在编写一个数字滤波器,我需要保留最后的 X 值并将它们加在一起。
现在有两种可能的方法。要么我移动整个数组memmove
,以便为下一个值腾出空间,并在我的求和算法中将数组的正确索引作为硬编码值。
memmove(&Fifo[0], &Fifo[1], 12 * 4); // Shift array to the left
Result += Factor[1] * (Fifo[5] + Fifo[7]);
Result += Factor[2] * (Fifo[4] + Fifo[8]);
Result += Factor[3] * (Fifo[3] + Fifo[9]);
Result += Factor[4] * (Fifo[2] + Fifo[10]);
Result += Factor[5] * (Fifo[1] + Fifo[11]);
Result += Factor[6] * (Fifo[0] + Fifo[12]);
或者,我不复制任何内存,而是增加一个计数器,并使用模运算(如循环缓冲区)从中计算每个索引。
i++; // Increment the index
Result += Factor[1] * (Fifo[(i + 5) % 13] + Fifo[(i + 7) % 13]);
Result += Factor[2] * (Fifo[(i + 4) % 13] + Fifo[(i + 8) % 13]);
Result += Factor[3] * (Fifo[(i + 3) % 13] + Fifo[(i + 9) % 13]);
Result += Factor[4] * (Fifo[(i + 2) % 13] + Fifo[(i + 10) % 13]);
Result += Factor[5] * (Fifo[(i + 1) % 13] + Fifo[(i + 11) % 13]);
Result += Factor[6] * (Fifo[(i + 0) % 13] + Fifo[(i + 12) % 13]);
由于它是嵌入式 ARM cpu,我想知道什么会更有效。由于我假设 CPU 必须在内部至少移动一个 32 位值才能进行模运算,难道仅仅移动整个数组就与计算正确的索引一样快吗?