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

michael subversion at mplayerhq.hu
Wed Apr 1 11:16:50 CEST 2009


Author: michael
Date: Wed Apr  1 11:16:50 2009
New Revision: 133

Log:
Perform gaussian elimination in 2 passes, first the lower left then the
upper right triangle, this is 30% faster in my tests.
Based on code by Yutaka Sawada | ten_fon A.T mail goo ne jp

Modified:
   trunk/noe/ldpc.c

Modified: trunk/noe/ldpc.c
==============================================================================
--- trunk/noe/ldpc.c	Sun Feb  1 14:26:10 2009	(r132)
+++ trunk/noe/ldpc.c	Wed Apr  1 11:16:50 2009	(r133)
@@ -45,11 +45,11 @@ typedef uint8_t ELEM;
 
 int inverse(ELEM *matrix, int width, int height, int solvew){
     int i, j, k, m, p;
+    unsigned int logline[width];
 
     for(p=i=0; i<solvew; i++){
         for(j=p; j<height; j++){
             if(matrix[i + j*width]){
-                unsigned int logline[width];
                 unsigned int inve= EXT(log)[inv(matrix[i + j*width])];
                 for(m=i; m<width; m++){
                     ELEM t= matrix[m + j*width];
@@ -57,8 +57,8 @@ int inverse(ELEM *matrix, int width, int
                     matrix[m + p*width]= EXT(exp)[EXT(log)[t] + inve];
                     logline[m]= EXT(log)[matrix[m + p*width]];
                 }
-                for(k=0; k<height; k++){
-                    if(matrix[i + k*width] && k!=p){
+                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]);
@@ -68,7 +68,17 @@ int inverse(ELEM *matrix, int width, int
                 break;
             }
         }
-        fprintf(stderr, "%5d/%5d\r", i, width);
+    }
+    for(i=p-1; i>0; i--){
+        for(m=i; m<width; m++)
+            logline[m]= EXT(log)[matrix[m + i*width]];
+        for(k=0; k<i; k++){
+            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]);
+            }
+        }
     }
     return p;
 }



More information about the Mndiff-dev mailing list