zl程序教程

您现在的位置是:首页 >  其他

当前栏目

利用c语言实现卷积码编码器示例

语言 实现 利用 示例 编码器
2023-06-13 09:15:24 时间

实现(2,1,7)卷积码编码
信息序列1001101011111100
生成序列g1=1011011;g2=1111001
初始状态全0.
以上参数可自行在main中修改。

复制代码代码如下:


/***Thisisansimpleexampleprogramofconvolutionalencoder.
  *Theinformationsequence,theregisterinitialstatesandthegenerationsequence
  *   canallbemodifiedinthemainfunction.
  */
#include<stdio.h>

#defineLEN(array,len){len=sizeof(array)/sizeof(array[0]);}//Sizeofarray

intencoder(int**gen,intn,intL,intreg[],intm,intinf[],intinf_len,intoutput[])
/*encoder(int**gen,intn,intL,intreg[],intm,intinf[],intinf_len,intoutput[])
       *Thisfunctionisaconvolutionalencoder.
       *gen    isthegenerationsequence,whichisatwo-dimensionarray,
        anditisatwo-dimensionpointer,
       *n      isthenumberofbitsouttheencoderateachclockcycle,
       *L      isfortheconstraightlength,
       *reg    isfortheshiftregisters,
       *m      isforthenumberofregisters,
       *inf    isfortheinformationsequence,
       *inf_lenisfortheinflength,
       *output isfortheoutputcode.
*/
{
 intinf_ex[inf_len+m];

 inti,j;//Index

 for(i=0;i<inf_len+m;i++)//Extendtheinformationsequencetoincludethelastmbits
 {
  if(i<inf_len)
   inf_ex[i]=inf[i];
  else
   inf_ex[i]=0;
 }
 for(i=0;i<inf_len+m;i++)//Foreachbitinextendinformation
 {
  for(j=0;j<n;j++)//Outputnbitsateachclockcycle
  {
     intout_tem=0;//Tempnumber
   if(*(gen+L*j)==1)//JudgewhetherthenextinformationbitshouldpaticipateintheModop
               out_tem+=inf_ex[i];

   intk;
   for(k=0;k<m;k++)//Foreachregisters
   {
    if(*(gen+L*j+k+1)==1)
     out_tem+=reg[k];//Modopaccordingtothegenerationsequence
   }
   out_tem%=2;//Mod2
   output[i*n+j]=out_tem;
  }

  for(j=m-1;j>0;j--)//Registershift
  {
   reg[j]=reg[j-1];
  }
  reg[0]=inf_ex[i];//Inputinformationbitsintoregister
 }

 return1;
}

main()
{
 intinf[]={1,0,0,1,1,0,1,0,1,1,1,1,1,1,0,0};//Informationsequence
 intinf_len;//Informationlength
 LEN(inf,inf_len);

 intgen[2][7]={{1,0,1,1,0,1,1},{1,1,1,1,0,0,1}};//Generationsequence
 intn;//Thenumberofbitsouttheencoderateachclockcycle
 intL;//Constraightlength
 LEN(gen,n);
 LEN(gen[0],L);
 intm=L-1;//Thenumberofshiftregisters

 intinit_s[]={0,0,0,0,0,0};//Initialstatesareallzero

 intreg[m];//Register

 inti;//Index

 for(i=0;i<m;i++)
   {
       reg[i]=init_s[i];
   }

 intoutput_len=(inf_len+m)*n;//Outputlength,everybitofinputcangeneratenbitsofoutputsequence
 intoutput[(inf_len+m)*n];//Outputsequence
 encoder(gen,n,L,reg,m,inf,inf_len,output);//Encoder

 for(i=0;i<output_len;i++)
 {
  printf("%d",output[i]);
 }
 system("pause");
}