📄 turbo_encode.c
字号:
#include <std.h>
#include <log.h>
#include <mem.h>
#include <math.h>
#include "TURBO_dspokcfg.h"
#define L_total 200 /*决定交织器长度*/
#define NumOfParity 2 /*成员码*/
#define constraint 3 /*约束度*/
#define NumOfIter 3 /*迭代次数*/
#define puncture 0 /*是否删余*/
#define AWGN 1 /*AWGN信道*/
#define EbN0 2.0 /*信噪比*/
#define FadeAmp 1 /*设AWGN信道的衰落常数为1,即无衰减*/
#define RAND_MAX 32767
#define PI 3.14159 /*定义pi*/
int g[5][5]={{1,1,1,0,0},{1,0,1,0,0},{0,0,0,0,0}};
int LenOfInfo,memory,NumOfState;
float rate,sigma,L_c;
int SEG0,SEG1,SEG2,SEG3,SEG4,SEGofEstiSeq,SEG5,SEG6,SEG7,SEG8; /*定义数据堆*/
short *interleaver;
float *Y;
void display(); /*申明要调用的显示函数*/
void initial(); /*申明要调用的初始化函数*/
void ProduceInfoSeq(char *InfoSeq,int LenOfInfo); /*申明要调用的产生随机数的函数*/
void encode(char *InfoSeq, char *X); /*编码*/
Void main() /*===主函数===*/
{ int i;
char *InfoSeq,*X;
char *U;
char *EstiSeq;
float ber;
display();
initial();/*调用初始化成员函数*/
interleaver=(short *)MEM_alloc(SEG0,L_total*2,0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG0, (Arg)interleaver);/*====检验===*/
InfoSeq=(char *)MEM_alloc(SEG1,LenOfInfo,0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG1, (Arg)InfoSeq);
X=(char *)MEM_alloc(SEG2,L_total*(2+puncture),0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG2, (Arg)X);
U=(char *)MEM_alloc(SEG3,L_total*(2+puncture),0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG3, (Arg)U);
Y=(float *)MEM_alloc(SEG4,L_total*(2+puncture)*sizeof(float),0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEG4, (Arg)Y);
EstiSeq=(char *)MEM_alloc(SEGofEstiSeq,LenOfInfo,0);
LOG_printf(&log_SEG, "seg %d: ptr = %p", (Arg)SEGofEstiSeq, (Arg)EstiSeq);
ber=0.0;
srand((unsigned)time(NULL));
ProduceInfoSeq(InfoSeq,LenOfInfo);
for(i=0;i<LenOfInfo;i++)
{
LOG_printf(&log_Info, "InfoSeq[i]=%d\n", InfoSeq[i]);/*==打印产生的随机序列==*/
}
encode(InfoSeq,X);
for(i=0;i<L_total*(2+puncture);i++)
{
LOG_printf(&log_encode, "X[i]=%d\n", X[i]); /*===打印编码输出===*/
/*===打印调制输出===*/
}
return;
}
void display() /*显示函数*/
{
int i,j;
LOG_printf(&trace,"---------------------------------------\n");
LOG_printf(&trace,"====modified-log-map====\n");
LOG_printf(&trace,"framesize=%d\n",L_total);
LOG_printf(&trace,"code generator:\n");
for(i=0;i<NumOfParity;i++)
{for(j=0;j<constraint;j++)
LOG_printf(&trace," %d\n",(unsigned int)(g[i][j]));
}
if(puncture==0)
LOG_printf(&trace,"punctured,code rate=1/2\n");
else
LOG_printf(&trace,"unpunctured,code rate=1/3");
LOG_printf(&trace,"iteration number=%d\n",NumOfIter);
/*LOG_printf(&trace,"terminate errors=%d\n",Ferrlim);*/
if(AWGN==1)
LOG_printf(&trace,"AWGN channel\n");
else
LOG_printf(&trace,"Rayleign channel\n");
LOG_printf(&trace,"EbN0(dB)=%f\n",EbN0);
LOG_printf(&trace,"---------------------------------------");
return;
}
void initial() /*初始化函数*/
{
LenOfInfo=L_total-constraint+1;//信息位长度=序列总长度-约束度+1
rate=1/(2.0+puncture);//码率为1/2
memory=constraint-1;//编码存贮=约束度-1
NumOfState=pow(2,memory);
sigma = (float) sqrt (1 / ( 2 * rate*pow(10,(EbN0/10))));
L_c=2*FadeAmp*pow(10,(EbN0/10))*rate;
/*trellis();*/
}
void ProduceInfoSeq(char *InfoSeq,int LenOfInfo) /*随机序列的产生*/
{
int i;
srand( (unsigned)time( NULL ) );
for (i=0;i<LenOfInfo;i++)
InfoSeq[i]=(rand()>=(RAND_MAX+1)>>1);
}
void PreRSC(char *InfoSeq, char *TermSeq); /*预编码*/
void MakeInterleaver(short *interleaver); /*构造交织索引函数*/
void permute(char *normal, char *scramble,short *interleaver); /*交织*/
char RSC(char *Xs,char *Xp,char InState,short length); /*编码*/
void multiplex(char *Xs, char *Xp1, char *Xp2, char *X); /*复接*/
void PreRSC(char *InfoSeq, char *TermSeq) /*预编码子函数*/
{char state[5],temp;
short i,j;
for(i=0;i<memory;i++)
state[i]=0;
for(i=0;i<LenOfInfo;i++)
{
temp=InfoSeq[i];
TermSeq[i]=temp;
for(j=1;j<constraint;j++)
temp=temp^(state[j-1]&g[0][j]);
for(j=memory-1;j>0;j--)
state[j]=state[j-1];
state[0]=temp;
};
for(i=LenOfInfo;i<L_total;i++)
{
temp=0;
for(j=1;j<constraint;j++)
temp=temp^(state[j-1]&g[0][j]);
TermSeq[i]=temp;
for(j=memory-1;j>0;j--)
state[j]=state[j-1];
state[0]=0;
};
}
void MakeInterleaver(short *interleaver) /*构造交织索引子函数*/
{short i,index;
short temp;
//srand( (unsigned)time( NULL ) );
for(i=0;i<L_total;i++)
interleaver[i]=i;
for (i=0;i<L_total-1;i++)
{
index=abs((L_total-i)*rand()/(RAND_MAX+1)+i);
index=index%L_total;
temp=interleaver[index];
interleaver[index]=interleaver[i];
interleaver[i]=temp;
}
}
void permute(char *normal, char *scramble,short *interleaver) /*交织子函数*/
{
short i;
for(i=0;i<L_total;i++)
scramble[i]=normal[interleaver[i]];
}
char RSC(char *Xs,char *Xp,char InState,short length) /*编码(RSC码)*/
{char state[5],temp;
short i,j;
for(i=0;i<memory;i++)
{
state[i]=InState&1;
InState=InState>>1;
}
for(i=0;i<length;i++)
{
temp=Xs[i];
for(j=1;j<constraint;j++)
temp=temp^(state[j-1]&g[0][j]);
Xp[i]=temp&g[1][0];
for(j=1;j<constraint;j++)
Xp[i]=Xp[i]^(state[j-1]&g[1][j]);
for(j=memory-1;j>0;j--)
state[j]=state[j-1];
state[0]=temp;
}
temp=state[0];
for(i=1;i<memory;i++)
temp=temp|state[i]<<i;
return temp;
}
void multiplex(char *Xs, char *Xp1, char *Xp2, char *X) /*复接*/
{
int i,j;
if (puncture)
{
for(i=0,j=0;i<L_total;i++,j=j+3)
{
X[j]=Xs[i];
X[j+1]=Xp1[i];
X[j+2]=Xp2[i];
}
}
else
{
for(i=0,j=0;i<L_total;i++,j=j+2)
{
X[j]=Xs[i];
if (i%2==0)
X[j+1]=Xp1[i];
else
X[j+1]=Xp2[i];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -