2016-06-28 18 views
1

Ich brauche eindimensionales Array der Größe N zu zweidimensionalem Array der Größe A * B> N. uns umwandeln läßt solchen Fall nehmen:Converting 1-D-Array zu 2-D-Matrix mit überlappenden

int oneDimensionalArray[6] = {7, 8, 10, 11, 12, 15}; 
//then the second array would be 
int twoDimensionalArray[2][4] = {{7, 8, 10, 11}, 
           {10, 11, 12, 15}}; 

Dies wird in der sogenannten Overlap-Add-Methode verwendet, die in der digitalen Klangverarbeitung verwendet wird. Ich habe diesen Ansatz versucht, die falschen Ergebnisse liefert:

for(unsigned long i = 0; i < amountOfWindows; i++) 
    { 
     for(unsigned long j = hopSize; j < windowLength; j++) 
     { 
      //buffer without the overlapping 
      if((i * amountOfWindows + j) >= bufferLength) 
       break; 

      windowedBuffer[i][j] = unwindowedBuffer[i * amountOfWindows + j]; 
     } 
    } 

    for(unsigned long i = 1; i < amountOfWindows; i++) 
    { 
     for(unsigned long j = 0; j < hopSize; j++) 
     { 
      // Filling the overlapping region 
      windowedBuffer[i][j] = windowedBuffer[i-1][windowLength - hopSize + i]; 
     } 
    } 

ich auch die Beziehung habe versuche die Suche nach der Modulo-Operation verwenden, aber ich kann nicht die richtigen finden. Dies ist die eine, die ich versucht habe:

windowedBuffer[m][n % (windowLength - hopSize)] = unwindowedBuffer[n]; 
+0

Und 'j + 2 * i'? – Jarod42

+0

Was meinst du? Was ist das 2? – Kokos34

+0

Ihre Überlappung ist '2'. – Jarod42

Antwort

1

Da Sie bereits hopSize (von Ihren Kommentar) wissen, was Sie wollen, ist einfach:

for (size_t i = 0; i < amountOfWindows; ++i) { 
    for (size_t j = 0; j < windowLength; ++j) { 
     windowedBuffer[i][j] = unwindowedBuffer[i * hopSize + j]; 
    } 
} 

Wo amountOfWindows, windowLength und hopSize sind Sie Parameter (bzw. 2, 4 und 2 in Ihrem Beispiel).