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

📄 encode.cpp

📁 veterbi 编解码程序
💻 CPP
字号:
#include <stdio.h>
#include <windows.h>

#include "encode.h"
///////////////////////////////////encode//////////////////////////////////////////

static BYTE xor(BYTE a,BYTE b)//异或
{
	if(a==b)
		return 0;
	else
		return 1;
}

static BYTE BV(BYTE i)//类似于avr中的_BV()函数
{
	BYTE out=0x01;
	return (out<<i);
}

static BYTE get(BYTE i,BYTE num)//获得num比特的值
{
	return (i&BV(num))>>num;
}

static void set(PBYTE i,BYTE num,BYTE enset)
{
	if(enset)
		*i=*i|BV(num);//对num比特置位
	else
		*i=*i&(~BV(num));//对num比特复位
}

static BYTE G1(PBYTE reg)//获得G1
{
	return xor(reg[0],xor(reg[1],xor(reg[2],xor(reg[3],reg[6]))));
}

static BYTE G2(PBYTE reg)//获得G2
{
	return !(xor(reg[0],xor(reg[2],xor(reg[3],xor(reg[5],reg[6])))));
}

//inData:	7	6	5	4	3	2	1	0
//编码顺序:0	1	2	3	4	5	6	7

//outData[0]:	7	6	5	4	3	2	1	0
//				G1	G2  G1	G2	G1	G2	G1	G2
//编码结果顺序:   0	   1	   2	   3
	
//outData[1]:	7	6	5	4	3	2	1	0
//				G1	G2  G1	G2	G1	G2	G1	G2
//编码结果顺序:   4	   5	   6	   7

static void encode_byte(BYTE inData,PBYTE outData)//编码一个字节
{
	static BYTE reg[7];
	int j;
	for(j=7;j>-1;j--)
	{
		reg[0]=get(inData,j);//对0比特置位

		if(j<4)
		{
			set(&outData[1],2*j+1,G1(reg));
			set(&outData[1],2*j,G2(reg));
		}
		else
		{
			set(&outData[0],2*(j-4)+1,G1(reg));
			set(&outData[0],2*(j-4),G2(reg));
		}

		reg[6]=reg[5];//reg 移位
		reg[5]=reg[4];
		reg[4]=reg[3];
		reg[3]=reg[2];
		reg[2]=reg[1];
		reg[1]=reg[0];
	}
}

int encode(PBYTE inBuf,PBYTE outBuf,int count)//采用(2,1,7)卷积码
{
	int i;
	for(i=0;i<count;i++)
	{
		encode_byte(inBuf[i],&outBuf[2*i]);
	}
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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