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

📄 turbo_code_log_map.h

📁 一些关于Turbo编码译码实现所需的函数和原程序。
💻 H
字号:
/*----------------------------------------------------------
* Copyright (c) 2003, 北京邮电大学移动通信实验室
* All rights reserved.
*
* 文件名称:turbo_code_Log_MAP.h
* 文件标识:
* 摘    要:Turbo编译码头文件.
*
* 当前版本:1.0
* 作    者:张鹏
* 完成日期:2003年12月1日
----------------------------------------------------------*/

#ifndef	TRUBO_CODE_LOG_MAP_H
#define	TRUBO_CODE_LOG_MAP_H

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

/*==================================================*/
/* 仿真参数 */
#define TYPE_CHANNEL        0
#define TYPE_INTERLEAVER	2				/* 交织器类型:0-cdma2000交织器
														  1-块交织器
														  2-随机交织器 */
#define TYPE_DECODER		1				/* 译码器类型:1-LogMAP译码
														  2-MAX-LogMAP译码
														  3-SOVA译码 */
#define N_ITERATION			6				/* 译码叠代次数 */
#define TURBO_PUNCTURE		0				/* 是否打孔: 1-打孔(速率1/2)
													 2-不打孔(速率1/3) */
#define MAX_FRAME_LENGTH	1280			/* 最大帧长 */
#define SUP_FRAME_LENGTH	320				/* 补充信息帧长 */
/*==================================================*/
/* 生成阵参数 */
#define COLUMN_OF_G		4					/* 生成阵列数 */
#define G_ROW_1			13					 
#define G_ROW_2			15
#define FRAME_LENGTH	320
/*==================================================*/
/*==================================================*/

/* 定义数据结构 */

/* 生成阵结构 */
typedef struct
{
	int N_num_row;							/* 生成阵行数 */
	int K_num_col;							/* 生成阵列数 */
	int *g_matrix;							/* 生成阵首址 */
} TURBO_G;

/* Trellis结构 */
/*
mx_nextout(mx_lastout)为后(前)向输出数组首址:
行数:状态数, 列数:4
每行第一列和第三列为后(前)向的输入(1或-1),第二列和第四列为与之对应的输出(1或-1).

mx_nextstat(mx_laststat)为后(前)向状态数组首址:
行数:状态数, 列数:2
各列表示输入为1(0)时对应的后(前)向状态.
*/
typedef struct
{
	int *mx_nextout;		/* 后向输出矩阵 */						
	int *mx_nextstat;		/* 后向状态矩阵 */
	int *mx_lastout;		/* 前向输出矩阵 */
	int *mx_laststat;		/* 前向状态矩阵 */
	
} TURBO_TRELLIS;

/*==================================================*/
/* 块交织器参数 */

#define		M_BLOCK_INT		40
#define		N_BLOCK_INT		8

/*==================================================*/
/* 无穷大 */
#ifndef INFTY
#define INFTY 1E20
#endif
/*==================================================*/

/* 全局变量 */

int *index_randomintlvr;		/* 业务信息随机交织器下标 */
int *index_randomintlvr_sup;	/* 补充信息随机交织器下标 */

/* 打孔矩阵 */
int *mx_puncture_turbo_80;		/* 3*80 */
int *mx_puncture_turbo_160;		/* 3*160 */
int *mx_puncture_turbo_320;		/* 3*320 */

TURBO_G turbo_g;				/* 生成阵 */

TURBO_TRELLIS turbo_trellis;	/* Tellis结构 */	

double rate_coding;				/* 编码速率 */

double *alpha_channel;			/* Rayleigh衰落系数 */

/*==================================================*/
/*==================================================*/
/* 外部接口: */

/* Turbo码业务信息编码函数 */
void TurboCodingTraffic(int *trafficflow_source, float *coded_trafficflow_source,
						int *traffic_source_length);

/* Turbo码业务信息译码函数 */
void TurboDecodingTraffic(float *trafficflow_for_decodeA,float *trafficflow_for_decodeB,float *trafficflow_for_decodeAB, int *trafficflow_decodedAB,
						  int *trafficflow_length, float EbN0dB);

/* Turbo码补充信息编码函数 */
//void TurboCodingSupflow(int *supflow, float *coded_supflow, int *supflow_length);

/* Turbo码补充信息译码函数 */
//void TurboDecodingSupflow(float *supflow_for_decode, int *supflow_decoded,
						  //						  int *supflow_length, float EbN0dB);
						  

/* Turbo码初始化函数 */
void TurboCodingInit();

/* 释放初始化时的内存 */
void TurboCodingRelease();

/*==================================================*/
/*==================================================*/
/* 内部函数 */	/* 注释见.C文件 */
int gen_g_matrix(int k_column, int g_row1, int g_row2, int *mx_g_turbo);

void gen_trellis();

void int2bin(int intstat, int *tempstat, int length);

int bin2int(int *binseq, int length);

double random_turbo();

void gen_rand_index(int length, int type_flow);

void randominterleaver_int(int *data_unintlvr, int *interleaverddata, int length, int type_flow);

void randominterleaver_double(double *data_unintlvr, double *interleaverddata, int length, int type_flow);

void random_deinterlvr_int(int *data_unintlvr, int *interleaverddata, int length, int type_flow);

void random_deinterlvr_double(double *data_unintlvr, double *interleaverddata, int length, int type_flow);

void blockinterleaver_double(int m_blockintlvr, int n_blockintlvr, double *inputdata, double *outputdata);

void blockinterleaver_int(int m_blockintlvr, int n_blockintlvr, int *inputdata, int *outputdata);

void intlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo);

void intlvrcdma2000_double(double *data_unintlvr, double *interleaveddata, int nturbo);

void deintlvrcdma2000_double(double *data_unintlvr, double *interleaveddata, int nturbo);

void deintlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo);

void subscript(int nturbo, int *sub_2000);

int msbs(int value, int numofbits, int num_bits);

int lsbs(int value, int num_bits);

int bitreverse(int value, int num_bits);

void interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow);

void interleave_double(double *data_unintlvr, double *interleaveddata, int typeofinterleave, int nturbo, int type_flow);

void de_interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow);

void de_interleave_double(double *data_unintlvr, double *interleaveddata, int typeofinterleave, int nturbo, int type_flow);

void encoderm_turbo(int *source, int *send_turbo, int len_info, int type_flow);

void rsc_encode(int *source, int *rsc, int terminated, int len_info);

int encode_bit(int inbit, int *stat);

int gen_mx_punc();

void puncture(int *data_unpunc, int length_unpunc, int *data_punctured, 
			  int M_mx_punc, int N_mx_punc, int times_punc);

void depuncture(float *receive_punc, int length_punc, float *receive_depunced, 
				int M_mx_punc, int N_mx_punc, int times_punc);

void demultiplex(float *rec_turbo, int len_info, double *yk_turbo, int type_flow);

void Log_MAP_decoder(double *recs_turbo, double *La_turbo, int terminated, double *LLR_all_turbo, int len_total);

void MAX_Log_MAP_decoder(double *recs_turbo, double *La_turbo, int terminated, double *LLR_all_turbo, int len_total);

double get_max(double *data_seq, int length);

double E_algorithm(double x, double y);

double E_algorithm_seq(double *data_seq, int length);

void decision(double *LLR_seq, int length, int *output);

void Viterbi_decoding(float *flow_demodulated,int *flow_decoded);

int count_distance(int *start,int sysbit,int *branch);


/*==================================================*/

#endif

⌨️ 快捷键说明

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