📄 cyclicre.c
字号:
/*********************************************************************
* 文件名称: CYCLICRE.c
* 主要内容:
* 完成分组码的编解码、重排及卷积码编码
* 分组码的编码重排函数:
* void GSM_CyclicReorder_Encoder(int * input,int blocks,int * output)
* 卷积码的编码函数:
* void GSM_Conv_Encoder(int * input,int blocks,int * output)
* 分组码的解编码解重排函数:
* void GSM_CyclicReorder_Decoder(int * input,int blocks,int *output,int *error)
*=====================================================================
* 版权所有 (C)2004, 东南大学 杨珏。
*
* 当前版本: 1.0.0
* 作 者: 杨珏
* 完成日期: 2004年5月22日
*=====================================================================
* 其它说明:
*=====================================================================
* 修改记录:
**********************************************************************/
#include "CYCLICRE.h"
/*********************************************************************
全局变量和静态变量
**********************************************************************/
//#define block 2
/*****************************************************
函数名:void GSM_CyclicReorder_Encoder(int * input,int blocks,int * output)
函数功能:循环码编码、添加校验循环码和尾比特以及比特重排
输入参数说明:
* input: 待编码序列,长度为[260*blocks],int 型
blocks : 待编码块数,int 型
输出参数说明:
* output:编码并重排后的序列,长度为[267*blocks],int 型
返回值:
无
其它说明
修改日期 版本号 修改人 修改内容
------------------------------------------------------
2004/05/22 V1.0.0 杨珏 创建
******************************************************/
void GSM_CyclicReorder_Encoder(int * input,int blocks,int * output)
{
int i,j;
int Ra,Rb,Rc,temp;
for(i=0;i<(blocks);i++)
{
Ra=0; Rb=0; Rc=0;//循环校验码寄存器清零
for(j=0;j<50;j++)//计算循环校验码
{
temp=(input[i*260+j]+Rc)%2;
Rc=(temp+Rb)%2;
Rb=Ra;
Ra=temp;
}
for(j=0;j<91;j++)//重排:原260位数据的[0..181]中,取偶数位放在后267位数据的[0..90]位,
//奇数位放在后267位数据的[184..94]位,校验位放在[91..93]
//填充0放在[185..188],原数据的[182..259]放在[189..266]
{
output[i*267+j]=input[i*260+j*2];
output[i*267+184-j]=input[i*260+j*2+1];
}
output[i*267+91]=Rc;
output[i*267+92]=Rb;
output[i*267+93]=Ra;
output[i*267+185]=0;
output[i*267+186]=0;
output[i*267+187]=0;
output[i*267+188]=0;
for(j=0;j<78;j++)
output[i*267+189+j]=input[i*260+182+j];
}
}
/*****************************************************
函数名:void GSM_Conv_Encoder(int * input,int blocks,int * output)
函数功能:卷积码编码
输入参数说明:
* input: 待编码序列,长度为[267*blocks],int 型
blocks : 待编码块数,int 型
输出参数说明:
* output:编码后的序列,长度为[456*blocks],int 型
返回值:
无
其它说明
修改日期 版本号 修改人 修改内容
------------------------------------------------------
2004/05/22 V1.0.0 杨珏 创建
******************************************************/
void GSM_Conv_Encoder(int * input,int blocks,int * output)
{
int i,j;
int temp[193];
for(i=0;i<(blocks);i++)
{
temp[0]=0;//卷积码编码器寄存器清零
temp[1]=0;
temp[2]=0;
temp[3]=0;
for(j=0;j<189;j++)
temp[j+4]=input[i*267+j];
for(j=0;j<189;j++)
{ //按生成多项式计算
output[i*456+j*2+1]=(temp[j+4]+temp[j+1]+temp[j])%2; //G1 = 1 + D3+ D4
output[i*456+j*2]=(temp[j+4]+temp[j+3]+temp[j+1]+temp[j])%2; //G0 = 1 + D + D3+ D4
}
for(j=0;j<78;j++) //原数据的[189..266]放在[378..455]
output[i*456+378+j]=input[i*267+189+j];
}
}
/*****************************************************
函数名:void GSM_CyclicReorder_Decoder(int * input,int blocks,int *output,int *error)
函数功能:循环码解码并解重排
输入参数说明:
* input: 待解码序列,长度为[267*blocks],int 型
blocks : 待解码块数,int 型
输出参数说明:
* output:解码并解重排后的序列,长度为[260*blocks],int 型
* error :长度为[blocks],值为1表示该语音块前50位码在传输中产生误比特,为0则表示该语音块无错误
返回值:
无
其它说明
修改日期 版本号 修改人 修改内容
------------------------------------------------------
2004/05/22 V1.0.0 杨珏 创建
******************************************************/
void GSM_CyclicReorder_Decoder(int * input,int blocks,int *output,int *error)
{
int i,j;
int Ra,Rb,Rc,temp;
for(i=0;i<blocks;i++)
{ //解重排
for(j=0;j<91;j++)
{
output[i*260+j*2]=input[i*267+j];
output[i*260+j*2+1]=input[i*267+184-j];
}
for(j=0;j<78;j++)
output[i*260+182+j]=input[i*267+189+j];
Ra=0; Rb=0; Rc=0;//计算循环校验码
for(j=0;j<50;j++)
{
temp=(output[i*260+j]+Rc)%2;
Rc=(Rb+temp)%2;
Rb=Ra;
Ra=temp;
}
if((Rc==input[i*267+91])&&(Rb==input[i*267+92])&&(Ra==input[i*267+93]))
error[i]=0;//若校验无误则输出0,反之输出1
else
error[i]=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -