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

📄 tablemlc.h

📁 Dream.exe soft source (Visual C++)
💻 H
字号:
/******************************************************************************\
 * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik
 * Copyright (c) 2001
 *
 * Author(s):
 *	Volker Fischer
 *
 * Description:
 *	Tables for MLC
 *
 ******************************************************************************
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later 
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
\******************************************************************************/

#if !defined(_TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_)
#define _TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_

#include "../GlobalDefinitions.h"


/* Definitions ****************************************************************/
/* Default number of iterations at application startup */
#define MC_NUM_ITERATIONS				1

/* Generator polynomials used for channel coding (octal form, defined by 
   a leading "0"!). We must bit-reverse the octal-forms given in the standard 
   since we shift bits from right to the left! */
/* In this implementation we shift bits from right to left, therefore the order
   of the code-words are: [..., b_(0, i), b_(1, i), b(2, i), b(3, i), ...] */
#define MC_NUM_OUTPUT_BITS_PER_STEP		4	/* MC: Multi-level Coder */
const _BYTE byGeneratorMatrix[MC_NUM_OUTPUT_BITS_PER_STEP] = {
	0155,	/* (133) x_{0, i} */
	0117,	/* (171) x_{1, i} */
	0123,	/* (145) x_{2, i} */
	0155	/* (133) x_{3, i} */
};

#define MC_CONSTRAINT_LENGTH			7

/* Since we have a periodical structure in the trellis it
   is enough to build one step. 2^(MC_CONSTRAINT_LENGTH - 1) states have
   to be considered. ("- 1": since one bit is the transition to the next 
   state) */
#define MC_NUM_STATES					(1 << (MC_CONSTRAINT_LENGTH - 1))
#define MC_NUM_OUTPUT_COMBINATIONS		(1 << MC_NUM_OUTPUT_BITS_PER_STEP)

/* Maximum number of levels (Its in case of HMmix) */
#define MC_MAX_NUM_LEVELS				6


/* Puncturing --------------------------------------------------------------- */
/* Only these types of patterns are used in DRM */
#define PP_TYPE_0000					0 /* not used, dummy */
#define PP_TYPE_1111					1
#define PP_TYPE_0111					2
#define PP_TYPE_0011					3
#define PP_TYPE_0001					4
#define PP_TYPE_0101					5

/* {a, b, c ...}: a = Number of groups, b = Number of "1"s, c = Patterns */
const uint32_t iPuncturingPatterns[13][10] = {
/*
B0: 1
B1: 1
B2: 1
B3: 1
*/
	{1, 4,
	 PP_TYPE_1111,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1
B1: 1 1 1
B2: 1 1 1
B3: 1 0 0
*/
	{3, 10,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1
B1: 1
B2: 1
B3: 0
*/
	{1, 3,
	 PP_TYPE_0111,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1
B1: 1 1 1 1
B2: 1 1 1 0
B3: 0 0 0 0
*/
	{4, 11,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1
B1: 1
B2: 0
B3: 0
*/
	{1, 2,
	 PP_TYPE_0011,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1
B1: 1 0 1 0
B2: 0 1 0 0
B3: 0 0 0 0
*/
	{4, 7,
	 PP_TYPE_0011,
	 PP_TYPE_0101,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1
B1: 1 0 1
B2: 0 0 0
B3: 0 0 0
*/
	{3, 5,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0011,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1
B1: 1 0
B2: 0 0
B3: 0 0
*/
	{2, 3,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1 1 1 1 1
B1: 1 0 0 1 0 0 1 0
B2: 0 0 0 0 0 0 0 0
B3: 0 0 0 0 0 0 0 0
*/
	{8, 11,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0011,
	 PP_TYPE_0001},

/*
B0: 1 1 1
B1: 1 0 0
B2: 0 0 0
B3: 0 0 0
*/
	{3, 4,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1
B1: 1 0 0 0
B2: 0 0 0 0
B3: 0 0 0 0
*/
	{4, 5,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1 1 1 1
B1: 1 0 0 0 0 0 0
B2: 0 0 0 0 0 0 0
B3: 0 0 0 0 0 0 0
*/
	{7, 8,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0000},

/*
B0: 1 1 1 1 1 1 1 1
B1: 1 0 0 0 0 0 0 0
B2: 0 0 0 0 0 0 0 0
B3: 0 0 0 0 0 0 0 0
*/
	{8, 9,
	 PP_TYPE_0011,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001,
	 PP_TYPE_0001}
};

/* Puncturing patterns for tailbits */
#define LENGTH_TAIL_BIT_PAT				6
const uint32_t iPunctPatTailbits[12][LENGTH_TAIL_BIT_PAT] = {
/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 0 0 0 0 0 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 0 0 0 0 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 0 0 1 0 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0011,
	 PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 0 1 0 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 0 1 1 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0011,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 0
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0011},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 0 0 0 0 0 0
*/
	{PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 1 0 0 0 0 0
*/
	{PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_0111},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 1 0 0 1 0 0
*/
	{PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_0111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_0111},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 1 1 0 1 0 0
*/
	{PP_TYPE_1111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_0111},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 1 1 0 1 0 1
*/
	{PP_TYPE_1111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_1111},

/*
B0: 1 1 1 1 1 1
B1: 1 1 1 1 1 1
B2: 1 1 1 1 1 1
B3: 1 1 1 1 0 1
*/
	{PP_TYPE_1111,
	 PP_TYPE_1111,
	 PP_TYPE_1111,
	 PP_TYPE_1111,
	 PP_TYPE_0111,
	 PP_TYPE_1111},
};


/* Code rate combinations --------------------------------------------------- */
/* row-index: protection level */
/* {a, b, c}: a = R_0, b = R_1, c = RY_Icm */
const int iCodRateCombMSC16SM[2][3] = {
	{2, 7, 3}, 
	{4, 9, 4}
};

/* {a, b, c, d}: a = R_0, b = R_1, c = R_2, d = RY_Icm */
const int iCodRateCombMSC64SM[4][4] = {
	{0,  4,  9,  4},
	{2,  7, 10, 15},
	{4,  9, 11,  8},
	{7, 10, 12, 45}
};

/* {a, b, c, d}: a = R_0, b = R_1, c = R_2, d = RY_Icm */
const int iCodRateCombMSC64HMsym[4][4] = {
	{4, 1,  6, 10},
	{5, 3,  8, 11},
	{6, 5, 11, 56},
	{7, 7, 12,  9}
};

/* {a, b, c, d, e, f, g}: a = R_0Re, b = R_0Im, c = R_1Re, d = R_1Im, 
   e = R_2Re, f = R_2Im, g = RY_Icm */
const int iCodRateCombMSC64HMmix[4][7] = {
	{4, 0, 1,  4,  6,  9,  20},
	{5, 2, 3,  7,  8, 10, 165},
	{6, 4, 5,  9, 11, 11,  56},
	{7, 7, 7, 10, 12, 12,  45}
};

/* {a, b}: a = R_0, b = R_1 */
const int iCodRateCombSDC16SM[2] = {
	2, 7
};

/* {a}: a = R_0 */
const int iCodRateCombSDC4SM = {
	4
};

/* {a}: a = R_0 */
const int iCodRateCombFDC4SM = {
	6
};


/* Interleaver sequence ----------------------------------------------------- */
/* The different coding modes in DRM use bit-interleavers in certain paths. We
   define the following vectors to store the position and type of the 
   interleaver as described in the DRM-standard

   Interleaver modules have to be initialized in the way:
   [0]: t_0 = 13;
   [1]: t_0 = 21;
   "-1": no interleaver in this level */
const int iInterlSequ4SM[MC_MAX_NUM_LEVELS] =     { 1, -1, -1, -1, -1, -1};
const int iInterlSequ16SM[MC_MAX_NUM_LEVELS] =    { 0,  1, -1, -1, -1, -1};
const int iInterlSequ64SM[MC_MAX_NUM_LEVELS] =    {-1,  0,  1, -1, -1, -1};
const int iInterlSequ64HMsym[MC_MAX_NUM_LEVELS] = {-1,  0,  1, -1, -1, -1};
const int iInterlSequ64HMmix[MC_MAX_NUM_LEVELS] = {-1, -1,  0,  0,  1,  1};


#endif // !defined(_TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -