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

📄 cyclicre.c

📁 基于MATLAB的GSM仿真系统 并附有直接画出性能曲线的简化程序。
💻 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 + -