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

📄 uwb.c

📁 在高斯白噪声信道中的UWB编码解码程序设计
💻 C
📖 第 1 页 / 共 2 页
字号:
   //初始化
   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 + -