📄 rsdecode.c
字号:
/*-------------------------------------------------------------------------
Byte deinterleaver & RS decoder
in: input data
data_len: length of input data
Mrs: mode of RS code
Mldpc: mode of ldpc code
Mi: mode of byte interleaving
Vldpc: validity vector of ldpc decoder
Vldpc_len: length of Vldpc
out: RS decoder output
RS_error: error number of RS blcok
function:
1. bit->byte
2. byte deinterleaver
3. RS decoder
Copyrights Innofidei, Inc. Beijing. All rights reserved.
Version 0.1
Confidential, do not release this program package to anyone without permission.
Current responsible engineer: Zhang Yubing.
Supervisor of the responsible engineer: Kang Liangchuan.
When this file is modified, inform Kang Liangchuan, Shao Zhihui, Zhang Yubing, Shen Yebing.
Revision history:
2007-07-20 Created by Kang Liangchuan.
-------------------------------------------------------------------------*/
#include <string.h>
#include <malloc.h>
#include "Rx.h"
void rsdecode(unsigned char *in, int data_len, int Mrs, int Mldpc, int Mi, double *Vldpc, double Vldpc_len, unsigned char *out, int *RS_error)
{
int Hi;
int M, temp2 = 0, ldpc_K;
int i,j,k,m;
unsigned char *D1;
unsigned char temp;
unsigned char erasure_loc[240], erasure_num;
unsigned char error_num;
int RS_N,RS_K,RS_M,RS_T;
RS_N=240;
RS_M=8;
switch (Mrs)
{
case 0:
RS_K=240;
break;
case 1:
RS_K=224;
break;
case 2:
RS_K=192;
break;
case 3:
RS_K=176;
break;
}
RS_T=(RS_N-RS_K)/2;
if (Mldpc == 0)
{
Hi = 72*(1<<Mi);
ldpc_K = 4608;
}
else if (Mldpc == 1)
{
Hi = 108*(1<<Mi);
ldpc_K = 6912;
}
temp = 0;
for(j=0;j<240;j++)
{
erasure_loc[j] = 0;
}
D1 = (unsigned char *)calloc(data_len, sizeof(unsigned char));
if (Mrs == 0)
{
memcpy(out, in, data_len*sizeof(unsigned char));
}
else
{
M=data_len/(8*RS_N*Hi);
for (i=0;i<M;i++) //block
{
for (k=0;k<RS_N;k++) //row
{
for (m=0;m<Hi;m++) //column
{
D1[k+m*RS_N] = in[temp2]+2*in[temp2+1]+4*in[temp2+2]+8*in[temp2+3]+16*in[temp2+4]+32*in[temp2+5]+64*in[temp2+6]+128*in[temp2+7];
temp2+=8;
}
}
for (j=0;j<Vldpc_len/M;j++)
{
if (Vldpc[(int)(Vldpc_len/M)*i+j]==1)
{
for (k=0;k<ldpc_K/8/Hi;k++)
{
erasure_loc[temp] = 240-ldpc_K/Hi/8*j-k-1;
temp++;
}
}
}
erasure_num = temp;
if (erasure_num<=RS_N-RS_K)
{
for (k=0;k<Hi;k++)
{
error_num = rs_dec(D1+k*RS_N, erasure_loc, erasure_num, Mrs);
}
}
else
{
*RS_error = *RS_error + 1;
}
for (k=0;k<RS_K;k++)//row
{
for (m=0;m<Hi;m++)//column
{
temp = D1[m*RS_N+k];
for (j=0;j<8;j++)
{
out[m*8+k*Hi*8+j] = (temp&1);
temp = (temp>>1);
}
}
}
// D1 = D1 + N*Hi;
out = out + RS_K*Hi*8;
}
}
free(D1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -