2014-01-12 4 views
0

다소 쉬운 질문이 있지만 쉽게 해결할 수 없습니다. 물건은 이것과 같다, 길이가 32 인 x 신호를 가지고있다. x[32]. 그리고이 배열은 각 단계에서 실시간 신호의 값을 얻습니다. 1 단계에서 나는 [0:31] 값, 2 단계 [1:32], 3 단계 [2:33] 등의 값을 얻습니다. 중첩하려는 최종 신호를 얻으려면이 값을 추가하고 배열에 저장하십시오. 이것을 시도하는 방법은 특정 길이의 배열을 선언하는 것입니다. 150이라고 가정 해 보겠습니다. xfinal[150]. 그리고 xfinal을 채우기 위해 나는 이것을한다.중복 값을 배열에 저장하는 중

Step 1. xfinal[0:31] = x[0:31]. 
Step 2. xfinal[1:31] = xfinal[1:31] + x[0:30]. 
    xfinal[32] = x[31]; 
Step 3. xfinal[2:32] = xfinal[2:32] + x[0:30]. 
    xfinal[33] = x[31]; 

등등. 이 방법은 x_final에있는 모든 값이 32가 될 때마다 합계가 될 것입니다.

이렇게하려면 C에서 쓴 코드는 (x가 프레임이기 때문에 조금 복잡해 지므로 픽셀을 복사해야합니다. 픽셀에 의해.

void Overlapadd (float **final_X, float **all_frames_X, int add_index,int w, int h) 
{ 
    for (int i=0; i< frame_size ; i++) { // for every pixel 

     for(int j=add_index; j<add_index+32; j++){ 
      final_X[j][i] += all_frames_S[j-add_index][i]; 
     } 

    } 

    add_index++; 
} 

나는 그것을 저장할 왜이 코드의 문제는 내가 시간의 큰 기간을 실행할 때 final_X 배열을 작성하고 final_X[add_index+32]는 메모리가 갈 것이다. 이것은이다 순환 방식입니다. 끝까지 도달하면 다시 0으로 돌아갑니다. 문제는 final_X의 지점에 도달하면 add_index = 60이라고 가정 해 보겠습니다. 따라서 final_X[add_index]은 32 프레임의 합계가되지만 final_X[add_index+1]은 단 31 프레임의 일부가 될 것이며, final_X[add_index+2]은 30 프레임의 일부가 될 것입니다. 그리고이 값은 새 x 값을 추가하여 새 값을 얻는 데 도움이되므로 저에게 중요합니다.

내가 분명히했는지는 모르겠지만 아마도 도움이되기를 바라고 있습니다. 그래서 질문은 어떻게 오버랩하여 신호를 추가하고 오랜 기간 동안 벡터에 저장할 수 있는가하는 것입니다. enter image description here

+0

질문에서 이해하기 어려운 두 가지가 있습니다. 1) 설명 및 스케치에서 'final_X'를 1 차원 배열로 처리하는 동안 코드에서이 코드를 2 차원으로 사용합니다. 2) "메모리 부족"상태를 어떻게 결정하는지는 명확하지 않습니다. 할당 단계를 포함 할 수 있습니까? –

+0

나는 쉽게 따라 할 수 있도록 final_X를 1 차원 배열로 취급했습니다. x 자체는 배열이므로 final_x는 배열의 배열이되지만 원칙은 동일합니다. 메모리 부족으로 인해 나는 final_X에 대해 150 프레임을 할당하고 어떤 시점에서는 final_X [151]라고 부릅니다. – CRS

답변

0

하면 다른 위치 인덱스의 역할을 할 때, 카운터로서 기능하는 최 루프 엑스트라 변수의 비용이 모듈러 산술을 사용할 수있다. 여기

#define FINAL_X_LEN 150 

void Overlapadd(float **final_X, float **all_frames_X, int add_index) 
{ 
    for (int i = 0; i < frame_size; i++) 
     for(int j = add_index, int k = 0; k < 32; j = (j+1)%FINAL_X_LEN) 
      final_X[j][i] += all_frames_S[k][i]; 

} 

k는 반복을 계산하는 데 사용되며, j는 인덱싱있는 실제 위치입니다.

Overlapadd의 말에 add_index++;와 조심이 가장 가능성이 예상대로 작동하지 않습니다. 값은 복사에 의해 전달되므로 add_index++은 로컬 복사본 add_index 만 증가 시키므로이 변경은 호출자에게 표시되지 않습니다. 참조 기준 통과를 시뮬레이션하려면 포인터로 add_index을 전달해야합니다.

또한 코드를 체계적으로 구성하는 방법은 캐싱에 매우 친숙하지 않습니다. final_X[j][i] += ...은 가장 안쪽 루프의 반복마다 j이 변경되어 공간적 지역성이 깨지고 캐시 실패율이 높아 지므로 좋지 않습니다. 배열에서 가까운 위치에 액세스하면 캐시 적중 시간과 전반적인 프로그램 성능을 향상시킬 수 있습니다. 각 위치 j에 대한 모든 프레임을 복사하고 모든 위치에 대해 한 번에 프레임을 복사하지 않는 것이 좋습니다 (현재 수행중인 작업).

void Overlapadd(float **final_X, float **all_frames_X, int add_index) 
{ 
    for(int j = add_index, int k = 0; k < 32; j = (j+1)%FINAL_X_LEN) 
     for (int i = 0; i < frame_size; i++) 
      final_X[j][i] += all_frames_S[k][i]; 

} 
+0

나는 이것이 어떻게 작동하는지 완전히 이해할 수 있는지 모르겠다. 그러나 나는 그것을 시도 할 것이다 : D. 내가 염려하는 한 가지 점은 계속해서 추가하고 추가한다는 것입니다. 그리고 나는 단지 32 프레임만을 가지고 관심이 있습니다. 제 말은 처음부터 벡터를 통과 할 것이지만, 다시 올 때 이전 값에 더해진다는 것입니다. 예를 들어 위치 33의 첫 번째 반복은 32 프레임을 가지며 두 번째는 64 개가됩니다 (처음 32 개의 값을 유지하기 때문에) .. – CRS

+0

루프 조언을 주셔서 감사합니다. 실제로 어떤 방법으로 프레임별로 또는 각 프레임의 픽셀별로 더 빠릅니다. – CRS

+0

@CRS 그래서 랩 할 때 어떻게해야합니까? 다시 시작하려고합니다. 즉, 추가하기 전에 해당 위치에서 'final_X'를 0으로 설정 하시겠습니까? 그것이 단지 그것이면,'if' 만 있으면됩니다. –

0

나는 완전히 당신의 목표는 무엇을 이해하지 않지만, 원형 추가하기 위해, 당신은 단지 모듈과 함께 사용하여 연속 인덱스 변수가 있어야합니다 :이 경우,이 루프의 순서를 교환하는 것만 큼 간단하다 :

int x[32]; 
int xfinal[32]; 

for (int i=0; i<32; i++) // initialize xfinal with 0 
    xfinal[i] = 0; 

int iter = 100; // doing additions e.g. 100 times 

for (int i=0; i<iter; i++) 
    for (int j=0; j<32; j++) 
     xfinal[(j+i)%32] += x[j]; // index of xfinal remains inside 0-31 

또한 Overlapaddd()add_index++이 더 남아있는 효과가 없다는 것을주의!

편집 :

이 내 솔루션이 무엇이다 :

enter image description here

외부 원 xfinal이며, 내부는 X이다. 내부 원은 i이 시계 방향으로 회전하고 iter으로 실행되고 외부는 += 기본 셀을 실행합니다. 첫 번째 반복에서 내부 원은 초기화 된 외부 원으로 완전히 회전하지 않으므로 외부 원은 = 내부 원 (= 1 단계)이됩니다. 등등 ...

+0

이 경우 그냥 같은 x 100 번 추가하지 않을까요? 또는 모든 반복에서 나를 위해 X가 다릅니다. 동의합니다. add_index를 사용하여 실수를했습니다. 포인터로 선언 할 것입니다. – CRS

+0

@CRS 내 편집을 참조하십시오. – mb84

+0

이제 볼 수 있습니다. 설명 주셔서 감사하지만 100 x_final 값을 저장해야하기 때문에 여전히 도움이되지 않습니다. – CRS

0

그래, 내가 생각한 한 가지가 이것이다.

각 반복마다 프레임 33부터 x_final에 대한 좋은 값을 얻습니다. 그래서 x_final에 대한 충분한 값을 얻은 후에 그 위치 다음의 프레임을 복사하여 벡터의 시작 부분에 놓으려는 생각을했습니다. x_final의 길이가 170이라고 가정 해 봅시다. x_final[170]

int curr_pos; 

// if I reached frame 132 it means that values from 32-131 already have a 32 frame sum in them 

if(add_index == 132) // I have 100 good values of x_final already - x_final[32:131] 
{ 
    for(int j=add_index; j<add_index+32; j++){ 
     for (int i=0; i< (w*h) ; i++) { 
      x_final[add_index-132][i] = x_final[j][i]; //copy the rest at the beginning of the vector 
     } 
    } 
    curr_pos = 0; 
} 
else 
    curr_pos = add_index; 



    //Overlap add the new 32 frames 
    for(int j=curr_pos; j<curr_pos+32; j++){ 
     for (int i=0; i< (w*h) ; i++) { 
     x_final[j][i] += all_frames_S[j-curr_pos][i]; 
    } 
} 

    // prepare vector for next iteration 
    for (int i=0; i< (w*h) ; i++) { 
     x_final[curr_pos+32][i] = 0; 
    } 

이 접근법에 결함이 있습니까?

관련 문제