📄 viterbi_hard.cpp
字号:
#include "VITERBI_hard.h"
#include"define.h"
VITERBI_hard::VITERBI_hard()
{
}
VITERBI_hard::~VITERBI_hard()
{
}
void VITERBI_hard::encode(int G[rate][Ntap],int *indata,int *outdata,int N)
{
int i,j,k;
int *x,*sum_code;
x=new int [Ntap];
sum_code=new int [rate];
for(j=0;j<Ntap;j++)
x[j]=0;
for(i=0;i<N;i++)
{
for(j=0;j<rate;j++)
{
sum_code[j]=0;
for(k=0;k<Ntap;k++)
{
x[0]=indata[i];
sum_code[j]+=x[k]*G[j][k];
}
outdata[i*rate+j]=(sum_code[j]%2);
}
for(k=Ntap-1;k>0;k--)
x[k]=x[k-1];
}
delete [] x;
delete [] sum_code;
}
void VITERBI_hard::decode(int *coded,int *decod,int G[rate][Ntap],int Nbit)
{
int i,j,m,k,stage,order,order1,f,g;
int **x,**sum,*mod,**h,**sum0,**sum1,**state;
mod=new int [2];
x=new int *[Nstate];
for(i=0;i<Nstate;i++)
x[i]=new int [Nreg];
sum=new int *[Nbit/rate+1];
for(i=0;i<Nbit/rate+1;i++)
sum[i]=new int [Nstate];
sum0=new int *[Nbit/rate+1];
for(i=0;i<Nbit/rate+1;i++)
sum0[i]=new int [Nstate];
sum1=new int *[Nbit/rate+1];
for(i=0;i<Nbit/rate+1;i++)
sum1[i]=new int [Nstate];
h=new int *[Nbit/rate];
for(i=0;i<Nbit/rate;i++)
h[i]=new int [Nstate];
state=new int *[Nstate];
for(i=0;i<Nstate;i++)
state[i]=new int [2];
for(i=0;i<Nstate;i++)
{
m=i;
for(j=0;j<Nreg;j++)
{
x[i][j]=m%2;
m/=2;
}
}
sum[0][0]=0;
for(i=1;i<Nstate;i++)
sum[0][i]=1000;
for(stage=1;stage<Nbit/rate+1;stage++)
{
for(order=0;order<Nstate;order++)
{
state[order][0]=0;
state[order][1]=0;
order1=(int)(order/2);
for(j=0;j<rate;j++)
{
mod[0]=0;
mod[1]=0;
for(k=0;k<Nreg;k++)
{
mod[0]+=x[order1][k]*G[j][k+1];
mod[1]+=x[order1+(int)(Nstate/2)][k]*G[j][k+1];
}
mod[0]+=(order%2)*G[j][0];
mod[1]+=(order%2)*G[j][0];
state[order][0]+=abs(coded[(stage-1)*rate+j]-mod[0]%2);
state[order][1]+=abs(coded[(stage-1)*rate+j]-mod[1]%2);
}
sum0[stage][order]=sum[stage-1][order1]+state[order][0];
sum1[stage][order]=sum[stage-1][order1+(int)(Nstate/2)]+state[order][1];
if(sum0[stage][order]<sum1[stage][order])
{
sum[stage][order]=sum0[stage][order];
h[stage-1][order]=0;
}
else
{
sum[stage][order]=sum1[stage][order];
h[stage-1][order]=1;
}
}
}
for(order=0;order<Nstate;order++)
{
f=0;
for(i=0;i<Nstate;i++)
if(sum[Nbit/rate][order]>sum[Nbit/rate][i])
f++;
if(f==0)
g=order;
}
for(stage=Nbit/rate-1;stage>=0;stage--)
{
decod[stage]=g%2;
g=g/2+h[stage][g]*Nstate/2;
}
delete [] mod;
for(i=0;i<Nstate;i++)
delete x[i];
for(i=0;i<Nbit/rate+1;i++)
delete sum[i];
for(i=0;i<Nbit/rate+1;i++)
delete sum0[i];
for(i=0;i<Nbit/rate+1;i++)
delete sum1[i];
for(i=0;i<Nbit/rate;i++)
delete h[i];
for(i=0;i<Nstate;i++)
delete state[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -