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

📄 rcs_intleav.c

📁 c语言编写的一个turbo码的程序。采用了高斯信道QPSK调制
💻 C
字号:
////////////////////////////////////////////
#include "stdio.h"                        //
#include "math.h"                         //
#include "malloc.h"                       //
#include "stdlib.h"                       //
#include "time.h"                         //

#include "parameter.h"                    //
#include "interleave.h"                   //
////////////////////////////////////////////
char decision_m(int);
short judge_cn(int);
//////////////////////////////////////////////////////
char decision_m(int a)
{  char i;
if (a>63)
i=7;
else if(a>31)
i=6;
else if (a>15)
i=5;
else if (a>7)
i=4;
else if (a>3)
i=3;
else if (a>1)
i=2;
else i=1;
return i;}

void RCS_CODE(char *a,char *b,char c)
{ int i,m,n;
  char x,lm,ln,j;
 m=G1/100*8*8+(G1/10-G1/100*10)*8+G1-G1/10*10;
 n=G2/100*8*8+(G2/10-G2/100*10)*8+G2-G2/10*10;
 lm=decision_m(m);
ln=decision_m(n);
//x=0;
 for(i=0;i<restrict_l;i++)
     regist[i]=0;
 for(i=0;i<fra_long;i++)
 {
	 for(j=0;j<restrict_l-1;j++)
	    regist[j]=regist[j+1];
          x=a[i];
	 for(j=lm-2;j>=0;j--)
	   if((m>>j&0x01)!=0)
		  x=x^regist[j];
		    regist[lm-1]=x&0x01;
			x=0;
	for(j=ln-1;j>=0;j--)
		if((n>>j&0x01)!=0)
			x=x^regist[j];
		b[3*i+c]=x; }
}
////////////////////////////////////////////////////////////////
short judge_cn(a)
{  short cn;
	if(a>16384)
    cn=15;
     else if(a>8192)
       cn=14;
        else if(a>4096)
          cn=13;
          else if(a>2048)
             cn=12;
             else if(a>1024)
              cn=11;
                else if(a>512)
                   cn=10;
                     else
                         cn=9;
					 return cn;
}


void interleaver(char *a,char *b,char c)
{ 
  int i=0,j,productn,addr;
  char lsb;
  short n,cn,lsbn=0,msbn=0,lsb_adverse;
  char *inter_c;

   if (fra_long<0 && fra_long>32768)
	   printf("交织器帧长有误");
   else
{            cn=judge_cn(fra_long);
                 n=cn-5;
(char *)inter_c=(char *) malloc (cn * sizeof(char));
   for(j=0;j<cn;j++)
      inter_c[j]=0;

// for(j=0;j<fra_long;j++)  //
//inter_idx[j]=0;           //


      while (i<fra_long)
	  {   lsb=0;
	      msbn=0;
		  for(j=0;j<5;j++)
	     lsb+=inter_c[cn-1-j]<<j;
    lsb_adverse=lsb^0x1f;
	
 //  printf("%d,%d\n",lsb_adverse,lsb);

    for(j=4;j<11;j++)
		if (n==j)
		{
			lsbn=inter_table[(j-4)*32+lsb];
			break;}
           for(j=0;j<n;j++)
			   msbn+=inter_c[j]<<(n-1-j);
		   msbn++;
		     msbn=msbn&(0x7fff>>(15-n));
			 productn=lsbn*msbn&(0x7fff>>(15-n));
            addr=(lsb_adverse<<n)+productn;
			if (addr<fra_long)
			{inter_idx[i]=addr;
			i++;}
			for(j=cn-1;j>=0;j--)
				if(inter_c[j]==0)
				{
					inter_c[j]=1;
					break;}
				else
inter_c[j]=0;}
/*
for(i=0;i<fra_long;i++)
{


//if(inter_idx[j]==i)                              检验程序
//if(inter_idx[j]==0)
	 for(j=0;j<fra_long;j++)
		 for(i=0;i<fra_long;i++)
			 if(inter_idx[i]==j)
	 printf("%d,",inter_idx[i]);
printf("\n");*/
} 

if(c==0)
{
for(j=0;j<fra_long;j++)
  b[j]=a[inter_idx[j]];}
else if (c==1)
{
	for(j=0;j<fra_long;j++)
		b[inter_idx[j]]=a[j];}
else
  printf("是否是交织还是解交织参数设置有误");

	free(inter_c);
}








void interleaver_float(float *a,float *b,char c)
{ 
  int i=0,j,productn,addr;
  char lsb;
  short n,cn,lsbn=0,msbn=0,lsb_adverse;
  char *inter_c;

   if (fra_long<0 && fra_long>32768)
	   printf("交织器帧长有误");
   else
{            cn=judge_cn(fra_long);
                 n=cn-5;
(char *)inter_c=(char *) malloc (cn * sizeof(char));
   for(j=0;j<cn;j++)
      inter_c[j]=0;

// for(j=0;j<fra_long;j++)  //
//inter_idx[j]=0;           //


      while (i<fra_long)
	  {   lsb=0;
	      msbn=0;
		  for(j=0;j<5;j++)
	     lsb+=inter_c[cn-1-j]<<j;
    lsb_adverse=lsb^0x1f;
	
 //  printf("%d,%d\n",lsb_adverse,lsb);

    for(j=4;j<11;j++)
		if (n==j)
		{
			lsbn=inter_table[(j-4)*32+lsb];
			break;}
           for(j=0;j<n;j++)
			   msbn+=inter_c[j]<<(n-1-j);
		   msbn++;
		     msbn=msbn&(0x7fff>>(15-n));
			 productn=lsbn*msbn&(0x7fff>>(15-n));
            addr=(lsb_adverse<<n)+productn;
			if (addr<fra_long)
			{inter_idx[i]=addr;
			i++;}
			for(j=cn-1;j>=0;j--)
				if(inter_c[j]==0)
				{
					inter_c[j]=1;
					break;}
				else
inter_c[j]=0;}

/*for(i=0;i<fra_long;i++)
printf("%d,",inter_idx[i]);
printf("\n");
{

for(j=0;j<fra_long;j++)
if(inter_idx[j]==i)                              检验程序
//if(inter_idx[j]==0)
	 
} */
if(c==0)
{
for(j=0;j<fra_long;j++)
	b[j]=a[inter_idx[j]];
}
else if (c==1)
{
	for(j=0;j<fra_long;j++)
		b[inter_idx[j]]=a[j];}
else
  printf("是否是交织还是解交织参数设置有误");
free(inter_c);
/*	
for(i=0;i<fra_long;i++)
printf("%f,",a[i]);
printf("\n");
for(i=0;i<fra_long;i++)
printf("%f ",b[i]);
printf("\n");
*/


}
}
























⌨️ 快捷键说明

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