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

📄 viterbi_hard.cpp

📁 有关卷积编码的维特比算法,是硬判决的啊,希望大家
💻 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 + -