[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