2013-09-02 6 views
0

I 필터에 대한 다음과 같은 코드가 있습니다이 방법이 가장 적합합니까?

// Shift array to the left 
memmove(&Fifo[0], &Fifo[1], 12 * 4); 

// Add new value 
Fifo[12] = NewValue; 

int Result = Factor[0] * Fifo[6]; 

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]); 

내가 너무 많은 메모리를 호출 할 때마다, 성능을 향상시킬를 복사 할 필요 없다 그래서 나는이를 다시 작성할 수있는 방법이 있나요를? 순환 버퍼 및 링크 목록에 대해 생각했지만 위의 옵션이 가장 좋은 것으로 보이는 코드와 복잡성이 많이 필요합니다.

+0

원형 버퍼가 여기에 있습니다. 16과 같이 2 요소의 힘을줍니다. 따라서 인덱스를 증가시킬 때 인덱스를 래핑하는 것은 간단한 AND로 간단합니다. –

답변

1

단순히 버퍼의 시작과 같은 여분의 변수를 유지하여 순환 버퍼를 구현할 수 있습니다. 그리고 버퍼에 대한 모든 참조를 상대적으로 만듭니다 (모듈로 13 - 감사합니다, Ingo!). 그런 식으로, 변화는 그 색인을 부딪 치고 있습니다.

+0

modulo 13 :-)입니다.하지만 물론 맞습니다. –

+1

매우 느린 ARM 임베디드 CPU이기 때문에 modulo 연산이 'memmove'호출보다 코드 성능이 떨어질 수 있습니다.하지만 그렇게 될 것입니다. 둘 다 벤치마킹의 문제. – Muis