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