📄 erjinzhi.txt
字号:
HDB3码即三阶高密度双极性码。一、编码规则:
1 先将消息代码变换成AMI码,若AMI码中连0的个数小于4,此时的AMI码就是HDB3码;
2 若AMI码中连0的个数大于4,则将每4个连0小段的第4个0变换成与前一个非0符号(+1或-1)同极性的符号,用表示(+1+,-1-);
3 为了不破坏极性交替反转,当相邻符号之间有偶数个非0符号时,再将该小段的第1个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码的特点:
1 由HDB3码确定的基带信号无直流分量,且只有很小的低频分量;
2 HDB3中连0串的数目至多为3个,易于提取定时信号。
3 编码规则复杂,但译码较简单。
三、解码规则
1从收到的符号序列中找到破坏极性交替的点,可以断定符号及其前面的3个符号必是连0符号,从而恢复4个连码;
2再将所有的-1变换成+1后,就可以得到原消息代码==================================================*/
/* HDB3编码 在c盘创建文本文档 hjout.txt 写入+-10随机码*/
#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判断,系统会自己创建hjin.txt*/
{
printf("wo kao !!! da bu kai !!!\n");
getch();
exit(0);
}
/* ---------------以上是前期的准备工作--------------*/
/* 利用一个足够大数组暂时保存解码后的码 确定不再对其修改后
把结果写入文本文档具体办法 就是 读文件 和 写入文件 不同步
设置一个10位的字符型数组 要从数组写入文本的码和要写入数组的码之间
相隔三位以上 这样可保证 写入文本的码 不会再对其修改
对于直接在文本中修改码 目前以我的水平是做不到的 */
/* 需要设置 n控制1的+-号 */
/* 相邻符号若相同 后一个是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 ;
/*首先要判断 数组所有的数字是否都写入文本中 循环从数组中读取数字*/
if(k==0&&i<8) ; /* 只运行8次*/
else { fprintf(fpout,"%d",a[j]);
a[j]=8 ;
j++; k=1;}
/* 此if 可能存在问题 没找到 理论上i<4就是可以的 但是却得不到正确结果 */
/*a[j]=8的目的是 设置一个停止写入文本的条件*/
if(i==10)i=0 ;
/* 循环控制 写入数组数据 防止溢出 i++=9已经写满数组所以此时 i=10*/
s=fgetc(fpin);
/* 和while一起构建循环结构 fgetc读取一个字符后 指针后后移一位
所以只需再次 赋值给s 若没有这句 会死循环 强烈注意
程序会迅速的向硬盘中写数据*/
}
while(a[j]!=8)
{
fprintf(fpout,"%d",a[j]);
j++;
if(j==10)j=0 ;
}
/* 由于是滞后向文本中写数据 ,当上边的循环结束后 还有一些数据在数组中
未写入文本中。 再次利用循环结构写入文本直到遇到8 读取数组中数据时
读到a[9]时要 再次从a[0]开始读取。 */
fclose(fpin);
fclose(fpout);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -