亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? convcode.c

?? 卷積碼編碼器
?? C
字號:
//程序:卷積碼編碼、維特比硬判譯碼器
//作者:Anfysky
//日期:2004-12


#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <malloc.h>
#include <windows.h>
//extern("c");

//卷積碼參數結構體
typedef struct
{
	int *G;					//生成多項式
	int **pStateTable;		//狀態表
	int nOutc;				//輸出校驗位個數
	int nDelayNum;			//延時窗個數
}CONV_PARM;

//二維指針分配函數
void ** malloc2(int r, int l, int typesize)
{
	int i=0;
	void **p=(void **)malloc(r*typesize);
	for(i=0; i<r; i++)
		p[i]=(void *)malloc(l*typesize);
	return p;
}

//二維指針釋放函數
void free2(void **p, int r, int l)
{
	int i=0;
	for(i=0; i<r; i++)
	{
		free(p[i]);
	}
	free(p);
}

//二維指針內存清零函數
void ** memset2(void **p, char c, int r, int l)
{
	int i=0;
	for(i=0; i<r; i++)
	{
		memset(p[i],c,l);
	}
	return p;
}

//產生隨機數
int randB_vec(double* pOut, int nOut)
{
	int i=0;
	printf("Source Generating ...");
	for(i=0; i<nOut; i++)
	{
		*(pOut+i)=(rand()>(RAND_MAX/2));
	}
	printf(" Done\n");
	return i;
}

//根據當前狀態和生成多項式,產生下一個狀態
static int Gen_C_Int(int nStates, int nWindow, int G)
{
	int i=0; 
	int nAns=0;
	int nAnd=nStates&G;
	for(i=0; i<=nWindow; i++)
	{
		nAns+=nAnd%2;
		nAnd>>=1;
	}
	return nAns%2;
}

//產生狀態轉移表
static double Gen_Conv_Table(CONV_PARM* conv_parm)
{
	int nStateNumWI=1<<(conv_parm->nDelayNum+1);
	int i=0;
	int j=0;
	int nOut=0;
	for(i=0; i<nStateNumWI; i++)
	{
		//第一個數紀錄下一狀態
		conv_parm->pStateTable[i][0]=i>>1;
		//第二個數紀錄輸出
		nOut=0;
		for(j=0; j<conv_parm->nOutc; j++)
		{
			nOut<<=1;
			nOut+=Gen_C_Int(i,conv_parm->nDelayNum,conv_parm->G[j]);
		}
		conv_parm->pStateTable[i][1]=nOut;
	}
	return 0;
}

//編碼器
int Conv_Encode(double *pSrc, int nSrcLen, double *pCoded, CONV_PARM conv_parm)
{
	int nWindow=0;
	int i=0,j=0;
	printf("Conv Encoding ... ");
	for(i=0; i<nSrcLen+conv_parm.nDelayNum; i++)
	{
		if(i<nSrcLen)
			nWindow+=(int)(*(pSrc+i))<<conv_parm.nDelayNum;
		for(j=0; j<conv_parm.nOutc; j++)
		{
			*(pCoded+i*conv_parm.nOutc+j)=Gen_C_Int(nWindow,conv_parm.nDelayNum,conv_parm.G[j]);
		}
		nWindow>>=1;
	}
	printf("Done\n");
	return (nSrcLen+conv_parm.nDelayNum)*conv_parm.nOutc;
}

//比較低8位的不同數字位數
int Get_Distance_Char(int n1, int n2)
{
	int nXor=n1^n2;
	int ans=0;
	int i=0;
	for(i=0; i<8; i++)
	{
		ans+=nXor%2;
		nXor>>=1;
	}
	return ans;
}

//譯碼器
int Conv_Decode(double* pCoded, int nCodedLen, double* pDecoded, CONV_PARM conv_parm)
{
	int i=0, j=0;
	int nDecodedCounter=0;
	int nStateCounterWI=0;
	int nStateCounter=0;
	int nReceiveC=0;
	int nDistance=0;
	int nNextState=0;
	int nStateNumWI=1<<(conv_parm.nDelayNum+1);
	int nStateNum=1<<conv_parm.nDelayNum;
	int nDecodedNum=(nCodedLen/conv_parm.nOutc)+conv_parm.nDelayNum*2;
	int nRealDecodedNum=0;
	int nMinDistanceState=0;
	int nMinDistance=0;
	int nNewDistance=0;
	int nTempAddress=0;
	//定義pDecodedPath[信源點數][狀態數×3],每個點的每個狀態上記錄
	//1、距離,2、輸入,3、來自的前一狀態
	//經過比較之后選擇最短距離并放到每個點每個狀態的記錄頭部。
	//由于8bit狀態已經是非常復雜的狀態機了,所以使用2字節存儲轉移狀態是合理的。
	//所以可以這樣按位處理:第1個4字節為距離,第2個4字節的頭部1字節為輸入
	//第2個4字節的低3字節為下一個最短路徑狀態。(顯然足夠了)


	int** pDecodedPath=(int **)malloc2(nDecodedNum,nStateNum*2,sizeof(int));
	//為了節省內存,定義pTempDecodedStates[狀態數×4],
	//存放生成的下一個狀態的兩個路徑。
	int* pTempDecodedStates=(int *)malloc(nStateNum*4*sizeof(int));

	printf("Conv Decoding .");

	memset2(pDecodedPath,-1,nDecodedNum,nStateNum*2*sizeof(int));

	//將第一個點的前6個值賦0。這里是循環的起點。
	for(i=0; i<2; i++)
		pDecodedPath[0][i]=0;
	
	for(i=0; i<nCodedLen; i+=conv_parm.nOutc)
	{
		nReceiveC=0;
		for(j=0; j<conv_parm.nOutc; j++)
		{
			nReceiveC<<=1;
			nReceiveC+=(int)(pCoded[i+j]);
		}

		memset(pTempDecodedStates,-1,nStateNum*4*sizeof(int));
		for(nStateCounterWI=0; nStateCounterWI<nStateNumWI; nStateCounterWI++)
		{
			nStateCounter=nStateCounterWI%nStateNum;
			//如果當前狀態所處的位置上,誤差距離全是負數,就是不可到達當前狀態,
			//則不做新的目標誤差距離的生成。
			if(pDecodedPath[nDecodedCounter][nStateCounter*2]==-1)
			{
				continue;
			}
			else
			{
				nNextState=nStateCounterWI>>1;
				//conv_parm.pStateTable[nStateCounterWI][1]是輸出
				//比較接收與conv_parm.pStateTable[nStateCounterWI][1],得到下一狀態上的距離。
				nDistance=Get_Distance_Char(conv_parm.pStateTable[nStateCounterWI][1],	nReceiveC);

				//寫下一狀態的幾個值:距離,輸入,來自的狀態

				//距離寫在2整數倍的位置上。
				nNewDistance=pDecodedPath[nDecodedCounter][nStateCounter*2]+nDistance;
				pTempDecodedStates[nNextState*4+2*(nStateCounterWI%2)]=nNewDistance;
				//輸入和來自的狀態合并之后寫在2n+1的位置上。
				pTempDecodedStates[nNextState*4+2*(nStateCounterWI%2)+1]=(nStateCounterWI/nStateNum)<<24;
				//來自的狀態
				pTempDecodedStates[nNextState*4+2*(nStateCounterWI%2)+1]+=nStateCounter;
			}

			//判斷最小距離,把最小距離點的參數覆蓋到最短路徑上。
			if((pTempDecodedStates[nNextState*4+2]>=0) &&
				(pTempDecodedStates[nNextState*4+2]<pTempDecodedStates[nNextState*4]))
			{
				pDecodedPath[nDecodedCounter+1][nNextState*2]=
					pTempDecodedStates[nNextState*4+2];
				pDecodedPath[nDecodedCounter+1][nNextState*2+1]=
					pTempDecodedStates[nNextState*4+3];
			}
			else
			{
				pDecodedPath[nDecodedCounter+1][nNextState*2]=
					pTempDecodedStates[nNextState*4];
				pDecodedPath[nDecodedCounter+1][nNextState*2+1]=
					pTempDecodedStates[nNextState*4+1];
			}
		}
		nDecodedCounter++;
		if(nDecodedCounter%20000==0)
			printf(".");
	}
	nRealDecodedNum=nDecodedCounter;
	//從最后一個點的狀態開始,選擇最小距離
	nMinDistance=pDecodedPath[nDecodedCounter][0];
	nMinDistanceState=0;
	for(nStateCounter=0; nStateCounter<nStateNum; nStateCounter++)
	{
		nDistance=pDecodedPath[nDecodedCounter][nStateCounter*2];
		if((nDistance>0) && (nMinDistance>nDistance))
		{
			nMinDistance=nDistance;
			nMinDistanceState=nStateCounter;
		}
	}
	//選出最小距離之后,根據路徑,倒推整個輸入
	for(i=nRealDecodedNum; i>0; i--)
	{
		pDecoded[i-1]=(pDecodedPath[i][nMinDistanceState*2+1])>>24;
		nMinDistanceState=pDecodedPath[i][nMinDistanceState*2+1]%0x1000000;
	}
	printf(" Done\n");
	free2(pDecodedPath,nDecodedNum,nStateNum*2);
	free(pTempDecodedStates);
	return nRealDecodedNum;
}
//private
//本私有方法僅用于簡化main函數,不可被外部函數調用
static void Initate_Conv_Parm(CONV_PARM* conv_parm)
{
	conv_parm[0].nOutc=2;
	conv_parm[0].nDelayNum=8;
	conv_parm[0].G=(int*)malloc(conv_parm[0].nOutc*sizeof(double));
	conv_parm[0].pStateTable=(int**)malloc2(1<<(conv_parm[0].nDelayNum+1),3,sizeof(double));
	conv_parm[0].G[0]=0561;
	conv_parm[0].G[1]=0753;
	Gen_Conv_Table(conv_parm);

	conv_parm[1].nOutc=3;
	conv_parm[1].nDelayNum=8;
	conv_parm[1].G=(int*)malloc(conv_parm[1].nOutc*sizeof(double));
	conv_parm[1].pStateTable=(int**)malloc2(1<<(conv_parm[1].nDelayNum+1),3,sizeof(double));
	conv_parm[1].G[0]=0557;
	conv_parm[1].G[1]=0663;
	conv_parm[1].G[2]=0711;
	Gen_Conv_Table(conv_parm+1);
}

void main()
{
	int i=0;
	int nSrc=15;
	CONV_PARM conv_parm[2];
	double *pSrc=NULL;
	double *pOut=NULL;
	double *pDecoded=NULL;
	DWORD  time=0;

	int nOut=0;
	int nDecoded=0;
	int nBitError=0;

	time=GetTickCount();

	//內部私有方法:初始化卷積碼編碼器參數
	Initate_Conv_Parm(conv_parm);

	//目前使用的都是conv_parm[0];
	pSrc=(double*)malloc(nSrc*sizeof(double));
	pOut=(double*)malloc(((nSrc+20)*conv_parm[0].nOutc)*sizeof(double));
	pDecoded=(double*)malloc((nSrc+20)*sizeof(double));
	
	printf("Source Number:\t%d \n",nSrc);
	//產生信源
	randB_vec(pSrc,nSrc);

	//卷積碼編碼
	nOut=Conv_Encode(pSrc, nSrc, pOut, conv_parm[0]);

	for (i=0; i<nSrc; i++)
	{
		printf("%d,%d,%d\n",(int)pSrc[i],(int)pOut[i*2+1],(int)pOut[i*2]);//輸出高位在前
	}

	//卷積碼硬判解碼
	nDecoded=Conv_Decode(pOut, nOut, pDecoded, conv_parm[0]);

	//錯誤檢查
	for(i=0; i<nSrc; i++)
	{
		if((int)pSrc[i]!=(int)pDecoded[i])
			nBitError++;
	}

	time=GetTickCount()-time;
	printf("\nTime Used:\t%.3f s\nErrors:\t\t%d bits\n",time*0.001,nBitError);

	free(pSrc);
	free(pOut);
	free(pDecoded);

	free(conv_parm[0].G);
	free(conv_parm[1].G);

	free2(conv_parm[0].pStateTable,(1<<(conv_parm[0].nDelayNum+1)),3);
	free2(conv_parm[1].pStateTable,(1<<(conv_parm[1].nDelayNum+1)),3);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品日日鲁夜夜添| 久久综合久久综合亚洲| 精品国产精品网麻豆系列| 国产精品麻豆视频| 久色婷婷小香蕉久久| 色婷婷狠狠综合| 国产日韩综合av| 日韩和欧美一区二区| 91精品91久久久中77777| 国产日韩成人精品| 另类的小说在线视频另类成人小视频在线| 春色校园综合激情亚洲| 精品福利一区二区三区| 日本系列欧美系列| 欧美性猛交xxxx黑人交| 亚洲欧洲99久久| 国产成人在线网站| 精品国产自在久精品国产| 日本午夜一区二区| 制服丝袜亚洲播放| 亚洲成人av一区二区三区| 91在线视频官网| 亚洲图片欧美激情| av电影一区二区| 中文字幕在线视频一区| 福利电影一区二区| 亚洲国产激情av| 国产1区2区3区精品美女| 国产色爱av资源综合区| 精品写真视频在线观看| 91精品国产综合久久精品图片| 亚洲国产成人91porn| 在线观看中文字幕不卡| 亚洲亚洲人成综合网络| 欧美在线视频全部完| 香蕉久久夜色精品国产使用方法| 欧美中文字幕一区二区三区亚洲 | 午夜影视日本亚洲欧洲精品| 91老司机福利 在线| 亚洲自拍欧美精品| 欧美三片在线视频观看 | 51久久夜色精品国产麻豆| 午夜精品久久久久久久久久久 | 欧美三级视频在线| 日韩av一区二区三区四区| 91精品国产欧美一区二区成人| 日韩高清在线电影| 精品国产电影一区二区| 国产激情精品久久久第一区二区| 中文字幕第一区综合| 色综合天天综合网国产成人综合天 | 亚洲精品在线免费播放| 国产风韵犹存在线视精品| 亚洲欧洲日韩女同| 欧美日韩在线播| 国产真实乱对白精彩久久| 国产女人水真多18毛片18精品视频 | 亚洲成人av免费| 亚洲精品一区二区三区香蕉 | 国产精品三级在线观看| 色偷偷久久人人79超碰人人澡| 亚洲国产中文字幕在线视频综合 | 欧美亚日韩国产aⅴ精品中极品| 五月激情综合网| 国产亚洲制服色| 91黄色免费版| 国产一区二区三区日韩| 最新日韩av在线| 日韩精品一区二区三区视频 | 国产在线播精品第三| 亚洲欧洲精品一区二区三区| 欧美日本一区二区三区| 国v精品久久久网| 亚洲国产综合色| 国产区在线观看成人精品| 欧美熟乱第一页| 欧美日韩国产片| 成人伦理片在线| 美女被吸乳得到大胸91| 国产精品理论片在线观看| 欧美一区二区三区四区五区| 不卡的av网站| 精品亚洲国产成人av制服丝袜| 一区二区三区国产精品| 久久免费国产精品| 91麻豆精品国产自产在线| 成人高清在线视频| 精品一二三四区| 日韩精品亚洲一区| 亚洲影院理伦片| 国产精品久久99| 久久一留热品黄| 欧美一区在线视频| 日本高清无吗v一区| 成人激情小说网站| 国产在线乱码一区二区三区| 亚洲大片精品永久免费| 一区二区在线看| 国产精品成人免费精品自在线观看| 日韩精品一区二区三区三区免费| 欧美性生活影院| 色欲综合视频天天天| 99精品国产视频| 成人三级在线视频| 粉嫩aⅴ一区二区三区四区五区| 久久福利资源站| 老司机午夜精品99久久| 日本aⅴ亚洲精品中文乱码| 亚洲成人自拍一区| 午夜免费久久看| 亚洲国产另类av| 午夜视频在线观看一区| 夜夜嗨av一区二区三区中文字幕 | 欧美日韩成人一区| 欧美另类z0zxhd电影| 欧美日本一道本| 8x8x8国产精品| 欧美高清hd18日本| 日韩欧美一级二级| 精品日韩av一区二区| 欧美精品一区视频| 久久久精品影视| 国产精品久久久久久一区二区三区| 中文字幕乱码亚洲精品一区| 国产精品久久久久久久久免费丝袜| 国产精品美女www爽爽爽| 国产精品国产三级国产a | 中文字幕不卡的av| 国产精品天美传媒沈樵| 亚洲女人小视频在线观看| 一区二区三区**美女毛片| 亚洲福利视频导航| 老司机精品视频导航| 成人在线综合网站| 91免费观看在线| 在线观看91av| 久久久99久久精品欧美| 国产日产欧美精品一区二区三区| 国产精品久久久久aaaa| 亚洲国产精品一区二区久久恐怖片 | 国产成人亚洲综合a∨婷婷| 日韩午夜激情免费电影| 久久综合色一综合色88| 国产精品不卡在线观看| 亚洲va韩国va欧美va精品| 国产在线观看一区二区| www.成人网.com| 国产高清一区日本| av在线免费不卡| 欧美福利视频一区| 国产欧美日韩麻豆91| 亚洲一区视频在线观看视频| 韩国女主播一区| 在线精品亚洲一区二区不卡| 欧美电影免费观看高清完整版在线观看 | 亚洲精品自拍动漫在线| 全国精品久久少妇| 91玉足脚交白嫩脚丫在线播放| 9191国产精品| 中文字幕av不卡| 蜜臀国产一区二区三区在线播放| av在线不卡网| 26uuu欧美| 亚洲高清久久久| av在线不卡电影| 精品久久久久一区| 亚洲综合色区另类av| 国产成人免费9x9x人网站视频| 欧美色视频在线观看| 国产精品久线在线观看| 精品一区中文字幕| 欧美日韩大陆在线| 亚洲另类春色校园小说| 懂色av中文字幕一区二区三区| 欧美日韩精品久久久| 亚洲桃色在线一区| 国产成人精品影院| 日韩色视频在线观看| 亚洲成人综合在线| 欧美最新大片在线看| 最新久久zyz资源站| 岛国一区二区三区| 久久伊99综合婷婷久久伊| 免费在线看成人av| 欧美日韩激情在线| 亚洲精品va在线观看| av电影天堂一区二区在线| 国产亚洲精品资源在线26u| 久久国产精品区| 欧美一级理论片| 日韩精品一卡二卡三卡四卡无卡| 欧美亚洲国产bt| 一区二区三区精品久久久| 日本高清视频一区二区| 亚洲精品免费在线观看| 91视频免费播放| 亚洲你懂的在线视频| 欧美在线免费观看视频| 亚洲自拍偷拍图区| 欧美挠脚心视频网站|