?? erjinzhi.txt
字號:
HDB3碼即三階高密度雙極性碼。一、編碼規(guī)則:
1 先將消息代碼變換成AMI碼,若AMI碼中連0的個(gè)數(shù)小于4,此時(shí)的AMI碼就是HDB3碼;
2 若AMI碼中連0的個(gè)數(shù)大于4,則將每4個(gè)連0小段的第4個(gè)0變換成與前一個(gè)非0符號(+1或-1)同極性的符號,用表示(+1+,-1-);
3 為了不破壞極性交替反轉(zhuǎn),當(dāng)相鄰符號之間有偶數(shù)個(gè)非0符號時(shí),再將該小段的第1個(gè)0變換成+或-,符號的極性與前一非符號的相反,并讓后面的非零符號從符號開始再交替變化。
例如:
消息代碼:1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1
AMI碼: +1 0 0 0 0 -1 0 0 0 0 +1 -1 0 0 0 0 +1 -1
HDB3碼:+1 0 0 0 + -1 0 0 0 - +1 -1 + 0 0 + -1 +1
二、HDB3碼的特點(diǎn):
1 由HDB3碼確定的基帶信號無直流分量,且只有很小的低頻分量;
2 HDB3中連0串的數(shù)目至多為3個(gè),易于提取定時(shí)信號。
3 編碼規(guī)則復(fù)雜,但譯碼較簡單。
三、解碼規(guī)則
1從收到的符號序列中找到破壞極性交替的點(diǎn),可以斷定符號及其前面的3個(gè)符號必是連0符號,從而恢復(fù)4個(gè)連碼;
2再將所有的-1變換成+1后,就可以得到原消息代碼==================================================*/
/* HDB3編碼 在c盤創(chuàng)建文本文檔 hjout.txt 寫入+-10隨機(jī)碼*/
#include "stdio.h"
#include "conio.h"
#include "math.h"
main()
{
char s ;
int a[10]={8,8,8,8,8,8,8,8,8,8};
/*a[10]={8}不好用?*/
int n=3,i=0,j=0 ,k=0;
FILE*fpin,*fpout ;
/*打開待讀文件*/
fpin=fopen("C:\\hjout.txt","r");
if((fpin=fopen("C:\\hjout.txt","r"))==NULL)
{
printf("wo kao !!! da bu kai !!!\n");
getch();
exit(0);
}
/*打開待寫文件*/
fpout=fopen("C:\\hjin.txt","w");
if((fpout=fopen("C:\\hjin.txt","w"))==NULL)
/*可不用寫if判斷,系統(tǒng)會(huì)自己創(chuàng)建hjin.txt*/
{
printf("wo kao !!! da bu kai !!!\n");
getch();
exit(0);
}
/* ---------------以上是前期的準(zhǔn)備工作--------------*/
/* 利用一個(gè)足夠大數(shù)組暫時(shí)保存解碼后的碼 確定不再對其修改后
把結(jié)果寫入文本文檔具體辦法 就是 讀文件 和 寫入文件 不同步
設(shè)置一個(gè)10位的字符型數(shù)組 要從數(shù)組寫入文本的碼和要寫入數(shù)組的碼之間
相隔三位以上 這樣可保證 寫入文本的碼 不會(huì)再對其修改
對于直接在文本中修改碼 目前以我的水平是做不到的 */
/* 需要設(shè)置 n控制1的+-號 */
/* 相鄰符號若相同 后一個(gè)是v 指針后退三位 a[i-3]='0'; 不管是不是b */
s=fgetc(fpin);
while(s!=EOF)
{
/*----------------------------------------------------------*/
if(s=='0') { a[i]=0; i++;} /* 對0的解碼 */
if(s=='-') { a[i]=1;
if(n==0) {if(i-3<0) a[i+7]=0;else a[i-3]=0;a[i]=0;}
n=0;i++;s=fgetc(fpin);}
if(s=='+') { a[i]=1;
if(n==1) {if(i-3<0) a[i+7]=0;else a[i-3]=0; a[i]=0;}
n=1;i++;s=fgetc(fpin);}
/*----------------------------------------------------------*/
if(j==10)j=0 ;
/*首先要判斷 數(shù)組所有的數(shù)字是否都寫入文本中 循環(huán)從數(shù)組中讀取數(shù)字*/
if(k==0&&i<8) ; /* 只運(yùn)行8次*/
else { fprintf(fpout,"%d",a[j]);
a[j]=8 ;
j++; k=1;}
/* 此if 可能存在問題 沒找到 理論上i<4就是可以的 但是卻得不到正確結(jié)果 */
/*a[j]=8的目的是 設(shè)置一個(gè)停止寫入文本的條件*/
if(i==10)i=0 ;
/* 循環(huán)控制 寫入數(shù)組數(shù)據(jù) 防止溢出 i++=9已經(jīng)寫滿數(shù)組所以此時(shí) i=10*/
s=fgetc(fpin);
/* 和while一起構(gòu)建循環(huán)結(jié)構(gòu) fgetc讀取一個(gè)字符后 指針后后移一位
所以只需再次 賦值給s 若沒有這句 會(huì)死循環(huán) 強(qiáng)烈注意
程序會(huì)迅速的向硬盤中寫數(shù)據(jù)*/
}
while(a[j]!=8)
{
fprintf(fpout,"%d",a[j]);
j++;
if(j==10)j=0 ;
}
/* 由于是滯后向文本中寫數(shù)據(jù) ,當(dāng)上邊的循環(huán)結(jié)束后 還有一些數(shù)據(jù)在數(shù)組中
未寫入文本中。 再次利用循環(huán)結(jié)構(gòu)寫入文本直到遇到8 讀取數(shù)組中數(shù)據(jù)時(shí)
讀到a[9]時(shí)要 再次從a[0]開始讀取。 */
fclose(fpin);
fclose(fpout);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -