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

michael subversion at mplayerhq.hu
Fri Apr 10 20:08:58 CEST 2009


Author: michael
Date: Fri Apr 10 20:08:58 2009
New Revision: 139

Log:
Perform column pivoting to improve sparsitiy.

Modified:
   trunk/noe/ldpc.c

Modified: trunk/noe/ldpc.c
==============================================================================
--- trunk/noe/ldpc.c	Fri Apr 10 17:09:30 2009	(r138)
+++ trunk/noe/ldpc.c	Fri Apr 10 20:08:58 2009	(r139)
@@ -43,12 +43,36 @@ typedef struct LDPCContext{
 
 typedef uint8_t ELEM;
 
-int inverse(ELEM *matrix, int width, int height, int solvew, unsigned int row_weight[]){
+int inverse(ELEM *matrix, int width, int height, int solvew, unsigned int row_weight[], unsigned int col_weight[], int erasure_pos[]){
     int i, j, k, m, p;
     int logline[width+1][2];
 
     for(p=i=0; i<solvew; i++){
-        int bestweight= width+1;
+        int bestweight= height+1;
+
+        for(k=i; k<solvew; k++){
+            if(col_weight[k] < bestweight){
+                bestweight=col_weight[k];
+                j= k;
+            }
+        }
+        if(j != i){
+            for(k=0; k<height; k++){
+                int t= matrix[j + k*width ];
+                matrix[j + k*width]= matrix[i + k*width];
+                matrix[i + k*width]= t;
+            }
+
+            k= erasure_pos[j];
+            erasure_pos[j]= erasure_pos[i];
+            erasure_pos[i]= k;
+
+            k= col_weight[j];
+            col_weight[j]= col_weight[i];
+            col_weight[i]= k;
+        }
+
+        bestweight= width+1;
         j=-1;
         for(k=p; k<height; k++){
             if(matrix[i + k*width]){
@@ -80,11 +104,15 @@ int inverse(ELEM *matrix, int width, int
                         int idx= logline[0][0];
                         m=0;
                         while(idx>=0){
-                            if(!matrix[idx + k*width])
+                            if(!matrix[idx + k*width]){
                                 row_weight[k]++;
+                                col_weight[idx]++;
+                            }
                             matrix[idx + k*width] = sum(matrix[idx + k*width], EXT(exp)[logline[m++][1] + factor]);
-                            if(!matrix[idx + k*width])
+                            if(!matrix[idx + k*width]){
                                 row_weight[k]--;
+                                col_weight[idx]--;
+                            }
                             idx= logline[m][0];
                         }
                     }
@@ -189,6 +217,7 @@ int EXT(init_matrixLDPC)(LDPCContext *c,
     int parity_len= c->parity_len;
     ELEM *inv_matrix= calloc(parity_len*parity_len*2, sizeof(ELEM));
     unsigned int row_weight[parity_len];
+    unsigned int col_weight[2*parity_len];
 
     memset(row_weight, 0, sizeof(row_weight));
 
@@ -199,12 +228,13 @@ int EXT(init_matrixLDPC)(LDPCContext *c,
             inv_matrix[i + y*2*parity_len]= EXT(exp)[c->parity_matrix[x][1][j]];
             row_weight[y]++;
         }
+        col_weight[i]= nzc;
     }
     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, row_weight);
+    rank= inverse(inv_matrix, 2*parity_len, parity_len, erasure_count, row_weight, col_weight, erasure_pos);
     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