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

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


Author: michael
Date: Fri Apr 10 17:00:10 2009
New Revision: 137

Log:
dont recalculate row_weight
30% faster inverse()

Modified:
   trunk/noe/ldpc.c

Modified: trunk/noe/ldpc.c
==============================================================================
--- trunk/noe/ldpc.c	Fri Apr 10 16:17:50 2009	(r136)
+++ trunk/noe/ldpc.c	Fri Apr 10 17:00:10 2009	(r137)
@@ -43,7 +43,7 @@ typedef struct LDPCContext{
 
 typedef uint8_t ELEM;
 
-int inverse(ELEM *matrix, int width, int height, int solvew){
+int inverse(ELEM *matrix, int width, int height, int solvew, unsigned int row_weight[]){
     int i, j, k, m, p;
     unsigned int logline[width+1][2];
 
@@ -52,11 +52,8 @@ int inverse(ELEM *matrix, int width, int
         j=-1;
         for(k=p; k<height; k++){
             if(matrix[i + k*width]){
-                int weight=0;
-                for(m=i; m<width; m++)
-                    weight += !!matrix[m + k*width];
-                if(weight < bestweight){
-                    bestweight=weight;
+                if(row_weight[k] < bestweight){
+                    bestweight=row_weight[k];
                     j= k;
                 }
             }
@@ -64,6 +61,7 @@ int inverse(ELEM *matrix, int width, int
             if(j>=0){
                 unsigned int inve= EXT(log)[inv(matrix[i + j*width])];
 
+                k= row_weight[j]; row_weight[j]= row_weight[p]; row_weight[p]= k;
                 k=0;
                 for(m=i; m<width; m++){
                     ELEM t= matrix[m + j*width];
@@ -82,7 +80,11 @@ int inverse(ELEM *matrix, int width, int
                         int idx= logline[0][0];
                         m=0;
                         while(idx>=0){
+                            if(!matrix[idx + k*width])
+                                row_weight[k]++;
                             matrix[idx + k*width] = sum(matrix[idx + k*width], EXT(exp)[logline[m++][1] + factor]);
+                            if(!matrix[idx + k*width])
+                                row_weight[k]--;
                             idx= logline[m][0];
                         }
                     }
@@ -186,19 +188,23 @@ int EXT(init_matrixLDPC)(LDPCContext *c,
     int nzc= c->nzc;
     int parity_len= c->parity_len;
     ELEM *inv_matrix= calloc(parity_len*parity_len*2, sizeof(ELEM));
+    unsigned int row_weight[parity_len];
+
+    memset(row_weight, 0, sizeof(row_weight));
 
     for(i=0; i<erasure_count; i++){
         x= erasure_pos[i];
         for(j=0; j<nzc; j++){
             y= c->parity_matrix[x][0][j];
             inv_matrix[i + y*2*parity_len]= EXT(exp)[c->parity_matrix[x][1][j]];
+            row_weight[y]++;
         }
     }
     for(i=0; i<parity_len; i++){
         inv_matrix[i + i*2*parity_len + parity_len]= 1;
     }
 
-    rank= inverse(inv_matrix, 2*parity_len, parity_len, erasure_count);
+    rank= inverse(inv_matrix, 2*parity_len, parity_len, erasure_count, row_weight);
     x=0;
     for(j=erasure_count-1; j>=0; j--){
         for(i=0; i<parity_len*2; i++){



More information about the Mndiff-dev mailing list