[MN-dev] [mndiff]: r136 - trunk/noe/ldpc.c

michael subversion at mplayerhq.hu
Fri Apr 10 16:17:50 CEST 2009


Author: michael
Date: Fri Apr 10 16:17:50 2009
New Revision: 136

Log:
25% faster inverse()

Modified:
   trunk/noe/ldpc.c

Modified: trunk/noe/ldpc.c
==============================================================================
--- trunk/noe/ldpc.c	Fri Apr 10 13:15:00 2009	(r135)
+++ trunk/noe/ldpc.c	Fri Apr 10 16:17:50 2009	(r136)
@@ -45,7 +45,7 @@ typedef uint8_t ELEM;
 
 int inverse(ELEM *matrix, int width, int height, int solvew){
     int i, j, k, m, p;
-    unsigned int logline[width];
+    unsigned int logline[width+1][2];
 
     for(p=i=0; i<solvew; i++){
         int bestweight= width+1;
@@ -63,17 +63,28 @@ int inverse(ELEM *matrix, int width, int
         }
             if(j>=0){
                 unsigned int inve= EXT(log)[inv(matrix[i + j*width])];
+
+                k=0;
                 for(m=i; m<width; m++){
                     ELEM t= matrix[m + j*width];
                     matrix[m + j*width]= matrix[m + p*width];
                     matrix[m + p*width]= EXT(exp)[EXT(log)[t] + inve];
-                    logline[m]= EXT(log)[matrix[m + p*width]];
+                    if(matrix[m + p*width]){
+                        logline[k  ][0]= m;
+                        logline[k++][1]= EXT(log)[matrix[m + p*width]];
+                    }
                 }
+                logline[k][0]= -1;
+
                 for(k=p+1; k<height; k++){ // eliminate lower left
                     if(matrix[i + k*width]){
                         unsigned int factor= EXT(log)[neg(matrix[i + k*width])];
-                        for(m=i; m<width; m++)
-                            matrix[m + k*width] = sum(matrix[m + k*width], EXT(exp)[logline[m] + factor]);
+                        int idx= logline[0][0];
+                        m=0;
+                        while(idx>=0){
+                            matrix[idx + k*width] = sum(matrix[idx + k*width], EXT(exp)[logline[m++][1] + factor]);
+                            idx= logline[m][0];
+                        }
                     }
                 }
                 p++;



More information about the Mndiff-dev mailing list