📄 uwb.c
字号:
//初始化
sigma[0][0][0]=1;sigma[1][0][0]=1;
H[1]=1;
for(i=0;i<RRS;i++){d[1][i]=s[1][i];}
//迭代开始
for(j=2;j<MRS-NRS+2;j++){
dj_1=0;
for(m=0;m<RRS;m++){dj_1=dj_1+d[j-1][m]*pow(2,m);}
if(dj_1==0){
for(x=0;x<((MRS-NRS)/2+1);x++){
for(y=0;y<RRS;y++){sigma[j][x][y]=sigma[j-1][x][y];}
}
D[j]=D[j-1];H[j]=j-D[j];
}
else{
max=H[0];i=0;
for(x=0;x<j-1;x++){
dx=0;
for(m=0;m<RRS;m++){dx=dx+d[x][m]*pow(2,m);}
if((max<H[x])&(dx>0)){max=H[x];i=x;}
}
di=0;
for(m=0;m<RRS;m++){di=di+d[i][m]*pow(2,m);}
y=j-1-i;
z=ialpha[dj_1-1]-ialpha[di-1];
z=(z+MRS)%MRS;
for(m=0;m<((MRS-NRS)/2+1);m++){
for(n=0;n<RRS;n++){
T_sigma[m][n]=0;
}
}//先清零
for(x=y;x<((MRS-NRS)/2+1);x++){
product_GF(alpha[z],sigma[i][x-y],T_sigma[x]);//
}
for(m=0;m<((MRS-NRS)/2+1);m++){
for(n=0;n<RRS;n++){
sigma[j][m][n]=sigma[j-1][m][n]^T_sigma[m][n];
}
}
if(D[j-1]>(j-1-i+D[i])){D[j]=D[j-1];}
else{D[j]=j-1-i+D[i];}
H[j]=j-D[j];
}
for(i=0;i<RRS;i++){d[j][i]=s[j][i];}
for(i=1;i<=D[j];i++){
product_GF(s[j-i],sigma[j][i],td);
for(k=0;k<RRS;k++){
d[j][k]=d[j][k]^td[k];
}
}
}
gamma=0;
for(i=0;i<MRS;i++){
for(j=1;j<((MRS-NRS)/2+1);j++){
product_GF(sigma[MRS-NRS+1][j],alpha[(j*i)%MRS],temp[j]);
}
td[0]=1;
for(m=1;m<RRS;m++){td[m]=0;}
for(m=1;m<((MRS-NRS)/2+1);m++){
for(n=0;n<RRS;n++){
td[n]=td[n]^temp[m][n];
}
}
m=0;
for(n=0;n<RRS;n++){
if(td[n]>0){m=1;break;}
}
if(m==0){err_p[gamma]=(MRS-i)%MRS;gamma++;}
}
//printf("错误个数gamma=%d\n",gamma);
//求错误值
for(j=0;j<gamma;j++){
for(i=0;i<RRS;i++){beta[i]=0;theta[i]=0;}
for(k=0;k<RRS;k++){
sigma[j][0][k]=sigma[MRS-NRS+1][0][k];
}
for(i=1;i<gamma;i++){
product_GF(sigma[j][i-1],alpha[err_p[j]],td);
add_GF(sigma[MRS-NRS+1][i],td,sigma[j][i]);
}
for(i=0;i<gamma;i++){
product_GF(sigma[j][i],s[gamma-i],td);
add_GF(beta,td,beta);
}
for(i=0;i<gamma;i++){
product_GF(sigma[j][i],alpha[err_p[j]*(gamma-i)%MRS],temp[i]);
add_GF(theta,temp[i],theta);
}
i=0;
for(m=0;m<RRS;m++){i=i+theta[m]*pow(2,m);}
k=ialpha[i-1];
product_GF(beta,alpha[(MRS-k)%MRS],Y[j]);
add_GF(Y[j],received_data_rs[err_p[j]],received_data_rs[err_p[j]]);
}
for(i=0;i<NRS;i++){
for(j=0;j<RRS;j++){decoded_data_rs[i][j]=received_data_rs[i+MRS-NRS][j];}
}
}
}
//***************************************************************************************************
void encoder_cc(int array1[],int array2[],int n){//array1为消息比特,array2为编码比特
int *p1,*p2;
int i,j;//局部变量
int reg_state[t]={0};//clear the registers
p1=array1;
p2=array2;
for(i=0;i<n;i++){
*(p2+i*RCC)=*(p1+i)^reg_state[1]^reg_state[2]^reg_state[4]^reg_state[5];//c1=b1+b3+b4+b6+b7
*(p2+i*RCC+1)=*(p1+i)^reg_state[0]^reg_state[1]^reg_state[3]^reg_state[5];//c2=b1+b2+b3+b5+b7
*(p2+i*RCC+2)=*(p1+i)^reg_state[0]^reg_state[1]^reg_state[2]^reg_state[5];//c3=b1+b2+b3+b4+b7
for(j=t-1;j>0;j--){reg_state[j]=reg_state[j-1];}//update the registers
reg_state[0]=*(p1+i);
}
}
//*****************************************************************************************************
void modem(int encoded_data_cc[],int received_data_cc[]){
int i,j,k;
int channel_data[MCC]={0};
float received_sig[MCC]={0};
int received_data_cc[MCC]={0};
for(i=0;i<MCC;i++){
if(encoded_data_cc[i]==0){channel_data[i]=-1;}//bpsk
}
//channnel and demodulation
for(i=0;i<MCC;i++){
received_sig[i]=channel_data[i]+sqrt(1/SNR)*gasdev(&idum);//加噪声
if(received_sig[i]>0.8571){received_data_cc[i]=7;}//8 level量化成软信息
else{
if(received_sig[i]>0.5714){received_data_cc[i]=6;}
else{
if(received_sig[i]>0.2857){received_data_cc[i]=5;}
else{
if(received_sig[i]>0){received_data_cc[i]=4;}
else{
if(received_sig[i]>-0.2875){received_data_cc[i]=3;}
else{
if(received_sig[i]>-0.5714){received_data_cc[i]=2;}
else{
if(received_sig[i]>-0.8571){received_data_cc[i]=1;}
else{received_data_cc[i]=0;}
}
}
}
}
}
}
}
}
//*****************************************************************************************************
void viterbi(int array1[],int array2[],int n){//array1 is received_data_cc with length of n,array2 is decoded_data_cc
int *p1,*p2;
int i,j,k,z;
int reg_state[t]={0};//指向同一个节点上下两个分支前一级节点的状态
int d[T_num][2]={0};//码字与八个状态比较的差异值
int D[T_num]={0};//节点距离寄存器的值
int min=0;//最终的最短距离
int A[T_num][2]={0};//与距离寄存器累加后的值
int path[T_num][NCC]={0};//路径寄存器,保存留存路径
int temp[T_num][NCC]={0};//路径寄存器更新后,把更新前的路径暂存于其中,备用。
int temp1[T_num][t*RCC]={0};//寄存前t级所有路径的码字
int temp2[T_num][2][RCC]={0}; //2T_num个分支码字
p1=array1;
p2=array2;
for(i=0;i<T_num;i++){//前t级留存路径初始化
j=i;
for(k=t-1;k>=0;k--){path[i][k]=j%2;j=j/2;}
}
for(i=0;i<T_num;i++){//第t级节点的差异值
//D[i]=0;
encoder_cc(path[i],temp1[i],t);//temp1返回前t级的编码码字
for(j=0;j<t*RCC;j++){
if(temp1[i][j]==1){temp1[i][j]=7;}
//else{temp[i][j]=0;}
D[i]=D[i]+abs(*(p1+j)-temp1[i][j]);//第t个节点的差异值
}
}
for(i=0;i<T_num;i++){//计算第指向第t+1级每个节点的两个分支的码字
j=i/2;//第一个分支源节点为i/2的整数,第二个分支源节点为第一个源节点加T_num/2
if(i%2==0){//相邻两个节点的前两个状态相同
for(k=0;k<t;k++){
reg_state[k]=j%2;j=j/2;
}
}
k=i%2;//节点号为偶数时发出的比特为0,奇数时为1
temp2[i][0][0]=k^reg_state[1]^reg_state[2]^reg_state[4]^0;//第一个分支的码字
if(temp2[i][0][0]==1){temp2[i][0][0]=7;}
//else{temp2[i][0][0]=0;}
temp2[i][0][1]=k^reg_state[0]^reg_state[1]^reg_state[3]^0;
if(temp2[i][0][1]==1){temp2[i][0][1]=7;}
temp2[i][0][2]=k^reg_state[0]^reg_state[1]^reg_state[2]^0;
if(temp2[i][0][2]==1){temp2[i][0][2]=7;}
temp2[i][1][0]=k^reg_state[1]^reg_state[2]^reg_state[4]^1;//第二个分支的码字
if(temp2[i][1][0]==1){temp2[i][1][0]=7;}
temp2[i][1][1]=k^reg_state[0]^reg_state[1]^reg_state[3]^1;
if(temp2[i][1][1]==1){temp2[i][1][1]=7;}
temp2[i][1][2]=k^reg_state[0]^reg_state[1]^reg_state[2]^1;
if(temp2[i][1][2]==1){temp2[i][1][2]=7;}
}
for(i=t*RCC;i<n;i=i+RCC){//从第t+1级开始涉及路径的选择和更新
//计算差异值
for(j=0;j<T_num;j++){
d[j][0]=abs(*(p1+i)-temp2[j][0][0])+abs(*(p1+i+1)-temp2[j][0][1])+abs(*(p1+i+2)-temp2[j][0][2]);
d[j][1]=abs(*(p1+i)-temp2[j][1][0])+abs(*(p1+i+1)-temp2[j][1][1])+abs(*(p1+i+2)-temp2[j][1][2]);
A[j][0]=d[j][0]+D[j/2];//与距离寄存器累加
A[j][1]=d[j][1]+D[j/2+T_num/2];
}
for(j=0;j<T_num;j++){
for(k=0;k<i/RCC;k++){temp[j][k]=path[j][k];}//节点路径移存,否则被更新后就找不到他的原来路径,下面节点路径就无法更新
if(A[j][1]>=A[j][0]){D[j]=A[j][0];//第2个分支总差异值大于第一个,保留第一个分支
for(k=0;k<i/RCC;k++){path[j][k]=temp[j/2][k];}//路径更新为第一个
}
else{D[j]=A[j][1];//保留第二个分支
for(k=0;k<i/RCC;k++){path[j][k]=path[j/2+T_num/2][k];}//路径更新为第二个
}
}
for(j=0;j<T_num;j++){//节点号为偶数时最新的路径为0,奇数时为1
if(j%2==0) path[j][i/RCC]=0;
else path[j][i/3]=1;
}
min=D[0];
for(z=1;z<T_num;z++){//搜寻最后保留的路径中的最小值及其下标
if(min>D[z]){min=D[z];k=z;}
}
}
for(i=0;i<NCC;i++){
*(p2+i)=path[k][i];//最小差异路径即为译码值
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -