⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsdecode.c

📁 RS译码器源码
💻 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 + -