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

📄 gsm_cov.c

📁 基于MATLAB的GSM仿真系统 并附有直接画出性能曲线的简化程序。
💻 C
字号:
/*********************************************************************
* 文件名称: GSM_Cov.c
* 主要内容: 
* 完成软输出的卷积码的viterbi解码
* 卷积码的viterbi解码函数:
* void GSM_Cov_Decoder(float * inputSerial,int * outputSerial)
*=====================================================================
* 版权所有 (C)2004, 东南大学 林翌。
* 
* 当前版本: 1.0.0
* 作    者: 林翌
* 完成日期: 2004年5月23日
*=====================================================================
* 其它说明: 
*=====================================================================
* 修改记录:
**********************************************************************/
#include "GSM_Cov.h"
/*********************************************************************
                          全局变量和静态变量                              
**********************************************************************/
#include"GSM_Cov.h"
#define N 189

/*****************************************************
函数名:void GSM_Cov_Encoder(int * inputSerial,int inputLength,int * outputSerial)
函数功能:卷积码编码(测试)
输入参数说明:
    * inputSerial: 待编码序列,长度为[189],int 型
    inputLength : 待编码序列长度,int 型,值为189
输出参数说明:
	* outputSerial:编码后的序列,长度为[189*2],int 型
返回值:

其它说明

修改日期        版本号      修改人        修改内容
------------------------------------------------------
2004/05/23      V1.0.0       林翌           创建
******************************************************/
void GSM_Cov_Encoder(int * inputSerial,int inputLength,int * outputSerial)
{   //前期测试用
    int tempSerial[(N+4)];
	int i;
	tempSerial[0]=0;
	tempSerial[1]=0;
	tempSerial[2]=0;
	tempSerial[3]=0;
	for(i=1;i<=inputLength;i++)
	   tempSerial[i+3]=inputSerial[i-1];
	for(i=0;i<inputLength;i++)
	{
	   outputSerial[2*i]=(tempSerial[i]+tempSerial[i+1]+tempSerial[i+3]+tempSerial[i+4])%2;
       outputSerial[2*i+1]=(tempSerial[i]+tempSerial[i+1]+tempSerial[i+4])%2;
	}
}
/*****************************************************
函数名:void GSM_Cov_Decoder(int * inputSerial,int inputLength,int * outputSerial)
函数功能:卷积码解码
输入参数说明:
    * inputSerial: 待解码序列,长度为[189*2],int 型
    inputLength : 待解码序列长度,int 型,值为189*2
输出参数说明:
	* outputSerial:解码后的序列,长度为[189],int 型
返回值:

其它说明

修改日期        版本号      修改人        修改内容
------------------------------------------------------
2004/05/23      V1.0.0       林翌           创建
******************************************************/
void GSM_Cov_Decoder(float * inputSerial,int * outputSerial)
{
  int path[N+1][16];
  float pathc[N+1][16];
  int trans[16][2];
  float cost[N][4];
  float tempcost[32];
  int   tempcost1[32];
  int i,j,k;
  int r,s;
  float t;
  for(i=0;i<N;i++)
  { //计算每步的度量
    cost[i][0]=fabs(inputSerial[2*i])+fabs(inputSerial[2*i+1]);
    cost[i][1]=fabs(inputSerial[2*i])+fabs(inputSerial[2*i+1]-1);
    cost[i][2]=fabs(inputSerial[2*i]-1)+fabs(inputSerial[2*i+1]);
    cost[i][3]=fabs(inputSerial[2*i]-1)+fabs(inputSerial[2*i+1]-1);
  }
for(j=0;j<(N+1);j++)
  for(i=0;i<16;i++)
  {
    path[j][i]=0;//路径数组清零
	pathc[j][i]=0.0;//度量和数组清零
  }
  trans[0][0]=0;    trans[0][1]=3;//蝶型图状态转移定义
  trans[1][0]=2;    trans[1][1]=1;
  trans[2][0]=0;    trans[2][1]=3;
  trans[3][0]=2;    trans[3][1]=1;
  trans[4][0]=3;    trans[4][1]=0;
  trans[5][0]=1;    trans[5][1]=2;
  trans[6][0]=3;    trans[6][1]=0;
  trans[7][0]=1;    trans[7][1]=2;
  trans[8][0]=3;    trans[8][1]=0;
  trans[9][0]=1;    trans[9][1]=2;
  trans[10][0]=3;   trans[10][1]=0;
  trans[11][0]=1;   trans[11][1]=2;
  trans[12][0]=0;   trans[12][1]=3;
  trans[13][0]=2;   trans[13][1]=1;
  trans[14][0]=0;   trans[14][1]=3;
  trans[15][0]=2;   trans[15][1]=1;

  for(i=1;i<=N;i++)
  {
    for(j=0;j<32;j++)
    {
	  tempcost[j]=0.0;
	  tempcost1[j]=0;
	}
	for(j=0;j<16;j++)
	{ //计算每步的32条可能路径及其度量
	  r=trans[j][0];
	  tempcost[2*j]=pathc[i-1][j]+cost[i-1][r];
	  r=trans[j][1];
	  tempcost[2*j+1]=pathc[i-1][j]+cost[i-1][r];
	  tempcost1[2*j]=j;
	  tempcost1[2*j+1]=j;
	}
    for(j=0;j<16;j++)
	{ //筛选出16条度量和较小的路径
	  if(tempcost[j]<tempcost[j+16])
	  {
	    s=tempcost1[j];
		pathc[i][j]=tempcost[j];
		path[i][j]=s;
	  }
	  else
	  {
	    s=tempcost1[j+16];
		pathc[i][j]=tempcost[j+16];
		path[i][j]=s;
	  }
	}
  }
  s=0;
  t=pathc[N][0];
  for(k=1;k<16;k++)//比较最后的16节点的度量和,取其最小值
    if(pathc[N][k]<t)
	{
	  s=k;
	  t=pathc[N][k];
	}
  for(i=N;i>0;i--)
  { //输出对应序列
	outputSerial[i-1]=s%2;
	j=path[i][s];
	s=j;
  }
}

/*****************************************************
函数名:void GSM_Cov_ViterbiDecoder(float * inputSerial,int * outputSerial)
函数功能:卷积码解码主程序
输入参数说明:
    * inputSerial: 待解码序列,长度为[456],float 型
输出参数说明:
	* outputSerial:解码后的序列,长度为[267],int 型
返回值:

其它说明

修改日期        版本号      修改人        修改内容
------------------------------------------------------
2004/05/23      V1.0.0       林翌           创建
******************************************************/

void GSM_Cov_ViterbiDecoder(float * inputSerial,int * outputSerial1)
{ float CovInput[N*2];
  int   CovOutput[N];
  int i;
  for(i=0;i<N*2;i++)
  {
    CovInput[i]=inputSerial[i];
  } 
  GSM_Cov_Decoder(CovInput,CovOutput); //将输入序列的[0..377]解卷积码放入输出序列的[0..188]
  for(i=0;i<N;i++)
	  outputSerial1[i]=CovOutput[i];  
  for(i=N;i<(N+78);i++)                //将输入序列的[378..455]转为int型放入输出序列的[189..266]
	  if(inputSerial[i+N]>0.50000)
	     outputSerial1[i]=1;
	  else
	     outputSerial1[i]=0;	  
}

⌨️ 快捷键说明

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