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