📄 gsm_cov.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 + -