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

📄 decoder_ldpc_bpsk.cpp

📁 使用C++语言实现LDPC编码的构造与译码过程
💻 CPP
字号:
#include "decoder_ldpc_bpsk.h"
#include <iostream>
#include "mul_GF2.h"
#include <math.h> 
using namespace std;
void decoder_ldpc_bpsk(int iter_max,double sigma,int h[],int nrow[],int ncol[],int M,int N,int J,int K,int decoded[],double received[])
{
	//1-> -1,0 ->1

	
int i=0,j=0,l=0,iter=0;
/*
double *prob0=new double[N];
double *prob1=new double[N];
double *Q0=new double[N];
double *Q1=new double[N];
double *lamada=new double[N];
 int *check=new int[N];
 */
double prob0[96]={0};//new double[N];
double prob1[96]={0};//new double[N];
double Q0[96]={0};//new double[N];
double Q1[96]={0};//new double[N];
double lamada[96]={0};
 int check[96]={0};//new int[N];

       double alpha1=1;
	   double alpha2=1;
	   double alpha3=1;
	   double alpha4=1;

	   double delta1=1;
	   double delta2=1;
	   double delta3=1;

		 int biaozhi=0;

double q0[48*96]={0};//new double[M*N];
double q1[48*96]={0};//new double[M*N];
double r0[48*96]={0};//new double[M*N];
double r1[48*96]={0};//new double[M*N];
for(i=0;i<M;i++)
  for(j=0;j<N;j++)
  {
  q0[i*N+j]=0;
  q1[i*N+j]=0;
  r0[i*N+j]=0;
  r1[i*N+j]=0;  
  }

  for(j=0;j<N;j++)
  {
  Q0[j]=0;
  Q1[j]=0;
  }
///////////Step 1. 初始化:
  for(i=0;i<N;i++)
  {prob1[i]=1/(1+exp(received[i]*2*sigma));
   prob0[i]=1-prob1[i];
  }

  for(i=0;i<N;i++)
	for(j=0;j<J;j++)
		  {q0[ncol[j*N+i]*N+i]=prob0[i]; //q0(m,n)
		   q1[ncol[j*N+i]*N+i]=prob1[i];	  
		  }
////	  Step 2.水平方向(更新变量节点信息) 
		  
 for(iter=0;iter<iter_max;iter++)
 {
   for(i=0;i<M;i++)
   {
	   for(j=0;j<K;j++)
	   {double delta=1;
	    for(l=0;l<K;l++)
			if(nrow[l*M+i]!=nrow[j*M+i])
				delta=delta*(1-2*q1[i*N+nrow[l*M+i]]);	   
	    r0[i*N+nrow[j*M+i]]=0.5+0.5*delta;
	    r1[i*N+nrow[j*M+i]]=1-r0[i*N+nrow[j*M+i]];
		//if(r0(i,nrow(j,i))==0)
	   
	   }
   }



	for(i=0;i<N;i++)
   {
	   for(j=0;j<J;j++)
	   {
	   alpha1=1.0;
	   alpha2=1.0;
	   alpha3=1.0;
	 //  alpha4=1;
	       for(l=0;l<J;l++)
		   {
			   	if(ncol[l*N+i]!=ncol[j*N+i])
				{alpha1=alpha1*r0[ncol[l*N+i]*N+i];
				 alpha2=alpha2*r1[ncol[l*N+i]*N+i];
			      
				}
		   }
				alpha3=1/(prob0[i]*alpha1+prob1[i]*alpha2);
				q1[ncol[j*N+i]*N+i]=alpha3*prob1[i]*alpha2;//normalize
	           q0[ncol[j*N+i]*N+i]=alpha3*prob0[i]*alpha1;
				
				
	   }
   }
 
 ////////////////////////////////
 //////Step 3. 垂直方向(更新校验节点信息)
		

     for(i=0;i<N;i++)
	 {  delta1=1;
	    delta2=1;
	   for(j=0;j<J;j++)
	   {   delta1=delta1*r0[ncol[j*N+i]*N+i];
		   delta2=delta2*r1[ncol[j*N+i]*N+i];

	   }
	  delta3=1/(prob0[i]*delta1+prob1[i]*delta2);
	  Q0[i]=delta3*prob0[i]*delta1;
          Q1[i]=1-Q0[i];
          lamad[i]=Q1[i]/Q0[i];
	 }
  //decoded
	 for(i=0;i<N;i++)
		 decoded[i]=0;

	 for(i=0;i<N;i++)
	 { 
		 if(lamada[i]>=1)
		 {
		 decoded[i]=1;
		 }
	 	 
	 }
	 //mul_GF2(int C[],int A[],int am,int an ,int B[],int bm,int bn)
	 mul_GF2(check,h,M,N,decoded,N,1);
	 biaozhi=0;
		 for(i=0;i<M;i++)
		 {  
			 if(check[i]%2==1)
			 {
			 biaozhi=1;
			 break;
			 }
		 }
  if(biaozhi==0)
	  break;
  
 }

/*
delete []prob1;
delete []prob0;
delete []q0;
delete []q1;
delete []r0;
delete []r1;
delete []Q0;
delete []Q1;
delete []check;
*/

}

⌨️ 快捷键说明

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